你所有的操作都是在组织一个字符串当然不行了.
试试下面的代码
DataTable dtPer = GetUserPermission(frmLogin.userName);

foreach(Control ctl in this.Controls)
{
for(int i = 0; i < dtPer.Rows.Count; i++)
{
if(ctl.Name == dtPer.Rows[i][1].ToString())
{
ctl.Enabled = false;
}
}
}

解决方案 »

  1.   

    这样可以解决你的问题:
    DataTable dtPer = GetUserPermission(frmLogin.userName);
    bool flag = false;
    for(int i = 0; i < dtPer.Rows.Count; i++)
    {
        string permission = dtPer.Rows[i][1].ToString();
        object obj=this.GetType().GetField(permission ).GetValue(this);
        if (obj !=null)
        {
    Button bt=obj as Button;
    bt.Enabled = flag ;
        }
    }
      

  2.   

    谢谢 RockyZhang(Rocky) !!明白您的意思了!现在还有一个小问题。
    原来的for(int i = 0; i < dtPer.Rows.Count; i++)
    循环的是DataTable的行数和,这里要换成所有控件的数量和。怎么得到界面上所有控件的数量呢?
      

  3.   

    up一下,RockyZhang(Rocky) 对头
      

  4.   

    SomeForm.Controls.Count如果是本FORM内部的话,用
    this.Controls.Count
      

  5.   

    你需要对SomeForm.Controls循环来取得:
    foreach (Control c in SomeForm.Controls)
    {
           c.GetType().Name 
    }
      

  6.   

    foreach(Control  ctl in this.Controls) //this can be form object
    {
    if(ctl is TextBox)
    {
    //do something
    } }
      

  7.   

    感谢 lyvvvv(lyvvvv) 。您的代码也是没问题的。可是,DataTable中的控件数量的总行数是比界面中的控件数量少的。出现空引用的问题,怎么得到界面中控件的总数呢?
      

  8.   

    界面控件数量:this.Controls.Count
      

  9.   

    this.Controls.Count,能得到控件的总数量。可是没把所有下拉菜单中的按钮统计在内。怎么能解决这个问题呢?
      

  10.   

    int c = this.menuBar.Buttons.Count + this.Controls.Count + this.....没有下拉菜单中按钮数量的Count。其实这是个固定的数,自己数一下也可以。但还是想寻找、学习一下解决办法。感谢各位!
      

  11.   

    我上面的代码可以再改一改:
    object obj=this.GetType().GetField("button1").GetValue(this);
    if (obj !=null)
    {
    if(obj  as System.Windows.Forms.Control)
    {
    Control ctl=obj as Control;
    ctl.Enabled = false;
    }
    else if(obj as System.Windows.Forms.MenuItem)
    {
    MenuItem mnu=obj as MenuItem;
    mnu.Visible = false;
    }
    }
      

  12.   

    上面写错了,抱歉!
    DataTable dtPer = GetUserPermission(frmLogin.userName);
    bool flag = false;
    for(int i = 0; i < dtPer.Rows.Count; i++)
    {
    string permission = dtPer.Rows[i][1].ToString();
    object obj=this.GetType().GetField(permission ).GetValue(this);
    if(obj  as System.Windows.Forms.Control)
    {
    Control ctl=obj as Control;
    ctl.Enabled = false;
    }
    else if(obj as System.Windows.Forms.MenuItem)
    {
    MenuItem mnu=obj as MenuItem;
    mnu.Visible = false;
    }
    }
      

  13.   

    我又改了一下。判断时转换了一下类型。
    if(Convert.ToBoolean(obj  as System.Windows.Forms.Control))else if(Convert.ToBoolean(obj as System.Windows.Forms.MenuItem))其他没变。编译动过了,可运行到
    object obj=this.GetType().GetField(permission ).GetValue(this);的时候,报错:
    {"未将对象引用设置到对象的实例。" } System.NullReferenceException
      

  14.   

    其实就是权限管理里面实现的一个功能。如果表里对应的有这个空间名称的话,那个登陆后该控件的Enabled属性就false.在帮忙想想。lyvvvv(lyvvvv) 的代码对我帮助很大。谢谢!
      

  15.   

    应该是permission 这里的问题.
      

  16.   

    设断点察看Permission里的值和界面里的控件名称是一致的。可报:"未将对象引用设置到对象的实例。" 的错误提示.
      

  17.   


    从Form.Controls中只能获得控件的容器就是Form的控件,其他panel中的控件你得不到, 但可以使用递归法,得到Control.Controls的所有控件,请注意 ,MenuItem,和ToolBarButton还是得不到.其他问题,参考你的贴http://community.csdn.net/Expert/topic/3738/3738857.xml?temp=.3866388以下这个是获得窗口中所有控件的方法,包括MenuItem,ToolBarButton,Panel中的子控件public static System.Collections.ArrayList GetChildControls(System.Windows.Forms.Control ctrl )
    {
      System.Collections.ArrayList list=new System.Collections.ArrayList ();
      Type tp=ctrl.GetType ();
      MemberInfo [] members=tp.GetMembers (BindingFlags.Public | BindingFlags.NonPublic |   
                  BindingFlags.Instance | BindingFlags.Static );
      foreach (MemberInfo mbm in members)
       {
        object o=tp.InvokeMember (mbm.Name ,BindingFlags.Public | BindingFlags.NonPublic | 
                      BindingFlags.Instance | BindingFlags.Static 
                     | BindingFlags.GetProperty | BindingFlags.GetField    ,null,ctrl,null);
           if (o is System.Windows.Forms.Control)
           list.Add (o);
       }
     return list;
    }
      

  18.   

    To: RockyZhang(Rocky) ( ) 信誉:104 
    "你所有的操作都是在组织一个字符串当然不行了."不要误人子弟啊,你用的办法是最笨的
    不要说只操作一个"Enabled"字串,
    用字串创建类,表单,获得程序集中的任一个类,类的成员,执行方法,委托事件,而且无论是公有的还是私有的,有哪样.net做不到的
    你用记事本写一段C#代码,描述窗口对象也好,类对象也好,都可以在在程序运行时完完整整地得到你描述的对象, 不信么?