发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
例如有下面的需求需要实现:程序主画面中弹出一个子窗口。此时主画面仍然可以接收用户的操作(子窗口是非模态的)。子窗口上进行某些操作,根据操作的结果要在主画面上显示不同的数据。
即如下图所示:
大多数我们会这样做:
表单1窗口定义:
1 public partial class Form1 : Form 2 { 3 4 public string LabelName 5 { 6 get { return this.label1.Text; } 7 set { this.label1.Text = value; } 8 } 9 10 public Form1() 11 { 12 InitializeComponent(); 13 this.button1.Click += new EventHandler(button1_Click); 14 } 15 16 /// <summary> 17 /// 按钮触发 18 /// </summary> 19 /// <param name="sender"></param> 20 /// <param name="e"></param> 21 private void button1_Click(object sender, EventArgs e) 22 { 23 Form2 form2 = new Form2(); 24 form2.form1 = this; 25 form2.Show(); 26 } 27 }
表单2窗口定义:
1 public partial class Form2 : Form 2 { 3 public Form1 form1; 4 public Form2() 5 { 6 InitializeComponent(); 7 this.button1.Click += new EventHandler(button1_Click); 8 } 9 10 /// <summary> 11 /// 表单2按钮触发 12 /// </summary> 13 /// <param name="sender"></param> 14 /// <param name="e"></param> 15 private void button1_Click(object sender, EventArgs e) 16 { 17 form1.LabelName = "改变之后"; 18 } 19 }
这样虽然可以达到目的,但是各个模块之间产生了很强的耦合。一般说来模块之间的调用应该是单方向的:模块A调用了模块B,模块B就不应该反向调用A,否则就破坏了程序的层次,加强了耦合程度,也使得功能的改变和追加变得很困难。
所以这里就用到了事件:
下边是表单2中的事件定义:
1 public partial class Form2 : Form 2 { 3 public delegate void OutputMessage(object sender, System.EventArgs e); 4 public event OutputMessage ButtonClick; 5 6 public Form2() 7 { 8 InitializeComponent(); 9 this.button1.Click += new EventHandler(button1_Click); 10 } 11 12 /// <summary> 13 /// 表单2按钮触发 14 /// </summary> 15 /// <param name="sender"></param> 16 /// <param name="e"></param> 17 private void button1_Click(object sender, EventArgs e) 18 { 19 ButtonClick(this, e); 20 } 21 }
然后在表单1中进行捕获:
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 this.button1.Click += new EventHandler(button1_Click); 7 } 8 9 /// <summary> 10 /// 按钮触发 11 /// </summary> 12 /// <param name="sender"></param> 13 /// <param name="e"></param> 14 private void button1_Click(object sender, EventArgs e) 15 { 16 Form2 form = new Form2(); 17 form.Show(); 18 form.ButtonClick += new Form2.OutputMessage(form_ClickButton); 19 } 20 21 private void form_ClickButton(object sender, EventArgs e) 22 { 23 this.label1.Text = "改变之后"; 24 } 25 }
这样,各个模块专心的做自己的事情,不需要过问其他模块的事情。
不知道说的对不对,还请指教。。。
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
C#中Timer控件的运用实例
定义两个Timer控件,一个命名为timer1,另外一个命名为timer2。timer2.Font("宋体", 10F);this.button1.ForeColor = System.Drawing.Color.Blue;this.button1.Location = new System.Drawing...
C#panel控件问题
C#panel控件问题在FORM1 里有个 panel 和3个button 我想点击butto1 就在panel显示FORM2 button2就显示FORM2 private void button1_Click(object sender, EventArgs e){Form f = new Form1();ShowFormIn...
Silverlight ListBox上下移动选项
Silverlight ListBox上下移动选项。private void button1_Click(object sender, EventArgs e) { upIndex = this.listBox1.if (upIndex >0) { upIndex--;private void Form2_Load(object sender, Eve...
事件的三种类型,应用篇
同步事件1.声明事件//负责传递消息public delegate void MethodCall(string message);public static event MethodCall requestdata;泛型异步事件1.声明事件public event EventHandler<FileAnalysisE...
V8.A12NumericUpDown 控件(1)
A12NumericUpDown 控件(1)A12NumericUpDown_控件_1_private void numericUpDown1_ValueChanged(object sender, EventArgs e)private void Form1_Load(object sender, EventArgs e)private void button3...
什么是事件注册?
通过上面的说明,我们得到一个信息,前面这段事件注册代码,是让this.button1.Click和System.EventHandler(this.button1_Click)指向了同一段内存空间,简单来讲,就是让this.button1.Click指向了this.b...
C#中的委托和事件
---------------------------------------------------------------------------------问:“我看到在很多事件代码中那些代码都是照写(object sender, System.EventArgs e),根本就不用改变sender和e,...
在WebBroswer里面显示Word
C#制作不规则窗口
/// <summary> /// Create and apply the region on the supplied control /// </summary> /// <param name="control">The Control object to apply the region to</pa...
微信扫码,在手机上查看选中内容