我的项目中有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上执行方法,因此加载带有值的正确列表框?
非常感谢
答案 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();