使用属性在两个表单之间传递数据

时间:2011-02-23 07:45:05

标签: c# winforms

我在c#中的两个窗体之间传递数据。 Form1是主窗体,其文本框将接收从form2_textbox&传递给它的文本。将其显示在其文本框(form1_textbox)中。

首先,打开form1,使用空文本框和按钮,在单击form1_button时,将打开form2。 在Form2中,我在form2_textbox&中输入了一个文本。然后点击按钮(form2_button).ON点击此按钮的事件,它会将文本发送到form1的文本框& form1将以其空的form1_textbox与来自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);
    }

    }

}

Form1.cs的

 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收到的文本。

1 个答案:

答案 0 :(得分:4)

我知道这是一个(真的)老问题,但是地狱......

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

class Session
{
    public Session()
    {
        //Init Vars here
    }
    public string foo {get; set;}
}

然后有一个后台“控制器”类,可以处理调用,显示/隐藏表单(等..)

class Controller
{
    private Session m_Session;
    public Controller(Session session, Form firstform)
    {
        m_Session = session;
        ShowForm(firstform);
    }

    private ShowForm(Form firstform)
    {
        /*Yes, I'm implying that you also keep a reference to "Session"
         * within each form, on construction.*/
        Form currentform = firstform(m_Session);
        DialogResult currentresult = currentform.ShowDialog();
        //....

        //Logic+Loops that handle calling forms and their behaviours..
    }
}

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

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

然后,当你拥有神奇的惊人形式时,他们可以使用会话对象在彼此之间传递信息。如果您希望获得并发访问权限,则可能需要根据需要设置mutexsemaphore(您还可以在Session内存储引用)。也没有理由为什么你不能在父对话框中有类似的控制器逻辑来控制它的孩子(并且不要忘记,DialogResult对于简单的形式是很好的)