【问题标题】:How to change the properties of controls of a usercontrol at runtime in C#?如何在 C# 运行时更改用户控件的控件属性?
【发布时间】:2018-08-15 01:49:20
【问题描述】:

我是 C# 的新手。

我的应用程序包含主窗体和一些用户控件。 当我开始运行应用程序时,我希望名为“uc_MainMenu”的用户控件显示在主窗体内名为“panel2”的面板中。

uc_MainMenu obj_uc_MainMenu = new uc_MainMenu();

private void frmMain_Load(object sender, EventArgs e)
{
     this.panel2.Controls.Add(obj_uc_MainMenu);
}

有效。

uc_MainMenu 包含几个按钮:btnHeadmaster、btnTeacher、btnStudent、btnAttendance、btnExam 和 btnLogin。 每个按钮的点击都会带来相应的预定义用户控件。

这是我的问题。 我想在表单加载时禁用除 btnLogin 之外的所有按钮。 我该怎么做?

我试过这种方法,但没有用。

foreach (Control ctrl in panel2.Controls)
 {
     if (ctrl.GetType() == typeof(Button))
         {
            ((Button)ctrl).Enabled = false;
         }
  }

我可以在 uc_MainMenu 中更改每个按钮的启用属性,但如果是这样,我必须在切换用户控件时再次更改它们。这就是我在设计用户控件时将其 enabled 属性设置为 true 的原因。

【问题讨论】:

    标签: c# user-controls


    【解决方案1】:

    试试这个:

    foreach (Control ctrl in obj_uc_MainMenu.Controls)
     {
         if (ctrl.GetType() == typeof(Button) && ((Button)ctrl).Name != "btLogin")
             {
                ((Button)ctrl).Enabled = false;
             }
      }
    

    请注意,我将 panel2 更改为 obj_uc_MainMenu。

    【讨论】:

    • 这段代码可以简化:foreach (var btn in obj_uc_MainMenu.Controls.OfType<Button>()) btn.Enabled = btn == btLogin;
    【解决方案2】:

    在用户控件中创建一个属性:

    public bool MyButtonEnabled
    {
        get
        {
            return anyButtonButNo_btLogin.Enabled;
        }
        set
        {
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl.GetType() == typeof(Button) && ((Button)ctrl).Name != "btLogin")
                {
                    ((Button)ctrl).Enabled = value;
                }
            }
        }
    }
    

    现在您可以在用户控件使用的任何地方使用此属性。

    uc_MainMenu obj_uc_MainMenu = new uc_MainMenu();
    
    private void frmMain_Load(object sender, EventArgs e)
    {
         this.panel2.Controls.Add(obj_uc_MainMenu);
    
         ///this property will access the button inside that user control
         obj_uc_MainMenu.MyButtonEnabled=false;
    }
    

    【讨论】:

      【解决方案3】:

      如果您的按钮位于 obj_uc_MainMenu 内,则无法通过 panel.Controls 检索它。如果你想检索它们,你应该使用 obj_uc_MainMenu.Controls。

      不知道你是怎么定义用户控件obj_uc_MainMenu的,那我客你可以这样:

           foreach (Control ctrl in obj_uc_MainMenu.Controls)
              {
                  if (ctrl.GetType() == typeof(Button))
                  {
                      ((Button)ctrl).Enabled = false;
                  }
              }
      

      【讨论】:

        【解决方案4】:

        Find 会找到面板。如果存在,则遍历用户控件以获取类型按钮并修改按钮/s 属性。无需在 foreach 循环中强制转换按钮(我们知道它的类型为 Button)。

        // Get the panel
        var panel2 = Controls.Find("YourPanel", true).FirstOrDefault() as Panel;
        
        // If it exists
        if (panel2 != null)
        {
            foreach (var button in panel2.obj_uc_MainMenu.Controls.OfType<Button>())
            {
                // Set the value of each one
                button.Enabled = false;
            }
        }
        

        【讨论】:

        • 虽然此代码 sn-p 可能会回答作者的问题,但您可能希望通过一些文本和文档链接来扩展您的答案。解释您的代码的作用以及它如何帮助作者解决他/她的问题。
        • 我不知道为什么,但我无法使用 FindControl。它说名称 FindControl 在当前上下文中不存在。
        • 试试 Controls.Find
        猜你喜欢
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 2012-11-02
        • 2021-07-31
        • 1970-01-01
        相关资源
        最近更新 更多