C#的委托事件在winform窗体中实现传值备忘

用一个例子来说明吧,这样比较好明白一些。

就是打开主窗体,datagridview加载了一些数据,然后我们在打开的子窗体中,输入一些条件,让主窗体中的数据随着加载的条件来动态实现加载数据。

这就需要涉及到从子窗体传值到主窗体,然后筛选数据,最后绑定。其中,个人认为,最为高效的方法就是利用委托事件来实现。

我们可以先看看子窗体的代码:

 

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  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;
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 比如说泛型的一些容器等等。只要传到主窗体,拆箱开来,就会发现子窗体的一些内容已经传到了主窗体了,剩下的,就是处理了。

你可能感兴趣的:(WinForm)