溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#開發(fā)如何Winform實現窗體間相互傳值

發(fā)布時間:2022-03-21 09:07:20 來源:億速云 閱讀:211 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下C#開發(fā)如何Winform實現窗體間相互傳值的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、前言

我們在做Winform窗體程序開發(fā)的時候,會經常遇到窗體之間相互傳值。假設有下面的一個場景:一個主窗體和一個子窗體,點擊主窗體上面的按鈕給子窗體傳值,并在子窗體上面顯示出來,一般會有如下幾種方式實現。

二、公共屬性

我們可以在子窗體里面定義一個公共的屬性,然后在父窗體里面給公共屬性賦值,這樣可以實現窗體之間傳值,子窗體代碼如下:

using System;
using System.Windows.Forms;

namespace DelegateDemo
{
    public partial class frmChild : Form
    {
        public frmChild()
        {
            InitializeComponent();
        }

        // 定義一個公共屬性,接收傳遞的值
        public string strMessage { get; set; }

        /// <summary>
        /// 窗體加載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmChild_Load(object sender, EventArgs e)
        {
            // 將接收到的值顯示在窗體上
            this.lblMessage.Text = strMessage;
        }
    }
}

父窗體代碼:

using System;
using System.Windows.Forms;

namespace DelegateDemo
{
    public partial class frmParent : Form
    {
        public frmParent()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 單擊事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Value_Click(object sender, EventArgs e)
        {
            frmChild child = new frmChild();
            // 給窗體的公共屬性賦值
            child.strMessage = this.txtMessage.Text.Trim();
            // 顯示子窗體
            child.Show();
        }
    }
}

這種方式有一個缺點:屬性需要設置為public,不安全。

三、公共方法

我們還可以在子窗體里面定義一個方法,通過調用方法傳值,子窗體代碼如下:

using System;
using System.Windows.Forms;

namespace DelegateDemo
{
    public partial class frmChild : Form
    {
        public frmChild()
        {
            InitializeComponent();
        }

        // 定義一個公共屬性,接收傳遞的值
        //public string strMessage { get; set; }

        // 定義屬性為private
        private string strMessage { get; set; }

        /// <summary>
        /// 給私有屬性賦值
        /// </summary>
        /// <param name="strText"></param>
        public void SetText(string strText)
        {
            strMessage = strText;
        }

        /// <summary>
        /// 窗體加載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmChild_Load(object sender, EventArgs e)
        {
            // 將接收到的值顯示在窗體上
            this.lblMessage.Text = strMessage;
        }
    }
}

父窗體代碼:

using System;
using System.Windows.Forms;

namespace DelegateDemo
{
    public partial class frmParent : Form
    {
        public frmParent()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 單擊事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Value_Click(object sender, EventArgs e)
        {
            #region 調用公共屬性賦值
            //frmChild child = new frmChild();
            //// 給窗體的公共屬性賦值
            //child.strMessage = this.txtMessage.Text.Trim();
            //// 顯示子窗體
            //child.Show(); 
            #endregion


            #region 調用方法賦值
            frmChild child = new frmChild();
            // 給窗體的公共屬性賦值
            child.SetText(this.txtMessage.Text.Trim());
            // 顯示子窗體
            child.Show(); 
            #endregion
        }
    }
}

這種方式同樣也有缺點:屬性雖然是private的了,但是方法還是public的。

四、委托

上述兩種方式都是不安全,下面我們使用委托來實現窗體之間傳值。

1、定義一個委托

我們在主窗體里面定義一個有參無返回值的委托:

// 定義一個有參無返回值的委托
private delegate void SendMessage(string strMessage);

2、實例化一個此委托類型的事件

在父窗體里面定義一個委托類型的事件:

// 定義一個委托類型的事件
public event SendMessage sendMessageEvent;

委托與事件的關系,事件相對于委托更安全,更低耦合。委托是一個類型,事件是委托類型的一個實例。

3、定義要執(zhí)行的方法

這里其實就是在子窗體里面定義一個給控件賦值的方法:

/// <summary>
/// 給控件賦值的方法
/// </summary>
/// <param name="strValue"></param>
public void SetValue(string strValue)
{
    this.lblMessage.Text = strValue;
}

4、將方法綁定到事件

frmChild child = new frmChild();
// 將方法綁定到事件上
sendMessageEvent += new SendMessage(child.SetValue);
// 也可以使用下面的簡寫形式
// sendMessageEvent += child.SetValue;
child.Show();

5、觸發(fā)委托

在按鈕的點擊事件里面觸發(fā)委托:

if(sendMessageEvent!=null)
{
      sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
}

上面的代碼中使用的是自定義的委托,我們也可以使用.Net 框架里面自帶的Action泛型委托:

using System;
using System.Windows.Forms;

namespace DelegateDemo
{
    
    public partial class frmParent : Form
    {
        // 定義一個有參無返回值的委托
        public delegate void SendMessage(string strMessage);

        // 定義一個委托類型的事件
        public event SendMessage sendMessageEvent;


        public event Action<string> actionEvent;
        public frmParent()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 單擊事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Value_Click(object sender, EventArgs e)
        {
            #region 調用公共屬性賦值
            //frmChild child = new frmChild();
            //// 給窗體的公共屬性賦值
            //child.strMessage = this.txtMessage.Text.Trim();
            //// 顯示子窗體
            //child.Show(); 
            #endregion


            #region 調用方法賦值
            //frmChild child = new frmChild();
            //// 給窗體的公共屬性賦值
            //child.SetText(this.txtMessage.Text.Trim());
            //// 顯示子窗體
            //child.Show(); 
            #endregion

            #region 通過委托傳值
            //frmChild child = new frmChild();
            //// 將方法綁定到事件上
            //// sendMessageEvent += new SendMessage(child.SetValue);
            //// 也可以使用下面的簡寫形式
            //sendMessageEvent += child.SetValue;
            //child.Show();
            #endregion

            #region 使用Action
            frmChild child = new frmChild();
            // 將方法綁定到事件上
            actionEvent += child.SetValue;
            child.Show();
            #endregion

            // 使用自定義委托
            //if (sendMessageEvent!=null)
            //{
            //    sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
            //}

            // 使用Action委托
            if (actionEvent != null)
            {
                actionEvent.Invoke(this.txtMessage.Text.Trim());
            }
        }
    }
}

以上就是“C#開發(fā)如何Winform實現窗體間相互傳值”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI