C#的委託事件在winform表單中實現傳值備忘

來源:互聯網
上載者:User

用一個例子來說明吧,這樣比較好明白一些。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.