Activating/Deactivating 个来自配置文件 C# (WinForms) 的按钮

Activating/Deactivating buttons from config file C# (WinForms)

假设我的程序最多有 8 个按钮,我应该能够根据配置文件中的设置切换它们 on/off (visible/hidden)。 然后,我选择的按钮应该在两行(如果超过 4 个)或一行(cnt <= 4)中可见,在它们之间没有间隙。(我的意思是当 1,2,3,4 处于活动状态时,它们将是在第一行中,相同的 1、2、5、8 处于活动状态,因此 5 将取代按钮 3,而 8 将排在第四位)

<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" 键确定哪些按钮可见,然后更改它们的文本 属性 并添加同样从配置文件中获取的特定操作。

 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"]);
     ...
 }

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

你那里的那段代码不好,你正在使用硬编码字符串创建配置名称的依赖关系,这根本不是一个好习惯,如果你可以访问 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];
 }

您可以使用 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
}