C#自定义控件事件的问题。。。在线等待指点。。。。!!!!

时间:2021-07-15 04:14:37
我自定义了一个控件UserStations,控件的单击事件里面我写了代码是:当单击该控件的时候,有一个选中的效果,主要是颜色变了。

我在主程序界面动态添加了N个UserStations控件,这时问题就来了,当我点击其中一个,单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。

但是我不知道如何写了,还是在这个自定义控件的单击事件里面写?肯定不行吧,主界面的话  我又不知道在哪里来控制,怎么控制。谁能提供点思路啊。。。。。

18 个解决方案

#1


巧妙利用类成员解决这个问题

public partial class UserStations : UserControl
{
    private static UserStations preCtl = null;
    private static Color default_Color = SystemColors.Control;

    //constructor

    Click Event:

       if (preCtl != null) preCtl.BackColor = default_Color;
       BackColor = Color.Red;
       preCtl = this;
}

#2


在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});

#3


UserStations中定义一个static的List<UserStations>.使用单件模式取得它的实例。
UserStations的构造函数中将this 加入到List<UserStations>中。

点击事件触发是改变颜色时,遍历List<UserStations>,如果不是自己Reset color到原始色。

#4


单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了

#5


引用 2 楼 sj490790083 的回复:
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。

#6


引用 5 楼 kissapple500 的回复:
Quote: 引用 2 楼 sj490790083 的回复:

在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。


1楼代码不满意吗?

#7


引用 5 楼 kissapple500 的回复:
Quote: 引用 2 楼 sj490790083 的回复:

在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
3楼 1楼的都可以啊

#8


引用 4 楼 u011130289 的回复:
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了



我的状况估计你们都还没明白啊。我也知道是点第二个的时候恢复第一个啊。是这样的:我的主界面就是个按钮“加载”,点击后
Stations.UserStations  _UserStation = new Stations.UserStations();
this.flowLayoutPanel.Controls.Add(_UserStation);
加载控件。循环加了N多个到这个panel上。然后每个控件都有单击事件,这是我的自定义控件内部的单击事件: private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }     //这就是我的自定义控件里面的一个click事件。  也就是说我在主界面上点这N个自定义控件的时候,都是触发的我自定义控件内部的这个click事件啊(所以就出现了这个问题:只要是点了自定义控件,就变色了,因为都触发了这个单击事件了。而我在自定义控件里面又无法标记,必须到主界面加载控件的时候标记,我现在给每个控件标记好了,却不知道在哪里来写代码控制,主界面是没有这个单击事件的。如果在自定义控件的单击事件里面来写的话,那又行不通,因为你写了代码后,主界面上加载的这N个控件都会执行这个单击事件,还是一样的。。。。不知道我说的是不是很混淆,对不起各位了,但是我自己觉得还是表达清楚了。)

#9


一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。

#10


引用 9 楼 kissapple500 的回复:
一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。


怎么可能,我测试过了 ,是在UserStations里处理 

#11


我猜楼主是想自己制作一个button控件,效果是点击按钮后按钮本身会变色,但是功能上就是个按钮的功能,不知道我说的对不对?
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。

#12


你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码

//删了 
 private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }  

#13


不好意思,三楼的大哥,你是对的,一楼的估计也是对的,我刚才头脑糊涂了,自己写错了。太感谢了,very much。

#14


引用 12 楼 hwenycocodq520 的回复:
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码

//删了 
 private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }  



tableLayoutPanel是我的UserStations 这个自定义控件的面板啊,其实就是改变他的颜色啊。

#15


我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~

#16


引用 15 楼 hwenycocodq520 的回复:
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

#17


引用 16 楼 kissapple500 的回复:
Quote: 引用 15 楼 hwenycocodq520 的回复:

我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

你这样做软件人家到时候测试的时候还不是要你自己改

#18


引用 17 楼 u011130289 的回复:
Quote: 引用 16 楼 kissapple500 的回复:

Quote: 引用 15 楼 hwenycocodq520 的回复:

我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

你这样做软件人家到时候测试的时候还不是要你自己改




我知道啊,我没想到什么好方案解决这个事情,我想要的效果是只要点这个面板范围内,就响应单击事件,可是现在的情况却不是,因为面板里面加载的还有其他的一些用户控件,点到那些用户控件的范围里就不能响应那个单击事件了。烦恼啊。

