zoukankan      html  css  js  c++  java
  • 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();
            }
    
  • 相关阅读:
    维护gcd的线段树 补发一波。。。
    BZOJ 4720: [Noip2016]换教室
    P2184 贪婪大陆 树状数组
    BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
    POJ3280 Cheapest Palindrome 区间DP
    BZOJ 2288: 【POJ Challenge】生日礼物 堆&&链表
    BZOJ 4236: JOIOJI map瞎搞
    浅谈最近公共祖先(LCA)
    题解 BZOJ 1912 && luogu P3629 [APIO2010]巡逻 (树的直径)
    [笔记] 求树的直径
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/6040902.html
Copyright © 2011-2022 走看看