怕大家不清楚情况,写的比较多,请尽量看完。我现在学习做一个网站,其中有一个网页是负责对用户进行权限设置。在这个网页里,我用Gridview显示用户信息,第一列是用户ID,第二列是用户姓名,这2列都是绑定的数据库里用户表的字段。
第3,4,5,6列分别对应用户的4个权限,用CheckBox显示,有这个权限则CheckBox选上,否则不选。在数据库中对应权限的字段是一个字符串,字符串第一位对应第一个权限,若为1,表示此用户有这个权限,以此类推,若某用户权限字段为“1111”表明他四个权限都有,那么查询出他的信息后,他的4个CheckBox都会选上。我现在想实现的功能是,查询并显示所有的用户权限后,通过点击CheckBox更改某些用户的权限,然后点保存,保存所有修改的结果。我不知道想完成这个功能,正统的方法怎么做。我自己想了一个办法,就是管理员每点击一次CheckBox,就把他点击的那行的用户ID和权限记录下来,放到List里,形式如下:“001@1101”,001是用户ID,1101是点击后他的权限,中间用@分开,加到List里,以此类推,若一个用户点了2次,则最新的替换旧的,等修改完毕后,一点保存,就把List里所有的记录更新到数据库。我在CheckedChanged事件中往List里添加信息
目前出现的问题是:若List在CheckedChanged事件中定义,则每次点击,List都重新定义、生成,List中永远只有一条记录。若List在网页类中定义,则每次点击,List都重新定义、生成,List中永远只有一条记录。
我感觉这种情况是CheckBox的AutoPostBack属性导致的,但若CheckBox的AutoPostBack属性不是真,则不触发CheckedChanged事件。我想到几种方法,一个是List定义为static型,一个是List放到Session里,但总感觉是野路子,不正规。
请问:
1:要实现我这个功能,有没有更好的思路?
2:若就按我的思路做,该怎么做?
3,难道 Asp+C# 就没法象C那样定义一个此页面一打开就存在,一关闭就销毁的全局变量?

解决方案 »

  1.   

    1、我觉得可以不用设置AutoPostBack和CheckedChanged事件,让用户选个够,当用户点保存时,再在后台把4个checkbox找出来,拼接字符串,保存到数据库2、按你的思路做,用ViewState来存储,就没问题了    Private Property RightList() As String
            Get
                Return ViewState("RightList")
            End Get
            Set(ByVal value As String)
                ViewState("RightList") = value
            End Set
        End Property3、ViewState,生命周期跟随页面。范围就是在类里
      

  2.   

    谢谢帮忙。1,要不记录的话,怎么知道用户修改了哪个?都重新写一遍数据库吗?用户可能有几千,而操作员只修改了几个。
    2,我用的vs2008学习版,用的语言是C#,你那个好像是VB?  C#里有ViewState吗??
      

  3.   

    根本不用保存到什么list中呀,
    你点保存时判断哪些checkbox选了就相应的更新数据库就是
      

  4.   

    我用的是vb.net,c#也一样,都可以用ViewState不记录的话,也不用所有记录都重新写一遍到数据库的
    在用户点更新的那个事件里,可以获取到用户点击的是哪一行的,根据那一行的用户id字段,只更新那一个用户的权限就可以了
      

  5.   

    VB?  不会VB
      帮你再顶一下吧
      

  6.   

    权限字段 存储的最好为 1,1,1,1 这样取的时候 容易转化为集合思路是这样的  让生成的html 代码为下面的形式<table>
    <tr>
    <td>
    ID
    </td>
    <td>
    Name
    </td>
    <td>
    checkbox 权限一
    checkbox 权限二
    checkbox 权限三
    checkbox 权限四
    </td>
    <td>
    hidden id hidOld 存储的值为 权限字段存储的值 1,1,1,1
    hidden id hidNew 存储的值为 权限字段的新值, 根据同行的checkbox 的选择情况改变的
    </td>
    </tr>
    </table> 写一段 js 功能是 在 checkbox  被改变的时候 将同行的 checkbox 的值都取出来 存储在 hidNew  中点保存的时候 遍历 Gridview 的行, 判断 hidOld 与 hidNew  值 是否一致不一致的话,更新数据库
      

  7.   

    点击checkbox,实现选择,再遍历gridview,查村checkbox获取选择的值,根据主键实现权限更新
     foreach (GridViewRow gr in this.gvNews.Rows)
                {
                    if (((CheckBox)gr.FindControl("CheckBox1")).Checked)
                       {}
                 )
    也可使用隐藏域实现保存
    <asp:TemplateColumn HeaderText="">
    <HeaderStyle Font-Bold="True" Width="8%"></HeaderStyle>
    <ItemTemplate><input type="checkbox" runat="server" id="chkSelect" onclick="AddValues(this)"  value='<%#DataBinder.Eval(Container.DataItem,"BH")%>' title='<%#DataBinder.Eval(Container.DataItem,"BH")%>' NAME="chkSelect"/>
    </ItemTemplate>
    </asp:TemplateColumn>
    function AddValues(oChk) { 
    if(oChk.checked)
    {
     var z=oChk.title;
      Form1.Hf.value += "," + oChk.value; 
      }
    else
    {
      var z=oChk.title;
      Form1.Hf.value = Form1.Hd.value.replace("," + oChk.value,"");  
     }
    }
      

  8.   


    if (((CheckBox)gr.FindControl("CheckBox1")).Checked)
    这句什么意思?是checkbox被选上了还是被改变了?只是被选上了可不行
      

  9.   

    如果你的保存按钮是在GridView外面,那么你可以保存的时候遍历GridView去找每一行,一个一个在循环中保存,另外一种方式,你用GridView的编辑模板,在RowUpdating事件里去寻找你的CheckBox并判断是否选中,保存,还有一种方式不用编辑模板,你在itemtemplate模板里放个保存按钮,单击保存的时候触发RowCommnd事件,你在这事件里也能去找CheckBox,再保存,