C#的委托事件在winform窗体中实现传值备忘
用一个例子来说明吧,这样比较好明白一些。
就是打开主窗体,datagridview加载了一些数据,然后我们在打开的子窗体中,输入一些条件,让主窗体中的数据随着加载的条件来动态实现加载数据。
这就需要涉及到从子窗体传值到主窗体,然后筛选数据,最后绑定。其中,个人认为,最为高效的方法就是利用委托事件来实现。
我们可以先看看子窗体的代码:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public delegate void SearchDelegate(string str);
public partial class searchFrm : Form
{
public searchFrm()
{
InitializeComponent();
}
public event SearchDelegate SearchEvent;
private void btnOK_Click(object sender, EventArgs e)
{
SearchEvent(txt.Text);
this.Close();
}
}
}
可以很明显的看到,子窗体中有一个全局的委托,然后申明了一个SearchEvent的事件。那么当我们点击按钮的时候,我们需要将条件委托出去,该如何做呢?代码:
SearchEvent(txt.Text);
看上去很明显,直接将我们的txt.text的文本值给委托了出去,至于怎么处理,是不用关心的。
现在我们开始看主窗体的代码了:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class mainFrm : Form
{
public mainFrm()
{
InitializeComponent();
}
public string connStr = "server=.;uid=sa;pwd=251147;database=bloginfo;";
private void mainFrm_Load(object sender, EventArgs e)
{
BindGridView();
}
private DataTable getDT(string sql)
{
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
sda.Fill(dt);
}
return dt;
}
private void BindGridView()
{
string sql = "select * from testblog";
this.dgv.DataSource = getDT(sql);
}
private void 数据筛选ToolStripMenuItem_Click(object sender, EventArgs e)
{
searchFrm sf = new searchFrm();
sf.SearchEvent+=new SearchDelegate(sf_SearchEvent);
sf.ShowDialog();
}
private void sf_SearchEvent(object o)
{
string str = o.ToString();
string sql = "select * from testblog where sws_mc like '%"+str+"%'";
this.dgv.DataSource = getDT(sql);
}
}
}
看到了没,从子窗体抛出的事件委托,被主窗体的 sf.SearchEvent+=new SearchDelegate(sf_SearchEvent);这句话给接收住了,并且在
private void sf_SearchEvent(object o)
{
string str = o.ToString();
string sql = "select * from testblog where sws_mc like '%"+str+"%'";
this.dgv.DataSource = getDT(sql);
}
代码中进行了处理,哈哈,我们的传值成功了。
其实,扩展一下,我们传过来的object类型可以是任何种类的,比如说arraylist 比如说泛型的一些容器等等。只要传到主窗体,拆箱开来,就会发现子窗体的一些内容已经传到了主窗体了,剩下的,就是处理了。
C#的委托事件在winform窗体中实现传值备忘相关推荐
- winform C#的委托事件在winform窗体中传值,也可用于刷新另一窗体(窗体A刷新窗体B)...
窗体A :代码如下: public delegate void BrushPermission();//定义一个委托/// <summary>/// 刷新主界面的权限(功能按钮)/// & ...
- 怎样在Winform窗体中嵌入Web浏览器
背景 项目当中需要在Winform窗体中嵌入网页,虽然微软自带了WebBrowser控件,但是她是以IE模式运行的,兼容性实在太差,找了一圈发现有个叫CefSharp的家伙还不错,于是就拿来玩了一下. ...
- 【二次开发】将CATIA嵌入到Winform窗体中
由于项目需要,我们需要将CATIA嵌入到我们的软件之中,要求在软件启动后,同时调用并启动CATIA软件,并能够屏蔽掉软件自身的菜单和按钮.通过在网上查阅资料,实现了这一功能. 调用并启动CATIA p ...
- WinForm窗体中如何在一个窗体中取到另一个窗体的值
例如我们定义两窗体,Form1和Form2,如何在Form2中取到Form1中的一个值呢? 解决方法1: 在Form1 中定义一个成员变量,例如public string a = " &qu ...
- C#操作数据库,将其查查出来的记录条数显示在winform窗体中的方法之一
1 //1.数据库链接的基本操作(略) 2 //2.创建对象函数(关键部分) 3 sqlConn.Open(); 4 //初始化定义记录条数 5 int n = 0; 6 object obj = s ...
- C# :Winform窗体中文字滚动显示
想要做到文字滚动显示,首先需要把文字写入Lable控件中,将Label控件的位置改变就可以实现文字的位置变换. 1.在窗体中添加Timer和Lable控件 2.编写代码 //滚动 Lable priv ...
- WinForm窗体间如何传值
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...
- C#Winform窗体中传值
在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值 并且还定义一个accept事件public string Form2Value { get { return t ...
- C# 中对WinForm窗体中的控件快速设置TableIndex次序
点击"视图"--"Tab键顺序",然后便可设置. 参考文章 1. ssilspro,在vs2008中做winform程序的时,调整控件TableIndex顺序的 ...
最新文章
- python中的linearregression_【python+机器学习(2)】python实现Linear Regression
- OSError: mysql_config not found
- linux如何退出python编辑器_centos linux 终端已经调成python3,怎么安装python3的IDLE编译器,...
- fiddler和wireshark工具介绍及对比 - [测试技术知识]
- python-mysql驱动64位
- 架​设​W​e​b​服​务​器
- 如何备份和还原Firefox设置
- ruby操作常用数据库 - 使用DBI[翻译 转帖]
- 【Java并发编程】—–“J.U.C”:ArrayBlockingQueue
- Webservice 实践
- Qt_QSS 样式表属性大全
- 最短哈密尔顿圈matlab解法_数学建模学习笔记
- 费式序列(斐波那契数列)
- 【第1128期】从北京回来的年轻人,该告诉你点什么?
- 山东农业大学计算机考研资料汇总
- pmp知识点(9)-项目资源管理
- 汇编语言-用Si和Di实现字符串复制到其他的区域
- hadoop启动后jps查不到namenode的解决办法
- Python语言基础学习
- 报错:TestEngine with ID ‘junit-jupiter‘ failed to discover tests