2 kykiske22 KyKiske22 于 2015.05.27 15:28 提问

关于在C# Winform中的方法事件中使用大量if-else问题

winform运行比较顺利,但if-else代码太多 诸如如下情况
实现功能按钮:private void Button_Click(object sender,EventArgs e)
{
if ( listBox1.SelectedIndex==0)
{ a = int.Parse(DataText.Text);listBox1.SelectedIndex = 0; listBox1.Items[0] = "a的值为" + a + " 。"}
else if ( listBox1.SelectedIndex==1)
{ b = int.Parse(DataText.Text);listBox1.SelectedIndex = 1; listBox1.Items[1] = "b的值为" + b + " 。"}
else if ( listBox1.SelectedIndex==2)
{ c = int.Parse(DataText.Text);listBox1.SelectedIndex = 2; listBox1.Items[2] = "c的值为" +c+ " 。"}
...............
}
一共这里有100多个if-else

还有一个滚动条显示数据按钮 也是如此(这个有转换算法)
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
if(richBox1.Text=="a的最大值为100,最小值为0")
{
int data1 = (int)hScrollBar1.Value;int data2 = data1 * 5;TextBox1.Text = data2.ToString();
}
else if(richBox1.Text=="b的最大值为100,最小值为0")
{
int data1 = (int)hScrollBar1.Value;int data2 = data1 /10;TextBox1.Text = data2.ToString();
}
......一共也是100多个

但这样写代码比较冗长。之前看过张子阳的委托,最后还是无法实现要求(看了改写后总是显示最后一个程序)。也用面向对象的建立接口多态写法也写过,但因为控件太多,导致new的对象太多,程序经常卡壳。求大神指点。。。或者给予一个正确的面向对象写法(在控制台里就写成功过,但是在winform里一次也没用面向对象法解决这个问题)。(づ。◕‿‿◕。)づ

4个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.05.27 15:39

这是面向对象没关系。关键在于代码简化
比如

 if ( listBox1.SelectedIndex==0)
{ a = int.Parse(DataText.Text);listBox1.SelectedIndex = 0; listBox1.Items[0] = "a的值为" + a + " 。"}
else if ( listBox1.SelectedIndex==1)
{ b = int.Parse(DataText.Text);listBox1.SelectedIndex = 1; listBox1.Items[1] = "b的值为" + b + " 。"}
可以直接
char c = (char)(listBox1.SelectedIndex+97);
listBox1.Items[listBox1.SelectedIndex] = c + "的值为" + DataText.Text+ " 。"//不过这个字符串中a的值,这个a字符看能不能动态获取。那用Ascii码转,小写a的ascii码是97,里面放吧,反正是写死的。

下面一个if else 也一样改造
danielinbiti
danielinbiti 回复KyKiske22: 利于扩充,if else不利于扩充,而且不易于维护。
2 年多之前 回复
KyKiske22
KyKiske22 回复danielinbiti: 数组啊 可以考虑下para[100]
2 年多之前 回复
danielinbiti
danielinbiti 回复KyKiske22: cat_mast值不是写死的吗,定义到数组里不就行了。
2 年多之前 回复
KyKiske22
KyKiske22 回复danielinbiti: 你说对了,所有的没有任何规律。我在想能不能有更好的写法改善if-else。。。
2 年多之前 回复
danielinbiti
danielinbiti 回复KyKiske22: cat_mast总有出处吧,看这些有没有规律,是不是定值,如果是定值,那就都定义成数组常量。
2 年多之前 回复
KyKiske22
KyKiske22 回复danielinbiti: 实际上abcd等等是个举例,真正的变量是单词形式,诸如“cat_mast、dog_0"等等,一共有100个变量,ListBox一共有110行。
2 年多之前 回复
danielinbiti
danielinbiti 回复KyKiske22: 如果每一个都是特别的,都是没规律的,谁也整不了。只能把有规律的写在一起,对于没规律就接着写if else ,比如if (listBox1.SelectedIndex==110){} else {有规律的}
2 年多之前 回复
KyKiske22
KyKiske22 对了 忘说了,不是所有的listBox1.Items[i]的值为“a的值为多少” 有的是listBox1.Items[110]="无,为空" 等等情况
2 年多之前 回复
danielinbiti
danielinbiti 回复KyKiske22: Button_Click肯定是单击一次就生效吧。所以这里变量也就一个够了吧,不至于用26个字母变量吧。如果是26个,那建议定义一个26维大小的一维数组,用数组的记录a,b,c的值。这样代码也能精简
2 年多之前 回复
KyKiske22
KyKiske22 这个a、b指的是参数。事实上每个参数英文单词构成的
2 年多之前 回复
guwei4037
guwei4037   Ds   Rxr 2015.05.27 15:34

找规律啊,if表达式跟里面要执行的代码有什么关系?或者从设计上面避免这种情况的发生。

KyKiske22
KyKiske22 主要是控件太多了。在类里面每个都得new,关于 这方面改善 还真不知道有什么好方法,尤其是类中涉及控件的时候。
2 年多之前 回复
albertbush
albertbush   2015.05.27 15:53

上面那部分,可以这样写

listBox1.Items[listBox1.SelectedIndex] = string.Format("{0}的值为{1} 。",(char)(listBox1.SelectedIndex+97),int.Parse(DataText.Text));

下面那部分,用文字表述的,比较困难,文字表述的格式一样的话(但是这个很难保证),可以用Regex来获取a,b,c,d,然后转数值型-97,就获得了数组索引。用一个数组(数组的元素是一个代理)可以解决其余问题。

albertbush
albertbush 回复KyKiske22: 没有规律的话,用数组。先把会变化的部分写在数组里。
2 年多之前 回复
KyKiske22
KyKiske22 你写的那个试了,不行。所有的ListBox1.Item的值基本上没有规律,主要是想有啥更好的写法可以避免大量if-else
2 年多之前 回复
KyKiske22
KyKiske22 不好意思 我忘说了,这里abcd等等是个举例,真正的变量是单词形式,诸如“cat_mast、dog_0"等等,一共有100个变量,ListBox一共有110行。而且不是所有的listBox1.Items[i]的值为“a的值为多少” 有的是listBox1.Items[110]="无,为空" ,基本上每个ListBox1.Items[i]的值都不一样
2 年多之前 回复
qq_16794101
qq_16794101   2015.05.27 23:25

找规律啊,if表达式跟里面要执行的代码有什么关系?或者从设计上面避免这种情况的发生。

Csdn user default icon
上传中...
上传图片
插入图片