【问题标题】:Passing data between two forms with properties [duplicate]在具有属性的两个表单之间传递数据[重复]
【发布时间】:2011-02-23 07:04:58
【问题描述】:

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

首先,form1 打开,带有一个空文本框和一个按钮,单击 form1_button 时,form2 打开。在Form2中,我在form2_textbox中输入了一个文本,然后单击了按钮(form2_button)。此按钮的ON单击事件,它将文本发送到form1的文本框,form1将以其空的form1_textbox与从form2接收的文本成为焦点。

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

公共部分类 Form2 : Form { //在表格2中声明事件 公共事件 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();

    }
}

【问题讨论】:

标签: c# winforms


【解决方案1】:

在 form2 中,您需要创建事件并在 form1 中订阅它。就是这样。

//declare event in form 2
public event EventHandler SomeTextInSomeFormChanged;

// call event in form2 text_changed event
if(SomeTextInSomeFormChanged != null)
   SomeTextInSomeFormChanged(this, null);

//in form 1 subcribe to event
var form2 = new Form2();
form2.SomeTextInSomeFormChanged += SomeHandlerInForm1WhereYouCanSetForcusInForm1

更新:

表格2:

public Form2()
{
    InitializeComponent();
}

public void button1_Click(object sender, EventArgs e)
{
//if subscribers exists
  if(SomeTextInSomeFormChanged != null)
  {
    SomeTextInSomeFormChanged(form2_textBox1, null);
  }
}

表格1:

public partial class Form1 : Form { 

   public Form1() { InitializeComponent(); }

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

    public void f2_SomeTextInSomeFormChanged(object sender, EventArgs e)
    {
        var textBoxFromForm2 = (TextBox)sender;
        form1_textBox1.Text =  textBoxFromForm2.Text
        this.Focus();
    }
}

【讨论】:

  • 感谢您不建议在子窗体的构造函数中传递对主窗体的引用。但是,我认为您的回复不会对 OP 有太大帮助(他们完全有能力自行查找如何使用事件)。 +1
  • @Bugai13 :先生,我该怎么做,请给我代码。
  • @Bugai13 : 先生,buton_Click 是创建的事件,正如我在代码中提到的,但是如何在 form1 中订阅它,请告诉?
  • @Ed S.:先生,我将如何订阅该活动?
  • @Bugai13:先生,它给出的错误,我应该在哪里写你给出的form1代码,在form1_load事件中还是在哪里?它说-----找不到类型或命名空间名称“var”(您是否缺少 using 指令或程序集引用?)
【解决方案2】:

下面列出的网站有很好的教程。这个特定页面演示了如何实现这一点:

http://www.vcskicks.com/data-between-forms.php

【讨论】:

    【解决方案3】:

    这个怎么样。

    ((Form2)Application.OpenForms["Form2"]).textBox1.Text = "My Message";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多