用一個例子來說明吧,這樣比較好明白一些。
就是開啟主表單,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 比如說泛型的一些容器等等。只要傳到主表單,拆箱開來,就會發現子表單的一些內容已經傳到了主表單了,剩下的,就是處理了。