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(); }