c# winform事件触发的问题

sinat_35436530 2018-08-16 04:15:00
问题背景:假设有一堆按钮,按下其中一个,其他的变成红色,如果每个按钮的点击事件都添加一个event触发其他按钮的颜色,这无疑很繁琐,有没有方法找出触发事件的源头,(比如点击A按钮,某个事件代码显示A按钮点击了。在执行下面的代码),触发事件又应该写在winform的那个事件?
...全文
1120 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-09-09
  • 打赏
  • 举报
回复
引用 16 楼 wanghui0380 的回复:
[quote=引用 15 楼 huayt6088 的回复:] 通过sender可以判断是事件源,剩下的按钮需要改变颜色,循环还是需要的。
这个还真不需要遍历,当然给按钮绑定事件需要遍历(如果说你手动在ide里用鼠标绑,那就真可以说完全不需要遍历的) ps:对于mvvm方式去完成的话,只是一个简单的多播,并不需要你显示循环[/quote] 我所说的循环自然是绑定事件 然后找个位置记录上次点击的按钮,在点击事件中修改上次的按钮颜色为红色本次为白色,你所说的具体是如何实现的。可以简述一下,学习一下吗?
sunylf 2018-08-20
  • 打赏
  • 举报
回复
首先将所有按钮的背景色设为红色,然后,点击某一按钮后,改变当前按钮的颜色,释放该按钮后,再恢复为红色?
xiaocongzhi 2018-08-20
  • 打赏
  • 举报
回复
参数sender表示你点击的是哪个按钮,你把sender排除掉不变色就行了(所有按钮共用同一个处理代码)
drifter2002 2018-08-19
  • 打赏
  • 举报
回复
创建一个按钮事件的处理函数,绑定到所有按钮。即所有按钮共用一个处理函数。
在这个处理函数中,处理所有按钮的颜色设定。
wanghui0380 2018-08-17
  • 打赏
  • 举报
回复
引用 15 楼 huayt6088 的回复:
通过sender可以判断是事件源,剩下的按钮需要改变颜色,循环还是需要的。


这个还真不需要遍历,当然给按钮绑定事件需要遍历(如果说你手动在ide里用鼠标绑,那就真可以说完全不需要遍历的)

ps:对于mvvm方式去完成的话,只是一个简单的多播,并不需要你显示循环
「已注销」 2018-08-17
  • 打赏
  • 举报
回复
通过sender可以判断是事件源,剩下的按钮需要改变颜色,循环还是需要的。
xuzuning 2018-08-17
  • 打赏
  • 举报
回复
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。
sinat_35436530 2018-08-17
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
抽出去所谓的 button,一个界面背后的 ViewModel 中重要的内容是“选中什么单元”,而这个单元其实并不知道什么 button 控件,ViewModel 并不依赖于 View 层设计,而是 View 只需要声明一下与 ViewModel 如何绑定就行了。这才是设计模式,MVVM 框架实现的就是这种轻松快捷的绑定声明机制。这样才能把你的交互界面设计思想变为立体的,避免繁琐。

原先的想法是,用户操作(比如点击按钮),触发某个事件(用户操作了,但不知道操作什么),然后经过调度才知道触发点击按钮,再去触发点击按钮事件。(有点像钩子函数)。不知道跟所谓MVVM模式相符?
吉普赛的歌 2018-08-17
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
“事件源头”来自于 ViewModel 跟 View 的分层知识,也就是 MVVM 设计模式,而并不是来自于那一点点控件知识。控件的背景色跟“选中单元”这样一个 string 属性绑定设置一下就行了,假设一个控件的事件中你需要去 foreach 遍历其它什么控件,这叫做 MVP 编程,则种设计模式是微软在 30 年前 vb 等等开发平台(也包括其它的工具,例如模仿 vb 的 Delphi 平台)就采用的模式。而现在应该学会 MVVM 而不是 MVP。


56 个按钮, 一个点击, 其它的55个要变红, 不需要遍历?
P哥说的很神奇, 写点实际代码让咱们见识下呗
  • 打赏
  • 举报
