我在主程序界面动态添加了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
{
变回去;
}
});
主窗体点击的时候也定义个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到原始色。
UserStations的构造函数中将this 加入到List<UserStations>中。
点击事件触发是改变颜色时,遍历List<UserStations>,如果不是自己Reset color到原始色。
#4
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了
#5
你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
#6
1楼代码不满意吗?
#7
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
变颜色;
}
else
{
变回去;
}
});
你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
#8
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第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
一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。
怎么可能,我测试过了 ,是在UserStations里处理
#11
我猜楼主是想自己制作一个button控件,效果是点击按钮后按钮本身会变色,但是功能上就是个按钮的功能,不知道我说的对不对?
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。
#12
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
#13
不好意思,三楼的大哥,你是对的,一楼的估计也是对的,我刚才头脑糊涂了,自己写错了。太感谢了,very much。
#14
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
tableLayoutPanel是我的UserStations 这个自定义控件的面板啊,其实就是改变他的颜色啊。
#15
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
无语~~~
#16
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?
#17
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?
你这样做软件人家到时候测试的时候还不是要你自己改
#18
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在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
{
变回去;
}
});
主窗体点击的时候也定义个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到原始色。
UserStations的构造函数中将this 加入到List<UserStations>中。
点击事件触发是改变颜色时,遍历List<UserStations>,如果不是自己Reset color到原始色。
#4
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了
这样你可以点击第2个的时候就把颜色恢复下,这样就可以了
#5
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
变颜色;
}
else
{
变回去;
}
});
你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
#6
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
变颜色;
}
else
{
变回去;
}
});
你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
1楼代码不满意吗?
#7
在用户控件封装个Index属性,类型为Int
主窗体点击的时候也定义个Int类型变量currentIndex记录点击的控件的Index
主窗体Form.Controls.OfType<UserStations>().ToList().ForEach(uc=>
{
if(uc.Index==currentIndex)
{
变颜色;
}
else
{
变回去;
}
});
你这个方法我想过,但是没地儿写啊,我自定义控件的单击事件里面就是个变颜色,主界面的话写在哪?主界面就一个加载控件的方法,没有点击事件的。也就是说点击事件与主界面无关啊,就是自定义控件自己的一个的点击click事件。
#8
单击该控件的事件触发,颜色就变了,然后我点另外一个,颜色也变了,到最后....我主界面上添加的这些控件全颜色变了
这样你可以点击第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
一楼和三楼的我都试过了,也不行,不变色了。。。。郁闷呀。。。。。
怎么可能,我测试过了 ,是在UserStations里处理
#11
我猜楼主是想自己制作一个button控件,效果是点击按钮后按钮本身会变色,但是功能上就是个按钮的功能,不知道我说的对不对?
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。
我没做过控件不知道怎么帮你啦!
不过我觉得单击事件还是写在主界面比较好。
#12
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
#13
不好意思,三楼的大哥,你是对的,一楼的估计也是对的,我刚才头脑糊涂了,自己写错了。太感谢了,very much。
#14
你不应该在tableLayoutPanel里写 UserStations 单击 后改变颜色的代码
//删了
private void tableLayoutPanel_Click(object sender, EventArgs e)
{
this.tableLayoutPanel.BackColor = Color.Pink;
this.BorderStyle = BorderStyle.Fixed3D;
}
tableLayoutPanel是我的UserStations 这个自定义控件的面板啊,其实就是改变他的颜色啊。
#15
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
无语~~~
#16
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?
#17
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?
你这样做软件人家到时候测试的时候还不是要你自己改
#18
我主界面上添加的这些控件全颜色变了,我想要的效果是:点击哪个,哪个颜色变,其他的回归到原始色。
无语~~~
怎么啦。?
我刚才写在UserStations的单击事件里,点了都没反应,我这个Userstations控件其实就是放了个面板tableLayoutPanel,还是要写在那个面板的单击事件里面,但是还有个问题啊,我的面板上还加载了其他的用户控件,这个单击事件就出问题了,当我点在面板上的时候单击事件才出来,面板中间的地方:有其他控件的地方,点了没反应。这样不怎么好啊,人家点这个面板,总不可能挑着地方点吧?
你这样做软件人家到时候测试的时候还不是要你自己改
我知道啊,我没想到什么好方案解决这个事情,我想要的效果是只要点这个面板范围内,就响应单击事件,可是现在的情况却不是,因为面板里面加载的还有其他的一些用户控件,点到那些用户控件的范围里就不能响应那个单击事件了。烦恼啊。