从配置文件c# (WinForms)中激活/取消激活按钮
本文关键字:激活 取消 按钮 配置文件 WinForms | 更新日期: 2023-09-27 18:07:00
假设我的程序最多有8个按钮,我应该能够根据配置文件中的设置打开/关闭(可见/隐藏)它们。然后,我选择的按钮应该在表单上的两行(如果超过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"]);
...
}
任何想法如何选择所需的按钮时,表单加载并将它们放置在所需的位置?
你可以使用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
}
那段代码你有不好,你正在创建依赖于配置名称与硬编码字符串,这不是一个很好的做法,如果你可以访问属性。默认情况下,我建议你这样做。
对于按钮的位置,你可以随意改变位置,例如你可以像这样在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];
}