窗体参数传递---委托、事件
来源:互联网 发布:手机木马软件监听器 编辑:程序博客网 时间:2024/05/22 15:49
问题描述: 如上图所示,将Form1点击按钮,将Form2显示并将其值传递给Form2中
简单讲,现在有两种方式可以完成二者之间的参数传递,首先第一种:(1) 定义带参的构造函数 (2) 委托、事件
(一) 构造函数传参
抛出的问题中,我们可以明确Form1的值传递给Form2,;我们可以定义Form2一个带参的构造函数,在实现button_click事件时将
Form1的内容传递给Form2,这样即可完成参数传递任务。
public Form2( string str) { // 定义带参构造函数 InitializeComponent(); this.textBox1.Text = str; }
private void button1_Click(object sender, EventArgs e) { // 在Form1的click事件响应中实现参数传递 Form2 frm = new Form2(this.textBox1.Text); frm.Show(); }
(二)委托及事件
其实利用委托及事件完成参数传递降低了窗体间的耦合,其方法如下:
(1) 定义弹出窗体的委托、委托的一个事件,及该事件响应的地方;
(2) 在父窗体中定义响应的方法,并在实例化窗体时注册该方法给弹出窗体。
问题描述中,Form1为传出参数窗体,称之为“弹出窗体”;Form2为接受参数窗体,称之为“父窗体”。
首先定义Form1的一个委托、一个委托的事件,及触发该事件的地方:
public delegate void MyDelegate1(string str); //委托 public event MyDelegate1 MyEvent1;//事件 private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); MyEvent1(this.textBox1.Text); frm2.Show(); } //触发事件地点
其次是定义响应方法,及窗体实例化:
public Form2( ) { InitializeComponent(); Form1 frm1 = new Form1();
//Form1 frm1 = Form1.Instance();
frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1); }
void frm1_MyEvent1(string str) { this.textBox1.Text = str; }
运行期间出现如下错误:
由于Form2的构造函数再次实例化了一个新的Form1。。。。(究其原因,待定,不是很清楚)
但是正确的方向是,定义一个静态实例化窗体,如下代码:
private Form1() { InitializeComponent(); } private static Form1 _instance = null; public static Form1 Instance() { if (_instance == null) _instance = new Form1(); return _instance; }
然后将Form2中实例化Form1方式修改为如下:
public Form2( ) {
InitializeComponent();
//Form1 frm1 = new Form1(); --------------> 由于Form1构造函数成为私有,故不能使用。删除
Form1 frm1 = Form1.Instance(); -----------> 使用单一的窗体实例化
frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
}
至此完成了问题描述内容!
若问题描述换成:Form1点击按钮显示Form2,Form2中值修改显示在Form1中,亦可参照上述方式完成参数传递;
若问题描述换成:Form1点击按钮显示Form2,并将Form1中值显示在Form2中;修改Form2中值,点击按钮内容显示在Form1中。则完整的源代码如下所示:
//Form1.csnamespace Weituo{ public delegate void MyDelegate1(string str); public partial class Form1 : Form { public event MyDelegate1 MyEvent1; private Form1() { InitializeComponent(); } private static Form1 _instance = null; public static Form1 Instance() { if (_instance == null) _instance = new Form1(); return _instance; } private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.MyEvent +=new MyDelegate(frm2_MyEvent); MyEvent1(this.textBox1.Text); frm2.Show(); } private void frm2_MyEvent(string str) { this.textBox1.Text = str; } }}
Form2.cs 文件
//Form2.csnamespace Weituo{ public delegate void MyDelegate(string str); public partial class Form2 : Form { public event MyDelegate MyEvent; public Form2( ) { InitializeComponent(); //Form1 frm1 = new Form1(); Form1 frm1 = Form1.Instance(); frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1); } private void button1_Click(object sender, EventArgs e) { MyEvent(this.textBox1.Text); } void frm1_MyEvent1(string str) { this.textBox1.Text = str; } }}
- 窗体参数传递---委托、事件
- 使用事件和委托再两个窗体之间传递数据
- 运用委托事件,在窗体中传递信息
- 窗体间参数传递&以及事件的简单理解
- 窗体间参数传递
- 委托事件窗体传值
- 在窗体之间传递参数
- WinForm窗体之间参数传递
- WinForm窗体之间传递参数
- C#窗体之间传递参数
- 委托和事件实现父子窗体刷新
- 简单窗体使用委托、事件传值
- html事件传递参数
- 委托和事件(一)--参数
- C#委托-在窗体中使用委托和事件
- C#中利用委托传递事件
- 委托、事件的应用 --- 窗口信息传递
- 通过应用委托传递窗口事件
- 大数据量,海量数据 处理方法总结
- VC中使用sqlite3_open生成的文件,提示“file is encrypted or is not a database ”
- GetWindowRect和GetClientRect(转)
- GoldenGate Extract Warning OGG-00869 Failed to Retrieve Column List Handle for Table
- 关于 C/C++中的日期和时间
- 窗体参数传递---委托、事件
- 话说localStorage的实现
- acm大赛之校园赛.
- VMware使用技巧
- 第13周报告2:定义自定义函数,计算sin和cos的近似值
- Android之Styles And Themes学习
- jquery ajax跨域传值 microsoft jscript 运行错误:没有权限
- WIN7无法识别USB设备
- proxool 配置