【问题标题】:Using string for control objects使用字符串作为控制对象
【发布时间】:2012-07-06 13:11:19
【问题描述】:

对于我当前的项目,我用“menuStrip”和几个“ToolStripMenuItem”制作了一个 MDIform。 几个按钮和一个 devexpress“NavbarControl”

意图是用户使用用户ID登录 应用程序将获得特定“控件”的数据行 在这一行中,他们是一个布尔值,如果它为 true,则该项目必须可见,否则该项目必须不可见。

Datarow 还包含项目的名称。

所以我使用:

this.Controls[item].Visible = true;

item = string(物品名称)

如果我用它来隐藏菜单条本身,它可以工作 如果我在 MenuStipItems 上尝试它,它会给出一个空引用异常。

我怎样才能控制MenuStip里面的项目,只能通过项目的名字???

代码:

    DataTable dt = GetData();
    foreach (DataRow row in dt.Rows)
    {
        string item = row["ItemNaam"].ToString();
        foreach (string rol in Rollen)
        {
            DataRow dr = GetDataByItemNaam(item);
            if (Convert.ToBoolean(dr[rol]) == true)
            {
                this.Controls[item].Visible = true; //Show Item
            }
        }
    }

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    MenuStrip 控件有它自己的集合。因此,要引用菜单条项,请引用菜单条父项中的项:

    if (this.menuStrip1.Items.ContainsKey(item))
      this.menuStrip1.Items[item].Visible = true;
    

    【讨论】:

    • ok,但在 DevExpress NavBarControl 中也有一些按钮和项目,想要以相同的方式隐藏
    • @BramVdeventer 不熟悉 NavBarControl,但它是相同的概念。您尝试显示和隐藏的项目属于父控件,因此您必须具有对该父控件的引用。
    【解决方案2】:

    我已经解决了这个问题:

    我在foreach 循环中创建了一个foreach 循环,其中 每个循环查找项目的名称,然后在前一个项目中查找项目的名称。 如果名称与给定名称匹配,则将可见性设置为 true。

    这是 2 个级别,我创建了另外两个额外的 foreach 循环以更深入地(inception) 到菜单中的 4 个级别的项目。

    也许它不是正确/最快的方式,但它的工作方式应该如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多