回复
抽出去所谓的 button,一个界面背后的 ViewModel 中重要的内容是“选中什么单元”,而这个单元其实并不知道什么 button 控件,ViewModel 并不依赖于 View 层设计,而是 View 只需要声明一下与 ViewModel 如何绑定就行了。这才是设计模式,MVVM 框架实现的就是这种轻松快捷的绑定声明机制。这样才能把你的交互界面设计思想变为立体的,避免繁琐。
  • 打赏
  • 举报
回复
“事件源头”来自于 ViewModel 跟 View 的分层知识,也就是 MVVM 设计模式,而并不是来自于那一点点控件知识。控件的背景色跟“选中单元”这样一个 string 属性绑定设置一下就行了,假设一个控件的事件中你需要去 foreach 遍历其它什么控件,这叫做 MVP 编程,则种设计模式是微软在 30 年前 vb 等等开发平台(也包括其它的工具,例如模仿 vb 的 Delphi 平台)就采用的模式。而现在应该学会 MVVM 而不是 MVP。
  • 打赏
  • 举报
回复
首先,ViewModel 跟 View 要分层设计。

在你的 ViewModel 中仅仅有一个“string 选中单元{get;set;}” 的属性,这是 ViewModel 的基本设计。假设你纠结于一堆按钮,程序实现必定出于下处无法将业务与控件分离。很显然,所有控件都监听这个属性的 NotifyPropertyChanged 抛出的事件,或者说是将自己的背景色的改变语句与这个属性自动绑定。这是设计模式。

假设你使用控件(button)当作 ViewModel,会出现不少混乱和复杂的问题。而且纠结许多技术术术语却并不能在改为各种不同 UI 控件实现时千变万化地实现。
sunny327 2018-08-17
  • 打赏
  • 举报
回复
wangxiaolia 2018-08-17
  • 打赏
  • 举报
回复
如果没有其他需求的话,可以记录上一个点击的按钮,每次只改变当前和上一个按钮就好了
sinat_35436530 2018-08-16
  • 打赏
  • 举报
回复
对,就是要全局钩子,但是具体怎么用,有范例吗?
xuzuning 2018-08-16
  • 打赏
  • 举报
回复
你可以遍历容器的 Controls 集合,给每个需要的空间订阅事件

也可以通过全局钩子,在事件发生时遍历 Controls,对符合规划的控件进行操作
FainSheeg 2018-08-16
  • 打赏
  • 举报
回复

private void button_Click(object sender, EventArgs e)
{
foreach (Control c in this.Controls)
{
if (typeof(Button).IsAssignableFrom(c.GetType()))
{
c.BackColor = Color.Red;
}
((Button)sender).BackColor = Color.Green;
}
}

private void Form1_Load(object sender, EventArgs e)
{
foreach (Control c in this.Controls)
{
if (typeof(Button).IsAssignableFrom(c.GetType()))
{
c.Click += new System.EventHandler(this.button_Click);
}
}
}
吉普赛的歌 2018-08-16
  • 打赏
  • 举报
回复
吉普赛的歌 2018-08-16
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
string[] arr ={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"
,"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
int i = 0;
foreach (string s in arr)
{
Button btn = new Button() { Text = s };
btn.Size = new Size() { Width = 30, Height = 20 };
btn.Location = new Point() { X= (i%13)* 50 , Y= (i/13) * 20 };
btn.Tag = "flag";
btn.Click += Btn_Click;
this.Controls.Add(btn);
i++;
}
InitializeComponent();
}

private void Btn_Click(object sender, EventArgs e)
{
Button btnCurr = (Button)sender;
btnCurr.BackColor = Color.Gray;
foreach (Control c in this.Controls)
{
Button btn = c as Button;
if (btn == null || Convert.ToString(btn.Tag) != "flag" || btn== btnCurr)
continue;

btn.BackColor = Color.Red;
}
}
}
}
正怒月神 2018-08-16
  • 打赏
  • 举报
回复
你可以通过sender来判断用户点击的哪个按钮。
加载更多回复(2)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