这几天为了这个问题查了很多资料,csdn也翻遍了,还是没有解决;只好来求助了。  
该页面主要为了实现权限设置的功能。  
涉及三个表:  
表1、用户权限表userfunc  
---------------------------  
userid    |  username    |  func  
1              |    usera        &brvbar1,2,3,4  
2              |    userb        &brvbar3,5  
 
表2、一级功能表primaryfunc  
-----------------------------  
funcid        |      funcname  
1                  |    一级功能A  
2                  |    一级功能B  
 
表3、二级功能表  
-----------------------------  
subid      |      subname      |    funcid      |    
1              |  A二级功能1    |          1          |  
2              |  A二级功能2    |          1          |  
3              |  A二级功能3    |          1          |  
4              |  A二级功能4    |          1          |  
5              |  B二级功能1    |          2          |  
6              |  B二级功能2    |          2          |  
 
我利用一个Datagrid嵌套repeater控件,然后在repeater放置checkbox来实现对用户权限的编辑。最终显示出来的页面效果如下:  
 
----------------------------------------------------  
一级功能        |      二级功能  
----------------------------------------------------  
一级功能A      |  checkbox  checkbox  checkbox  checkbox  
一级功能B      |  checkbox  checkbox  
 
现在的问题是,这些checkbox的checked状态无法设置。我定义了一个函数isCheck来检测用户是否具有某项二级功能的权限;函数的两个参数分别是每个checkbox所对应二级功能的id号和特定用户的funcid,如果子功能在funcid中,返回true,否则返回false。  
 
相关代码如下:  
 
<asp:DataGrid  id="DataGrid1"  runat="server"  AutoGenerateColumns="false"  >  
   <Columns>  
     <asp:TemplateColumn  HeaderText="一级功能">  
     <ItemTemplate>  
           <%#  DataBinder.Eval(Container.DataItem,"funcname")  %>  
     </ItemTemplate>  
     </asp:TemplateColumn>  
     <asp:TemplateColumn  HeaderText="二级功能">  
     <ItemTemplate>  
             <asp:repeater  id="childRepeater"  runat="server"  DataSource='<%#  Ctype(Container.DataItem,DataRowView).CreateChildView("RelationName")  %>'>  
                     <itemtemplate>  
                                     <%#  DataBinder.Eval(Container.DataItem,"subname")  %>  
                                                     <asp:checkbox    runat="server"          Checked='<%#  Convert.toBoolean(isCheck(DataBinder.Eval(Container.DataItem,"subid")  ,func))  %>'/>              
<!--func已经通过后台代码根据传递的用户id号码从用户表中获取-->  
                 </ItemTemplate>    
           </asp:Repeater>  
     </ItemTemplate>  
     </asp:TemplateColumn>  
   </Columns>  
</asp:DataGrid>  
 
上面的代码中,checkbox中的Checked='<%#  Convert.toBoolean(isCheck(DataBinder.Eval(Container.DataItem,"subid")  ,func))  %>'显然是错误的,DataBinder.Eval(Container.DataItem,"subid")不能直接作为变量做函数的参数。但是我应该如何设置每个子功能对应checkbox的checked属性呢?

解决方案 »

  1.   

    用户权限表内容是:
    表1、用户权限表userfunc
    ---------------------------
    userid | username | func
    1 | usera |1,2,3,4
    2 | userb |3,5
      

  2.   

    难道这个问题无法解决么?我看了很多datagrid绑定checkbox的例子,可惜都是一列一个checkbox。
      

  3.   

    不用DataGrid嵌套可以吗??用while(dr.Read())做一个循环不是更方便读出吗??
      

  4.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=54F4C732-AAE2-4135-FB1B-7B4B613BAA33http://dotnet.aspx.cc/ShowDetail.aspx?id=149E5DD7-3B32-461e-ACC6-51D1652E6746
      

  5.   

    感谢goody9807,不过http://dotnet.aspx.cc网站上的资料都是主从表,没有涉及checkbox绑定。现在问题的关键是如何设置checkbox的checked属性。
    其实问题可以不涉及到datagrid,就比如一个repeater中绑定不定个数的checkbox,而这个chckbox的属性需要外面的函数来判断true和false,该如何实现。
      

  6.   

    关键是这句
    Checked='<%#  Convert.toBoolean(isCheck(DataBinder.Eval(Container.DataItem,"subid")  ,func))  %>'
    返回值总是为false。而isCheck函数是没有问题的。
      

  7.   

    问题解决了,主要因为<%# Convert.toBoolean(isCheck(DataBinder.Eval(Container.DataItem,"subid") ,func)) %>的函数isCheck的参数问题,第一个参数是DataBinder.Eval(Container.DataItem,"subid")涉及数据库绑定,而第二个func则是变量。真正执行时发现func为空字符串(而如果直接写<%=func%>则可以不是空值,这说明两者不能混用)。所以我把func的获取也写道ischcked函数中,而不是作为参数传递。问题就解决了。