#1


巧妙利用类成员解决这个问题

public partial class UserStations : UserControl
{
    private static UserStations preCtl = null;
    private static Color default_Color = SystemColors.Control;

    //constructor

    Click Event:

       if (preCtl != null) preCtl.BackColor = default_Color;
       BackColor = Color.Red;
       preCtl = this;
}

#2


在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});

#3


UserStations中定义一个static的List<UserStations>.使用单件模式取得它的实例。
UserStations的构造函数中将this 加入到List<UserStations>中。

点击事件触发是改变颜色时,遍历List<UserStations>,如果不是自己Reset color到原始色。

#4


单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了

#5


引用 2 楼 sj490790083 的回复:
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。

#6


引用 5 楼 kissapple500 的回复:
Quote: 引用 2 楼 sj490790083 的回复:

在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。


1楼代码不满意吗?

#7


引用 5 楼 kissapple500 的回复:
Quote: 引用 2 楼 sj490790083 的回复:

在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
    变颜色;
}
else
{
    变回去;
}
});



你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
3楼 1楼的都可以啊

#8


引用 4 楼 u011130289 的回复:
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了



我的状况估计你们都还没明白啊。我也知道是点第二个的时候恢复第一个啊。是这样的:我的主界面就是个按钮“加载”,点击后
Stations.UserStations  _UserStation = new Stations.UserStations();
this.flowLayoutPanel.Controls.Add(_UserStation);
加载控件。循环加了N多个到这个panel上。然后每个控件都有单击事件,这是我的自定义控件内部的单击事件: private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }     //这就是我的自定义控件里面的一个click事件。  也就是说我在主界面上点这N个自定义控件的时候,都是触发的我自定义控件内部的这个click事件啊(所以就出现了这个问题:只要是点了自定义控件,就变色了,因为都触发了这个单击事件了。而我在自定义控件里面又无法标记,必须到主界面加载控件的时候标记,我现在给每个控件标记好了,却不知道在哪里来写代码控制,主界面是没有这个单击事件的。如果在自定义控件的单击事件里面来写的话,那又行不通,因为你写了代码后,主界面上加载的这N个控件都会执行这个单击事件,还是一样的。。。。不知道我说的是不是很混淆,对不起各位了,但是我自己觉得还是表达清楚了。)

#9


一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。

#10


引用 9 楼 kissapple500 的回复:
一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。


怎么可能,我测试过了 ,是在UserStations里处理 

#11


我猜楼主是想自己制作一个button控件,效果是点击按钮后按钮本身会变色,但是功能上就是个按钮的功能,不知道我说的对不对?
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。

#12


你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码

//删了 
 private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }  

#13


不好意思,三楼的大哥,你是对的,一楼的估计也是对的,我刚才头脑糊涂了,自己写错了。太感谢了,very much。

#14


引用 12 楼 hwenycocodq520 的回复:
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码

//删了 
 private void tableLayoutPanel_Click(object sender, EventArgs e)
        {
            this.tableLayoutPanel.BackColor = Color.Pink;
            this.BorderStyle = BorderStyle.Fixed3D;
        }  



tableLayoutPanel是我的UserStations 这个自定义控件的面板啊,其实就是改变他的颜色啊。

#15


我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~

#16


引用 15 楼 hwenycocodq520 的回复:
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

#17


引用 16 楼 kissapple500 的回复:
Quote: 引用 15 楼 hwenycocodq520 的回复:

我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

你这样做软件人家到时候测试的时候还不是要你自己改

#18


引用 17 楼 u011130289 的回复:
Quote: 引用 16 楼 kissapple500 的回复:

Quote: 引用 15 楼 hwenycocodq520 的回复:

我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。


无语~~~


怎么啦。?

我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?

你这样做软件人家到时候测试的时候还不是要你自己改




我知道啊,我没想到什么好方案解决这个事情,我想要的效果是只要点这个面板范围内,就响应单击事件,可是现在的情况却不是,因为面板里面加载的还有其他的一些用户控件,点到那些用户控件的范围里就不能响应那个单击事件了。烦恼啊。