Winform窗體之間的傳值

很多初學者經常遇到的問題,就是窗體之間的傳值。

下面說三種常用的方法:

前提有兩個窗體,一個叫ParentFrm主窗體,一個叫ChildFrm子窗體

兩個窗體上都只有兩個控件,txtMsg的textBox以及btnSendMsg的button

(1)

在ChildFrm中寫一個公共方法,目的是能再ParentFrm中能夠使用這個方法

public void SetMsg(string txt) 
        {
            this.txtMsg.Text = txt;
        }
    }
然後在ParentFrm中調用它

 private void btnSendMsg_Click(object sender, EventArgs e)
        {
            childFrm.SetMsg(this.txtMsg.Text);
         }
當然你需要在load事件中將ChildFrm窗體new出來


(2)

使用委託,達到低耦合的效果

在ChildFrm中寫一個公共方法,目的是能再ParentFrm中能夠使用這個方法

public void SetMsg(string txt) 
        {
            this.txtMsg.Text = txt;
        }
    }

在ParentFrm中

先定義一個委託

 public Action<string> AfterMsgSend { get; set; }
在load事件中註冊

 private void PersonFrm_Load(object sender, EventArgs e)
        {
            ChilderFrm cf = new ChilderFrm();
            //childFrm = cf;
            //在顯示第二個窗體之前註冊事件
            AfterMsgSend += cf.SetMsg;
            cf.Show();
          
        }
最後在點擊事件中,調用它

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
          
            AfterMsgSend(this.txtMsg.Text);
        }

(3)

使用事件,其實與委託方法相似

在ChildFrm中寫一個公共方法

  public void GetMsg(object sender, string e)
        {
            this.txtMsg.Text = e;
        }

在ParentFrm中

先定義一個事件

  public event EventHandler<string> AfterMsgSendEvent;
在load中註冊事件
 private void PersonFrm_Load(object sender, EventArgs e)
        {
            ChilderFrm cf = new ChilderFrm();
         
            //事件註冊
            AfterMsgSendEvent += cf.GetMsg;
            cf.Show();
          
        }
再點擊事件中調用

  private void btnSendMsg_Click(object sender, EventArgs e)
        {
     
            //事件傳值
            AfterMsgSendEvent(this, this.txtMsg.Text);
        }


委託與事件的關係:

1.事件是委託的一個特殊實例

2.當聲明委託變量前加了event關鍵字後,就立刻變成了事件

3.事件只能使用+=或-=來賦值,這樣就避免了將之前註冊的事件覆蓋掉

4.事件只能在類內部觸發執行

委託與事件的區別:

沒有可比性,因爲委託是數據類型,事件時對象,是對委託的一種封裝





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章