寒假因为疫情不能出去,在家闲着没事想破解下邻居WiFi又没有合适的字典,有些字典生成器功能是全面但有些需求无法实现,大一简单学了下C#,索性自己就用winform编写个字典生成器,但因为对winform了解的不是很透彻,难免会走很多弯路,接下来就把其中一个问题及其解决方案分享给大家,也算是给自己做个笔记。
需求
有一个需求是要根据用户在输入框中输入的值,来动态的显示/隐藏一定数量的单选按钮,单选按钮排列在panel框架中。如下图:
解决方案一
笨方法,不推荐
因为对winform并不是多精通,一开始想的是用switch来根据输入框中获取的值来一个一个改变单选按钮(RadioButton)的Visible属性,如下面代码所示:
private void text1_TextChanged(object sender, EventArgs e)
{
int n;
try
{
n = int.Parse(text1.Text);
}
catch
{
n = 0;
}
switch(n)
{
case 1:
RadioButtun1.Visible = true;
RadioButtun2.Visible = false;
RadioButtun3.Visible = false;
...
break;
case 2:
RadioButtun1.Visible = true;
RadioButtun2.Visible = true;
RadioButtun3.Visible = false;
...
break;
...
}
}
这样写的确可以满足需求,但是实在太笨了,并且我的界面里有13个单选按钮,每一种情况都要写大量的重复代码太费事费力,也不符合简洁、高效的编程思想,只是提供一种解决问题的思路。后来查阅资料后有了更加合理的解决方案,请看解决方案二。
解决方案二
查阅资料了解到了winform中的Control用法,可以批量控制窗体中的控件。
所以解决方法是:用Control来遍历panel中的所有单选按钮(RadioButtun),用一个变量i来获取RadioButtun中的Text内容,再通过一个if语句来控制哪些单选按钮显示,哪些需要隐藏。
最后代码如下:
private void text1_TextChanged(object sender, EventArgs e)
{
int n,i;
try
{
n = int.Parse(text1.Text);
}
catch
{
n = 0;
}
foreach (Control control in this.panel1.Controls)
{
i = int.Parse(control.Text);
if (control is RadioButton)
{
if (i<=n)
{
control.Visible = true;
}
else
{
control.Visible = false;
}
}
}
}
最后结果如下:
这样就用很简洁的代码实现了想要的功能,当然肯定还有其他的方法,大家也可以在下面讨论。
小记: 在将输入框中的字符串转换成int类型时,一定要用try对异常情况进行处理,否则当用户将输入框中的内容清空时VS会报错。
总结
在这个示例中,也可以通过改变代码来控制其他的控件或实现其他的功能。在大学里学到的知识毕竟有限,由于对各种语言学习的不透彻导致弯路不断,所以查阅资料的能力很关键,可以有效地帮助我们解决问题,当然编程最重要的还是多写多练,没有什么捷径。这也是我第一次在CSDN上写文章,难免会有不足之处,还请大家多多指教。最后祝大家新年快乐!身体健康!