Form2上Form1的C#访问方法

时间:2012-11-17 20:00:58

标签: c# winforms

我的项目中有2个表单。 Form1是主要表格。在那里,我有一个打开Form2的按钮,一个ListView和一个调用url的方法,并使用从url获取的数据提供ListView。

Form2有一个url文本框和一个“Ok”按钮。

当我按下Form1上的按钮时,它会打开Form2,没问题。 如果我在Form2的文本框中输入一个url并按Ok,我如何管理它以将url传递给Form1中的方法?

如果我这样做

Form1 form1 = new Form1();
form1.method();

它显然会打开一个Form1的新实例,在那里执行该方法并在那里填充列表框,但不在我原来的Form1上。

我在网上找到了解决这个问题的各种解决方案,但要么是太复杂了,要么都不起作用。

我怎么能说它实际上在我已经拥有的Form1上执行方法,因此加载带有值的正确列表框?

非常感谢

4 个答案:

答案 0 :(得分:4)

Form2上定义事件,并在输入网址时将其提升:

public class Form2 : Form
{
   public event EventHandler UrlEntered;

   private void ButtonOK_Click(object sender, EventArgs e)
   {
       if (UrlEntered != null)
           UrlEntered(this, EventArgs.Empty);
   }

   public string Url { get { return urlTextBox.Text; } }
}

在Form1上订阅该活动:

Form2 form2 = new Form2()
form2.UrlEntered += Form2_UrlEntered;
form2.Show();

处理此事件:

private void Form2_UrlEntered(object sender, EventArgs e)
{
   Form2 form2 = (Form2)sender;
   string url = form2.Url;
   // use it
}

此外,您可以使用自定义事件参数定义类型EventHandler<UrlEnteredEventArgs>的事件,该参数将为订阅者提供输入的URL。

答案 1 :(得分:1)

看看:

//In Form1 opening Form2
Form2 frm = new Form2();
frm.Owner = this;
frm.Show();

//Example to call methods in FORM1 from FORM2
private void button1_Click(object sender, EventArgs e)
{
    Form1 frmParent = (Form1)this.Owner;
    frmParent.testeFunction();
    frmParent.InsertInGrid(textBox1.Text);
}

因此,基本上你需要在Form1中创建一个函数来从Form2调用(传递参数)。 我希望这会有所帮助。

答案 2 :(得分:0)

在Form2上定义一个属性以允许访问结果

// In Form2
public string Url { get { return urlTextBox.Text; } }

在Form1中

var form2 = new Form2();
form2.ShowDialog(this);
string url = form2.Url;

注意:除非Show() ShowDialog()方法等待form2关闭。

ShowDialog参数this是要打开的表单的所有者。它将form2绑定到form1并使其始终显示在form1之上。

答案 3 :(得分:-1)

它会创建一个新实例,因为您正在调用 new

您可以遍历 Application.OpenForms 并检查表单名称。找到Form1后,您可以轻松调用其 public 方法;

Form1(Application.OpenForms[0] as Form1).method();