WinForm多控件操作!!有什么好的方法对多个控件进行统一的操作??

时间:2020-12-06 01:00:28
小弟在设计一个推荐界面。界面主要是用tabcontrol,而tabcontrol分了8页,每一页都有差不多,都有6个picturebix,6个标签,再加上几个按钮。他们所要触发的事件都差不多,比如按钮都是点击事件,点击发生的事情都差不多,比如弹出一个新的窗口显示消息。
虽然看起来很简单,但是却十分繁琐,比如按键的事件,一共要编写48个事件,而且每个事件所要触发的事情都差不多。虽然已经写了一个方法,把要做的事情都通过这个方法,删减了很多代码。但是有没有什么更加简便的方法,可以同时操作这些控件。
要操作的内容还有text内容的命名,picturebox 的图片显示等等。。
求大神帮忙解决 谢谢!

11 个解决方案

#1


相同类型的事件,写在同一个函数里面,然后sender as Button,根据Tag或者Name,进行判断是哪个按钮即可。

#2


谢谢,但还是不太明白。 WinForm多控件操作!!有什么好的方法对多个控件进行统一的操作??有没有具体点的代码

#3


引用 1 楼 zhi_ai_yaya 的回复:
相同类型的事件,写在同一个函数里面,然后sender as Button,根据Tag或者Name,进行判断是哪个按钮即可。

谢谢,但还是不太明白。有没有具体点的代码

#4


 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }

#5


根据一楼的意思随便写了个。

#6


引用 4 楼 zhangshiyu011 的回复:
 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


对的,我的大概意思就是这样。
少量可以用if-else判断,多一些可以改为对Name属性进行switch判断。更多的话就有可能是设计的逻辑有问题了,考虑其他办法吧。
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            switch (btn.Name)
            {
                case 'A':
                    Bll.btnA_click();
                    break;
                case 'B':
                case 'C':
                    Bll.btnBC_click();
                    break;
                case 'D':
                   Bll.btnD_click();
                    break;
                case 'F':
                    Bll.btnF_click();
                    break;
                default:
                    break;
            }

另外, 控件的Tag属性Object Tag,也是很有用的,可以把任意数据绑定到这个Tag上。比如
输入法的0-9,A-Z,a-z,可以直接把字符作为Tag属性,使用时不需要知道哪个按钮,只需要(sender as Button).Tag.toString();

#7


引用 楼主 nie279128345 的回复:
界面主要是用tabcontrol,而tabcontrol分了8页,每一页都有差不多,都有6个picturebix,6个标签,再加上几个按钮。他们所要触发的事件都差不多,比如按钮都是点击事件,点击发生的事情都差不多,比如弹出一个新的窗口显示消息。
虽然看起来很简单,但是却十分繁琐,比如按键的事件,一共要编写48个事件,而且每个事件所要触发的事情都差不多。虽然已经写了一个方法,把要做的事情都通过这个方法,删减了很多代码。但是有没有什么更加简便的方法,可以同时操作这些控件。
要操作的内容还有text内容的命名,picturebox 的图片显示等等。。


你的知识基本上已经到了天花板。

要设几十个、上百个“差不多”的东西,你让要首先设计为 一个用户控件,然后只是单独设计几种子类用户控件、或者几类内嵌模板。然后每一种子类用户控件再扩展出几类孙类用户控件(或者孙类内嵌模板)。如此,明确地将非常简单的差别封装一下,从父类继承一大堆共同的界面和共同的流程躯干。

跟你说了恐怕你也不会懂这些,所以点到为止。总结一下,就是你目前是适合做点皮毛,能跟着别人写点简单的,还不能设计软件。

#8


一个专业的程序员,他的知识从设计控件(以及独立的样式文件、模板声明文件)开始起步。窗体上随时可以补充很简单的一些“胶水“程序,从自己团队已经开发好的一大堆业务控件中用鼠标拖拉出来一些,配置一下属性,迅速拼凑成用户需求的高级应用。

绝大多数业余编程爱好者,只是纠结于窗体,只会用鼠标拖拉一些低级的控件,而非高级的业务控件。于是面对稍微复杂一点的用户需求也就容易陷入困扰。爱用”越是低级的控件,性能越高“为借口。

专业和业余的区别,就在于自己开发控件的进度上。前者用90%时间开发控件,后者用1%都远远达不到的时间开发控件。因此当项目深入的时候,后者就只能逃避,深入不了。

