C# 使用属性在两个窗体之间传递数据

C# 使用属性在两个窗体之间传递数据,c#,winforms,C#,Winforms,我正在用c#在两个windows窗体之间传递数据。Form1是主窗体,其文本框将接收从form2_文本框传递给它的文本,并在其文本框(Form1_文本框)中显示它 首先,form1打开,带有一个空文本框和一个按钮,单击form1_按钮,form2打开。 在Form2中,我在Form2_文本框中输入了一个文本,然后单击该按钮(Form2_按钮)。单击该按钮的事件时,它将文本发送到form1的文本框,form1将以其空form1_文本框和从Form2接收的文本聚焦 我正在使用属性来实现此任务。 FO

我正在用c#在两个windows窗体之间传递数据。Form1是主窗体,其文本框将接收从form2_文本框传递给它的文本,并在其文本框(Form1_文本框)中显示它

首先,form1打开,带有一个空文本框和一个按钮,单击form1_按钮,form2打开。 在Form2中,我在Form2_文本框中输入了一个文本,然后单击该按钮(Form2_按钮)。单击该按钮的事件时,它将文本发送到form1的文本框,form1将以其空form1_文本框和从Form2接收的文本聚焦

我正在使用属性来实现此任务。 FORM2.CS

public partial class Form2 : Form
{
    //declare event in form 2
    public event EventHandler SomeTextInSomeFormChanged;

    public Form2()
    {
        InitializeComponent();

    }
    public string get_text_for_Form1
    {
        get { return form2_textBox1.Text; }
    }

    //On the button click event of form2, the text from form2 will be send to form1:

    public void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.set_text_in_Form1 = get_text_for_Form1;

    //if subscribers exists
    if(SomeTextInSomeFormChanged != null)
    {
        SomeTextInSomeFormChanged(this, null);
    }

    }

}
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string set_text_in_Form1
        {
            set { form1_textBox1.Text = value; }
        }

        private void form1_button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
            f2.SomeTextInSomeFormChanged +=new EventHandler(f2_SomeTextInSomeFormChanged);  
        }

        //in form 1 subcribe to event
        Form2 form2 = new Form2();

        public void f2_SomeTextInSomeFormChanged(object sender, EventArgs e)
        {
            this.Focus();

        }
    }

FORM1.CS

public partial class Form2 : Form
{
    //declare event in form 2
    public event EventHandler SomeTextInSomeFormChanged;

    public Form2()
    {
        InitializeComponent();

    }
    public string get_text_for_Form1
    {
        get { return form2_textBox1.Text; }
    }

    //On the button click event of form2, the text from form2 will be send to form1:

    public void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.set_text_in_Form1 = get_text_for_Form1;

    //if subscribers exists
    if(SomeTextInSomeFormChanged != null)
    {
        SomeTextInSomeFormChanged(this, null);
    }

    }

}
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string set_text_in_Form1
        {
            set { form1_textBox1.Text = value; }
        }

        private void form1_button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
            f2.SomeTextInSomeFormChanged +=new EventHandler(f2_SomeTextInSomeFormChanged);  
        }

        //in form 1 subcribe to event
        Form2 form2 = new Form2();

        public void f2_SomeTextInSomeFormChanged(object sender, EventArgs e)
        {
            this.Focus();

        }
    }
现在,在这种情况下,我必须再次显示form1,以便自动从form2获取文本框中的文本,但我希望当我单击form2上的按钮时,文本从form2发送到form1,form1开始聚焦,其文本框包含从form2接收的文本。

我知道这是一个(真的)老问题,但是见鬼

这方面的“最佳”解决方案是拥有一个“数据”类,该类将处理您需要传递的任何内容:

class Session
{
    public Session()
    {
        //Init Vars here
    }
    public string foo {get; set;}
}
然后有一个后台“控制器”类,可以处理调用、显示/隐藏表单(等等)

显然,在你的表单中,你可以有一个非常简单的点击监听器,就像

//...
    m_Session.foo = textbox.Text;
    this.DialogResult = DialogResult.OK;
    this.Close();
//...
然后,当您拥有神奇的表单时,它们可以使用会话对象在彼此之间传递东西。如果希望同时访问,可能需要根据需要设置
互斥
信号量
(也可以在
会话
中存储对的引用)。您也没有理由不能在父对话框中使用类似的控制器逻辑来控制其子对话框(别忘了,
DialogResult
对于简单表单非常有用)

我知道这是一个(真的)老问题,但见鬼

这方面的“最佳”解决方案是拥有一个“数据”类,该类将处理您需要传递的任何内容:

class Session
{
    public Session()
    {
        //Init Vars here
    }
    public string foo {get; set;}
}
然后有一个后台“控制器”类,可以处理调用、显示/隐藏表单(等等)

显然,在你的表单中,你可以有一个非常简单的点击监听器,就像

//...
    m_Session.foo = textbox.Text;
    this.DialogResult = DialogResult.OK;
    this.Close();
//...

然后,当您拥有神奇的表单时,它们可以使用会话对象在彼此之间传递东西。如果希望同时访问,可能需要根据需要设置
互斥
信号量
(也可以在
会话
中存储对的引用)。您也没有理由不能在父对话框中使用类似的控制器逻辑来控制其子对话框(别忘了,
DialogResult
非常适合于简单表单)

@sqlchild,不要这样做,使用事件和委托,这是正确的方法,不要通过表单暴露属性可能的重复项您已经发布过一次此问题。如果您想添加其他信息,请编辑您的原始问题,而不是发布新的信息。您的编码样式非常难看。。如果您认为有人会使用您的代码,您必须遵守常见的.net编码惯例。@gov,使用属性有什么害处?@sqlchild,不要这样做,使用事件和委托,这是正确的方法,不要通过表单公开属性。您已经发布过此问题的可能副本。如果您想添加其他信息,请编辑您的原始问题,而不是发布新的信息。您的编码样式非常难看。。如果您认为有人会使用您的代码,您必须遵守通用的.net编码惯例。@gov,使用属性有什么害处?啊,不是
/*阻止注释*/
!你让我咯咯笑,@Saggio.Ahhh,而不是
/*阻止评论*/
!“你让我笑了,”萨吉奥。