winform利用委托delegate进行窗体间通信,相同标题已经存在??
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录。
要求:将弹出框里勾选的内容返回到主面板上。
工具:委托。
效果图:(由于是根据项目提取出来的,所以里面的界面有点文字有点奇怪)
主窗体:

子窗体:(点击浏览之后弹出的对话框)

勾选几项之后,点击确定,主窗体显示:

实现过程:
这里主要是用到委托实现,所以主要描述一下委托在这里的应用。
我们要在主窗体(这里的子父窗体都是自己假想)中获取子窗体中的元素,所以首先在主窗体声明一个委托,这个委托是用来干嘛的?我们知道,在子窗体勾选几个选项点击确定之后,在这个事件中,我们需要将勾选的内容传送到主窗体,这里的委托的含义就是:我主窗体有给TextBox显示文本的方法,但是我主窗体干不了这件事儿,因为我没有文本,文本在你子窗体那里,所以主窗体得委托子窗体干一件事儿,这个事儿就是麻烦你子窗体把勾选的东西的文本给我显示到主窗体传的TextBox中。
//1、声明一个委托
public delegate void showText(List<String> ls);
声明完委托后,在子窗体(Form2/Form3)实例化一个委托,这个委托才是真真正正的委托,是干事的委托。
//2、实例化一个委托
public showText f2;
那有了委托之后,你子窗体需要干什么事情呢?来,就是干这件事儿:麻烦你帮我把list集合中的字符串显示到textBox1里面去。该方法是在主窗体中写的。
//3、委托的方法,这个方法应该和第一步是同步实现的,这里暂且记作第3步。
private void T1Show(List<String> ls)
{
stringList1 = ls;
stringList1.Sort();
this.textBox1.Text = null;
foreach (String item in stringList1)
{
this.textBox1.Text += item + ";";
}
}
委托子窗体要干的事情有了,接下来就是把这件事委托给子窗体。
//4、把要干的事情委托给子窗体已经创建好的委托载体f2.
objForm.f2 = this.T1Show;
到这里基本上就实现了子父窗体利用委托进行窗体间通信,先把整个项目的代码展示出来:
主窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections; namespace 云状
{
public partial class Form1 : Form
{
//保存当前已经添加到数据库的气象代码
// public List<String> stringList1 = new List<string>();
//private List<String> stringList2 = new List<string>();
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{ Form2 objForm = new Form2();
objForm.FormBorderStyle = FormBorderStyle.None;
//4、把要干的事情委托给子窗体已经创建好的委托载体f2.
objForm.f2 = this.T1Show;
objForm.ShowDialog(); }
//3、委托的方法,这个方法应该和第一步是同步实现的,这里暂且记作第3步。
private void T1Show(List<String> ls)
{
stringList1 = ls;
stringList1.Sort();
this.textBox1.Text = null;
foreach (String item in stringList1)
{
this.textBox1.Text += item + ";";
}
}
private void T2Show(List<String> ls)
{
stringList2 = ls;
stringList2.Sort();
this.textBox2.Text = null;
foreach (String item in stringList2)
{
this.textBox2.Text += item + ";";
}
}
private void button2_Click(object sender, EventArgs e)
{ Form3 objForm = new Form3();
objForm.FormBorderStyle = FormBorderStyle.None;
objForm.f3 = this.T2Show;
objForm.ShowDialog();
} private void button3_Click(object sender, EventArgs e)
{
//入库
}
}
//1、声明一个委托
public delegate void showText(List<String> ls);
}
子窗体Form2代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections; namespace 云状
{
public partial class Form2 : Form
{
//2、实例化一个委托
public showText f2;
public Form2()
{
InitializeComponent();
if (Form1.stringList1 != null)
{
foreach (Control item in this.panel1.Controls)
{
if (item is CheckBox)
{
string str = ((CheckBox)item).Text.Substring(, );
if (Form1.stringList1.Contains(str))
{
((CheckBox)item).Checked = true;
}
}
}
} } private void button1_Click(object sender, EventArgs e)
{
List<String> ls=new List<string>();
foreach(Control item in this.panel1.Controls)
{
if(item is CheckBox)
{
if (((CheckBox)item).Checked==true)
{
ls.Add(((CheckBox)item).Text.Substring(, ));
}
}
}
if(f2!=null)
{
f2(ls);
}
this.Close();
} private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
子窗体Form3代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace 云状
{
public partial class Form3 : Form
{
public showText f3;
public Form3()
{
InitializeComponent();
if (Form1.stringList2 != null)
{
foreach (Control item in this.panel1.Controls)
{
if (item is CheckBox)
{
string str = ((CheckBox)item).Text.Substring(, );
if (Form1.stringList2.Contains(str))
{
((CheckBox)item).Checked = true;
}
}
}
} } private void button1_Click(object sender, EventArgs e)
{
List<String> ls=new List<string>();
foreach (Control item in this.panel1.Controls)
{
if (item is CheckBox)
{
if (((CheckBox)item).Checked == true)
{
ls.Add(((CheckBox)item).Text.Substring(, ));
} }
} if (f3 != null)
{
f3(ls);
} this.Close();
} private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
可能会有疑问,不就是传一个List<String>吗,有必要这么麻烦吗?其实这里只是利用委托做事情,委托的其他用处还很广泛,我也在学习之中,以后有什么值得记录的东西,再在这里记录。。。
winform利用委托delegate进行窗体间通信,相同标题已经存在??的更多相关文章
- winform利用委托delegate进行窗体间通信
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- C# 利用委托事件进行窗体间的传值(新手必看)
引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ...
- C# 利用委托事件进行窗体间的传值(简化)
定义委托 public delegate void SendMessageToChildForms(string s); //定义了一个参数是string ,无返回值的委托,名为 SendMessag ...
- qt 窗体间通信
利用qt的信号和槽,可以完成窗体间的通信,下面列出父子窗口利用信号和槽的相关代码. parent窗口: //parent.h #ifndef PARENT_H #define PARENT_H #in ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- Winform利用委托进行窗体间的传值
在form1.cs中 1.委托的定义 //定义一个委托 public delegate void AddUsrEventHandler(object sender, AddUsrEventHandle ...
- winform 利用委托实现窗体传值
父窗体:Form1 ,有个 textbox1.text ,有个button1 子窗体:Form2 ,有个 textbox1.text ,有个button1 修改Form1 的textbox1. ...
- Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait().notify().notifyAll()方法进行线程 ...
- WPF:事件委托对于不同界面间通信的应用
界面1内设定点击事件,生成Path用事件传出public partial class TemplateWindow : Window { internal delegate v ...
随机推荐
- Hadoop中MapReduce作业流程图
MapReduce的流程分为11个步骤,4个实体 1.客户端:编写MapReduce的代码,配置作业,提交作业 2.JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作 ...
- SparkMLlib学习分类算法之逻辑回归算法
SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693 ...
- Unity使用Mono.Xml代替System.Xml 测试
测试环境 操作系统:Windows8.1 开发工具:Unity5.5.2 1.新建一个测试项目,观测引用System.Xml与Mono.Xml解析文件正确性,与打包后APK体积大小. 2.Mono.X ...
- Linux C 程序的开发环境
1.开发环境的构成 编辑器 vim,vi 编译器 gcc 调试器 gdb 函数库glibc 系统头文件glibc_header 2.gcc编译器 功能强大.性能优越的多平台编译器,gcc可以将c.c+ ...
- SQLServer树形数据结构的数据进行数据统计
前言 前几天朋友问我,关于SQLServer数据库中对树形结构的表数据统计问题,需求大致如下: 分类表(递归数据),A的子分类是B,B的子分类是C--分类关系不间断,A为第一层,B为第二层,C为第三层 ...
- Python 随机生成有效手机号码及身份证
中国那么大,人那么多,几乎人手一部手机.手机号码已经作为各大互联网站的注册账户.同样,身份证更是如此.以下是生成有效手机号码和身份证号. 身份证需要下载districtcode.txt这个文件:htt ...
- CF219C hoosing Capital for Treeland
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
- eclipse hibernate导出数据库实体类
打开eclipse->help->Eclipse Marketplace->查找hibernate->安装如下插件 只要安装其中一个,hibernate tool即可: 安装完 ...
- haproxy内存管理-free_list原理
haproxy的内存管理中,通过pool_head->free_list,存储空闲内存块,free_list是个二级指针,却把空闲内存块都串了起来,没有用next,pre之类的指针.怎么实现的? ...
- Promise (2) 基本方法
"I'm Captain Jack Sparrow" 加勒比海盗5上映,为了表示对杰克船长的喜爱,昨天闪现了几次模仿船长的走路姿势(哈哈哈,简直妖娆). 为了周天能去看电影,要赶紧 ...