WinFrm窗体的传值方式

比较简单的方法:

一:1.定义两个窗体

2.在父窗体中加入子窗体的属性

   public ChildFrm ChildFrm { get; set; }

 3.加载的时候:

 private void ParentFrm_Load(object sender, EventArgs e)
{
         ChildFrm frm = new ChildFrm();
            ChildFrm = frm;   
           frm.Show();
}

 4.点击的时候(把子窗体的属性改成公有的):

对象内部的字段或者元素属性最好不要直接让外部直接访问(通过设置的方法来控制)

  public System.Windows.Forms.TextBox txtMsg;
ChildFrm.txtMsg.Text = this.txtMsg.Text;

 第二种方法:(提供一个方法)

private ChildFrm ChildFrm { get; set; }

 子窗体中提供一个方法为:

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

 父窗体点击的时候:

ChildFrm.SetText(this.txtMsg.Text); 

 第三种:发布订阅模式和观察者模式

父窗体:定义发布消息的委托

 public Action<string> AfterMsgSend { get; set; }

  委托方式传值

if (AfterMsgSend == null)
  {
       return;
  }

   AfterMsgSend(this.txtMsg.Text);

 子窗体弹出来之前,关注主窗体消息的变化:(委托的方式)

AfterMsgSend += frm.SetText;

 第四种方法:(事件的方法)

定义消息发布的事件:

 public event EventHandler AfterMsgChangeEvent;

 定义一个子类继承EventArgs:

  public class TextBoxMsgChangeEventArg :EventArgs
    {
        public string Text { get; set; }
    }

 触发事件:

AfterMsgChangeEvent(this, new TextBoxMsgChangeEventArg() { Text = this.txtMsg.Text });

  拿到父窗体的传来的文本

 public void AfterParentFrmTextChange(object sender, EventArgs e)
        {
            TextBoxMsgChangeEventArg arg = e as TextBoxMsgChangeEventArg;
            this.SetText(arg.Text);
        }

 事件的方法:

 AfterMsgChangeEvent += frm.AfterParentFrmTextChange;

 事件和委托的区别:

1.委托是一个类型   事件是委托的特殊实例

2.事件的触发只能在类的内部触发(相对安全)

3.委托实例和事件时有可比性的(委托和事件没有可比性)

发布订阅模式:(一个人发布多个人收到消息)

先定义一个接口:

  public interface IChildFrm
    {
        void SetText(string txt);
    }

 在父窗体中定义一个子窗体的集合:

  public List<IChildFrm> ChildFrmList { get; set; }

 子窗体实现接口:

public partial class ChildFrm : Form,IChildFrm

 传过来的实体放到当前文本框中:

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

父窗体循环:

遍历哪个  所有关注消息变化的子窗体的集合    调用集合中每个元素的一个方法

  if (ChildFrmList == null)
            {
                return;
            }

            foreach (var item in ChildFrmList)
            {
                item.SetText(this.txtMsg.Text);
            }

 父窗体加载:

 private void MainFrm_Load(object sender, EventArgs e)
        {
            ChildFrm frm = new ChildFrm();

            this.ChildFrmList = new List<IChildFrm>();

            this.ChildFrmList.Add(frm);
            
            frm.Show();
        }

 大管家模式:(定义一个MasterFrm)

  private void MasterFrm_Load(object sender, EventArgs e)
        {
            MainFrm mainFrm = new MainFrm();          

            ChildFrm childFrm = new ChildFrm();

            mainFrm.ChildFrmList = new List<IChildFrm>();
            mainFrm.ChildFrmList.Add(childFrm);

            mainFrm.Show();
            childFrm.Show();
        }
原文地址:https://www.cnblogs.com/sunliyuan/p/6040902.html