#9


引用 7 楼 sp1234 的回复:
Quote: 引用 楼主 nie279128345 的回复:

界面主要是用tabcontrol,而tabcontrol分了8页,每一页都有差不多,都有6个picturebix,6个标签,再加上几个按钮。他们所要触发的事件都差不多,比如按钮都是点击事件,点击发生的事情都差不多,比如弹出一个新的窗口显示消息。
虽然看起来很简单,但是却十分繁琐,比如按键的事件,一共要编写48个事件,而且每个事件所要触发的事情都差不多。虽然已经写了一个方法,把要做的事情都通过这个方法,删减了很多代码。但是有没有什么更加简便的方法,可以同时操作这些控件。
要操作的内容还有text内容的命名,picturebox 的图片显示等等。。


你的知识基本上已经到了天花板。

要设几十个、上百个“差不多”的东西,你让要首先设计为 一个用户控件,然后只是单独设计几种子类用户控件、或者几类内嵌模板。然后每一种子类用户控件再扩展出几类孙类用户控件(或者孙类内嵌模板)。如此,明确地将非常简单的差别封装一下,从父类继承一大堆共同的界面和共同的流程躯干。

跟你说了恐怕你也不会懂这些,所以点到为止。总结一下,就是你目前是适合做点皮毛,能跟着别人写点简单的,还不能设计软件。


谢谢指导了,说的东西对我非常有参考价值。
我是个新手,刚刚开始接触做个小项目。听了你这番话,发现自己还有真的有很多东西要学。虽然书也看过了,基本的东西也了解了,但在实际中,就连最基本的核心的东西--面向对象的思维,也忽略了。确实在编程的时候要多思考才行。

#10


引用 4 楼 zhangshiyu011 的回复:
 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


原来sender还可以这样用,学到了,谢谢。
还有,请问这个点击事件是任何一个button点击都会触发的吗?

#11


引用 10 楼 nie279128345 的回复:
Quote: 引用 4 楼 zhangshiyu011 的回复:

 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


原来sender还可以这样用,学到了,谢谢。
还有,请问这个点击事件是任何一个button点击都会触发的吗?


我明白了。。。。原来所有控件都绑定相同的时间。。。哈哈哈居然被自己蠢到了

#1


相同类型的事件,写在同一个函数里面,然后sender as Button,根据Tag或者Name,进行判断是哪个按钮即可。

#2


谢谢,但还是不太明白。 WinForm多控件操作!!有什么好的方法对多个控件进行统一的操作??有没有具体点的代码

#3


引用 1 楼 zhi_ai_yaya 的回复:
相同类型的事件,写在同一个函数里面,然后sender as Button,根据Tag或者Name,进行判断是哪个按钮即可。

谢谢,但还是不太明白。有没有具体点的代码

#4


 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }

#5


根据一楼的意思随便写了个。

#6


引用 4 楼 zhangshiyu011 的回复:
 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


对的,我的大概意思就是这样。
少量可以用if-else判断,多一些可以改为对Name属性进行switch判断。更多的话就有可能是设计的逻辑有问题了,考虑其他办法吧。
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            switch (btn.Name)
            {
                case 'A':
                    Bll.btnA_click();
                    break;
                case 'B':
                case 'C':
                    Bll.btnBC_click();
                    break;
                case 'D':
                   Bll.btnD_click();
                    break;
                case 'F':
                    Bll.btnF_click();
                    break;
                default:
                    break;
            }

另外, 控件的Tag属性Object Tag,也是很有用的,可以把任意数据绑定到这个Tag上。比如
输入法的0-9,A-Z,a-z,可以直接把字符作为Tag属性,使用时不需要知道哪个按钮,只需要(sender as Button).Tag.toString();

#7


引用 楼主 nie279128345 的回复:
界面主要是用tabcontrol,而tabcontrol分了8页,每一页都有差不多,都有6个picturebix,6个标签,再加上几个按钮。他们所要触发的事件都差不多,比如按钮都是点击事件,点击发生的事情都差不多,比如弹出一个新的窗口显示消息。
虽然看起来很简单,但是却十分繁琐,比如按键的事件,一共要编写48个事件,而且每个事件所要触发的事情都差不多。虽然已经写了一个方法,把要做的事情都通过这个方法,删减了很多代码。但是有没有什么更加简便的方法,可以同时操作这些控件。
要操作的内容还有text内容的命名,picturebox 的图片显示等等。。


你的知识基本上已经到了天花板。

要设几十个、上百个“差不多”的东西,你让要首先设计为 一个用户控件,然后只是单独设计几种子类用户控件、或者几类内嵌模板。然后每一种子类用户控件再扩展出几类孙类用户控件(或者孙类内嵌模板)。如此,明确地将非常简单的差别封装一下,从父类继承一大堆共同的界面和共同的流程躯干。

跟你说了恐怕你也不会懂这些,所以点到为止。总结一下,就是你目前是适合做点皮毛,能跟着别人写点简单的,还不能设计软件。

#8


一个专业的程序员,他的知识从设计控件(以及独立的样式文件、模板声明文件)开始起步。窗体上随时可以补充很简单的一些“胶水“程序,从自己团队已经开发好的一大堆业务控件中用鼠标拖拉出来一些,配置一下属性,迅速拼凑成用户需求的高级应用。

绝大多数业余编程爱好者,只是纠结于窗体,只会用鼠标拖拉一些低级的控件,而非高级的业务控件。于是面对稍微复杂一点的用户需求也就容易陷入困扰。爱用”越是低级的控件,性能越高“为借口。

专业和业余的区别,就在于自己开发控件的进度上。前者用90%时间开发控件,后者用1%都远远达不到的时间开发控件。因此当项目深入的时候,后者就只能逃避,深入不了。

#9


引用 7 楼 sp1234 的回复:
Quote: 引用 楼主 nie279128345 的回复:

界面主要是用tabcontrol,而tabcontrol分了8页,每一页都有差不多,都有6个picturebix,6个标签,再加上几个按钮。他们所要触发的事件都差不多,比如按钮都是点击事件,点击发生的事情都差不多,比如弹出一个新的窗口显示消息。
虽然看起来很简单,但是却十分繁琐,比如按键的事件,一共要编写48个事件,而且每个事件所要触发的事情都差不多。虽然已经写了一个方法,把要做的事情都通过这个方法,删减了很多代码。但是有没有什么更加简便的方法,可以同时操作这些控件。
要操作的内容还有text内容的命名,picturebox 的图片显示等等。。


你的知识基本上已经到了天花板。

要设几十个、上百个“差不多”的东西,你让要首先设计为 一个用户控件,然后只是单独设计几种子类用户控件、或者几类内嵌模板。然后每一种子类用户控件再扩展出几类孙类用户控件(或者孙类内嵌模板)。如此,明确地将非常简单的差别封装一下,从父类继承一大堆共同的界面和共同的流程躯干。

跟你说了恐怕你也不会懂这些,所以点到为止。总结一下,就是你目前是适合做点皮毛,能跟着别人写点简单的,还不能设计软件。


谢谢指导了,说的东西对我非常有参考价值。
我是个新手,刚刚开始接触做个小项目。听了你这番话,发现自己还有真的有很多东西要学。虽然书也看过了,基本的东西也了解了,但在实际中,就连最基本的核心的东西--面向对象的思维,也忽略了。确实在编程的时候要多思考才行。

#10


引用 4 楼 zhangshiyu011 的回复:
 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


原来sender还可以这样用,学到了,谢谢。
还有,请问这个点击事件是任何一个button点击都会触发的吗?

#11


引用 10 楼 nie279128345 的回复:
Quote: 引用 4 楼 zhangshiyu011 的回复:

 
private void Form10_Load(object sender, EventArgs e)
        {
            //绑定按钮click事件
            button1.Click += new EventHandler(button_Click);
            button1.Click += new EventHandler(button_Click);
        }
        private void button_Click(object sender, EventArgs e)
        {
            Button btn = null;
            if (sender is Button)
            {
                btn = (Button)sender;
            }
            if (btn==null)
            {
                return;
            }
            if (btn.Text == "按钮A")
            {
                //执行按钮A点击操作
            }
            else if (btn.Text == "按钮B")
            {
                //执行按钮B点击操作
            }
        }


原来sender还可以这样用,学到了,谢谢。
还有,请问这个点击事件是任何一个button点击都会触发的吗?


我明白了。。。。原来所有控件都绑定相同的时间。。。哈哈哈居然被自己蠢到了