C# window pass information

Method 1
sends messages through PostMessage in Form1, and interacts with messages intercepted through DefWndProc in Form2. For details, please refer to my previous article "C# Send, receive and process custom WINDOWS messages"


 

Method 2
is implemented through public static members of third-party public classes

       class class1
       {
           public static string str;//公用字符串
       }

 Assign class1.str="incoming content"; in Form1, and use it in Form2, strings=class1.str; In this way, any object, such as an array, can be passed.


The following content is from the Internet, I have corrected the errors and simplified them.

 

Method 3

The main form passes its own this reference to the child form's constructor. The code is as follows:
 
main form.cs

       private void button1_Click(object sender, EventArgs e)
       {
           Form1 f1 = new Form1(this);
           f1.Show();
       }

subform.cs

   public partial class Form1 :Form
    {
       private frmMain mForm;
       public Form1(frmMain f)
       {
           this.mForm = f;
           InitializeComponent();
       }
       private void button1_Click(object sender, EventArgs e)
       {
           mForm.Text = "1 通过“指针”传递信息";
       }
    }

Method 4

To limit the functionality exposed by the main form to child forms, use an interface. code show as below:

define interface.cs
   

publicinterface IChangeTitle
{
   void ChangeTitle(string title);
}


main form.cs

      public void ChangeTitle(string title)
       {
           this.Text = title;
       } 
       private void button2_Click(object sender, EventArgs e)
       {
          Form2 f2 = new Form2(this);
           f2.Show();
       }

subform.cs

    publicpartial class Form2 : Form
    {
        private IChangeTitle ichangeTitle;
        public Form2(IChangeTitle ichangeTitle)
        {
            InitializeComponent();
             this.ichangeTitle=ichangeTitle;
        }
        private void button1_Click(object sender,EventArgs e)
        {
             // 通过接口来调用方法
             ichangeTitle.ChangeTitle("2 通过“接口”传递信息");
        }
    }

Method 5 

To further reduce the coupling between forms, use delegates. code show as below:

main form.cs

       protected void FormTitleChanged(string title)
       {
           this.Text = title;
       }

       private void button3_Click(object sender, EventArgs e)
       {
           Form3 f3 = new Form3();
           f3.TitleChanged = newForm3.TitleChangedHandler(FormTitleChanged);
           f3.Show();
       }

subform.cs

    publicpartial class Form3 : Form
    {
     // 声明和定义委托
       public delegate void TitleChangedHandler(string title);
       public TitleChangedHandler TitleChanged;
       public Form3()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
            if (TitleChanged != null)
                TitleChanged("3 通过“委托代理”传递信息"); //委托调用
       }
   }

 

Method 6

Better yet, define a custom event and its event parameters in the subform. code show as below:

main form.cs

       protected void FormTitleChanged(object sender,Form4.TitleChangedEventArgs e)
       {
           this.Text = e.Title;
       }
       private void button4_Click(object sender, EventArgs e)
       {
           Form4 f4 = new Form4();
           f4.TitleChanged+=    new Form4.TitleChangedEventHandler(FormTitleChanged);
           f4.Show();
       }

Subform.cs
   //The main form can subscribe to this event

    publicpartial class Form4 : Form
    {
       public class TitleChangedEventArgs : EventArgs // 事件参数类
       {
           private string title = "";
           public string Title
           {
               get { return title; }
               set { title = value; }
           }
       }
       // 声明委托
       public delegate void TitleChangedEventHandler(object sender,TitleChangedEventArgs e);
       // 定义事件
       public event TitleChangedEventHandler TitleChanged;

       public Form4()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           TitleChangedEventArgs e1 = new TitleChangedEventArgs();
           e1.Title = "4 通过“触发事件”传递信息";
           OnTitleChanged(e1);// 触发事件

       }
       // 触发事件的方法
       protected virtual void OnTitleChanged(TitleChangedEventArgse)
       {
           if (TitleChanged != null)
               TitleChanged(this, e);
       }
 

   }


Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=324031225&siteId=291194637