【问题标题】:Activating/Deactivating buttons from config file C# (WinForms)从配置文件 C# (WinForms) 激活/停用按钮
【发布时间】:2015-10-30 14:21:07
【问题描述】:

假设我的程序最多有 8 个按钮,我应该能够根据我在配置文件中的设置打开/关闭(可见/隐藏)它们。 然后,我选择的按钮应该在表单上的两行(如果超过 4 个)或一行(cnt

<add key="butactive" value="1;3;4;8"/>
<add key="but1" value="START"/>
<add key="but2" value="END"/>
<add key="but3" value="PAUSE"/>
<add key="but4" value="RESET"/>
...

程序应该能够从“butactive”键确定哪些按钮是可见的,然后更改它们的 Text 属性并添加也从配置文件中获取的特定操作。

 private void Form2_Load(object sender, EventArgs e)
 {
     radButton1.Text = ConfigurationManager.AppSettings["but1"];
     radButton2.Text = ConfigurationManager.AppSettings["but2"];
     radButton3.Text = ConfigurationManager.AppSettings["but3"];
     radButton4.Text = ConfigurationManager.AppSettings["but4"];
     ...
     radButton1.Click += getAction(ConfigurationManager.AppSettings["but1a"]);
     radButton2.Click += getAction(ConfigurationManager.AppSettings["but2a"]);
     ...
 }

知道如何在表单加载时选择所需的按钮并将它们放置在所需的位置吗?

【问题讨论】:

  • 为什么需要确定1,3,4,8,而你可以在配置文件中管理它后面的标题和功能?我认为您可以设法使用序列按钮而不是随机按钮。
  • 现在我正在考虑它实际上不需要指定按钮 1、4、3、8 等,而只需添加 5 个。主要思想是有 8 个命名按钮, 16 个动作,我会选择使用哪个。只添加我需要的确切数量的按钮及其操作,并在代码 cmets 中的某处添加或写入整个操作列表会更容易。

标签: c# winforms button configuration


【解决方案1】:

您那里的那段代码不好,您正在使用硬编码字符串创建对配置名称的依赖关系,这根本不是一个好习惯,如果您可以访问 Properties.Default 我建议您这样做。

对于按钮位置,您可以随意调整位置,例如,您可以在 windows 窗体中像这样切换按钮 3 和 5 的位置:

radButton5.Position = radButton3.Position

但是这不是一个好方法,我建议您将按钮编号中的依赖关系去掉,例如,您可以创建隐藏的所有按钮并始终显示第一个按钮,方法“ getAction" 将对这种方法有很大帮助,而且实现该行为并不难。

您应该执行的操作的 Scratch(伪代码)如下所示:

 // Get the active buttons from configuration (eg var will be a list of the active buttons names)
 var activeButtons = getActiveButtons();
 var textBoxNumber = 0
 foreach(var button in activeButtons)
 {
    textBoxNumber++;
    TextBox tbx = this.Controls.Find("radButton" + textBoxNumber.ToString(), true).FirstOrDefault() as TextBox;

    if(tbx != null)
       tbx.Text = ConfigurationManager.AppSettings[button];
 }

【讨论】:

    【解决方案2】:

    您可以使用FlowLayoutPanel 作为按钮的容器。如果你的尺寸正确,你需要做的就是设置按钮的可见性,它们会根据你的需要自行排列:

    radButton1.Visible = (bool)ConfigurationManager.AppSettings["butactive1"];
    radButton2.Visible = (boll)ConfigurationManager.AppSettings["butactive2"];
    ...
    

    至于操作,您可以对所有按钮使用相同的事件处理程序,并根据按下的按钮和您定义的操作执行您需要的任何操作:

    radButton1.Click += buttonClickHandler;
    radButton2.Click += buttonClickHandler;
    
    private void buttonClickHandler(object sender, EventArgs e)
    {
        var button = sender as Button;
        var action = getAction(ConfigurationManager.AppSettings[button.Text + "a"];
    
        //Execute whatever you want here based on action
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2020-09-10
      • 2011-05-01
      • 1970-01-01
      • 2013-03-05
      • 2021-02-03
      • 2011-11-12
      • 2014-10-29
      • 2011-07-17
      相关资源
      最近更新 更多