前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录。

  要求:将弹出框里勾选的内容返回到主面板上。

  工具:委托。

  效果图:(由于是根据项目提取出来的,所以里面的界面有点文字有点奇怪)

    主窗体:

      

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

      

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

      

  实现过程:

    这里主要是用到委托实现,所以主要描述一下委托在这里的应用。

    我们要在主窗体(这里的子父窗体都是自己假想)中获取子窗体中的元素,所以首先在主窗体声明一个委托,这个委托是用来干嘛的?我们知道,在子窗体勾选几个选项点击确定之后,在这个事件中,我们需要将勾选的内容传送到主窗体,这里的委托的含义就是:我主窗体有给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进行窗体间通信的更多相关文章

  1. winform利用委托delegate进行窗体间通信,相同标题已经存在??

    前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...

  2. C# 利用委托事件进行窗体间的传值(新手必看)

    引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ...

  3. C# 利用委托事件进行窗体间的传值(简化)

    定义委托 public delegate void SendMessageToChildForms(string s); //定义了一个参数是string ,无返回值的委托,名为 SendMessag ...

  4. qt 窗体间通信

    利用qt的信号和槽,可以完成窗体间的通信,下面列出父子窗口利用信号和槽的相关代码. parent窗口: //parent.h #ifndef PARENT_H #define PARENT_H #in ...

  5. C#不同窗体间通信,数据传递

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  6. Winform利用委托进行窗体间的传值

    在form1.cs中 1.委托的定义 //定义一个委托 public delegate void AddUsrEventHandler(object sender, AddUsrEventHandle ...

  7. winform 利用委托实现窗体传值

    父窗体:Form1    ,有个 textbox1.text ,有个button1 子窗体:Form2  ,有个 textbox1.text ,有个button1 修改Form1 的textbox1. ...

  8. Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信

    如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait().notify().notifyAll()方法进行线程 ...

  9. WPF:事件委托对于不同界面间通信的应用

    界面1内设定点击事件,生成Path用事件传出public partial class TemplateWindow : Window     {         internal delegate v ...

随机推荐

  1. 【flex弹性盒布局】------这个强大的功能

    你知道flex弹性布局么? 我们先来了解它的概念:Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局 ...

  2. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  3. React复习小结(一)

    一.React的发展 facebook在构建instagram网站的时候遇见两个问题: 1.数据绑定的时候,大量操作真实dom,性能成本太高 2.网站的数据流向太混乱,不好控制 于是facebook起 ...

  4. java-web中生成文档(一)

    基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样 ...

  5. android studio 2.32躺坑记

    按说这是没啥记录意义的.不过作为一个偶尔用一下ADT开发安卓程序的跨界老码农,遇到一个尴尬事,现在手机已经用上安卓6了,而电脑里的ADT里SDK还是18,19.越来越多的项目是android stud ...

  6. uibutton颜色设置

     UIColor *color = [UIColor colorWithRed:100 / 255.0 green:20 / 255.0 blue:50 / 255.0 alpha:1.0]; 

  7. Unable to find 'struts.multipart.saveDir' property setting.

    今天在项目开发中遇到如下问题 项目使用的是struts2 Unable to find 'struts.multipart.saveDir' property setting. 后来在网上查询特此记录 ...

  8. 关于URL的理解

    引言 URL,是统一资源定位符(Uniform Resource Locator)的缩写,一个URL就是一个特定资源在网络上的地址.理论上讲,一个URL指向一个唯一的资源,这个资源可以使一个HTML页 ...

  9. github pages部署静态网页

    如果你的项目只是一个静态网站,就没有必要再去整什么服务器,github pages 提供了搭建静态网站的功能: 为什么使用Github Pages 1. 搭建简单而且免费: 2. 支持静态脚本: 3. ...

  10. Python 基于TK 文本编辑器

    #coding=utf-8 import sys,os import tkFileDialog from Tkinter import * from tkFont import Font print ...