从对话框中传递值到主窗体

22

可能是重复问题:
如何在Form1和Form2之间传递对象并返回到Form1?

我通常通过将变量作为参数传递来在窗体之间传递变量。现在,我有一个已经打开的窗体(我们称之为 FormMain ),还有另一个应该像对话框一样运行的窗体( FormTask )。用户在填写 FormTask 上的信息之前不能与主窗体交互。 FormTask 只包含一个文本框,该文本框的值应返回到 FormMain ,并作为变量跟踪。 FormTask 需要参数 exerciseType 。当 FormTask 打开时,它会检查此参数的值,并相应地设置文本框的默认值。这已经可以实现,我只是不知道如何将字符串值返回到已经打开的MainForm。 这些对话框似乎只能返回DialogResults,而这并不是我想要的。我经验也不太丰富,我宁愿避免摸索并制作自己的自定义对话框。

FormMain:

FormTask formTask = new FormTask(exerciseType);
formOpgaveInvoker.ShowDialog();

FormTask:

private void button1_Click(object sender, EventArgs e)
{
    string opgave = textBoxOpgave.Text;
    // return string value to MainForm here
}

既然键盘前的每个人都已经发布了答案,我就不会再尝试自己回答了。但请记住,您仍应检查调用ShowDialog返回的DialogResult值。您要允许用户取消(即在未输入任何内容的情况下关闭窗体)的情况,并且不希望将他们在文本框中输入的任何内容视为实际输入。 - Cody Gray
4个回答

34
在FormTask中创建公共属性。
public string Opgave { get {return textBoxOpgave.Text;}}

在 ShowDialog() 后进行检查。

FormTask formTask = new FormTask(exerciseType);
formOpgaveInvoer.ShowDialog();
formOpgaveInvoer.Opgave;  // here it is

2
谢谢你的回答,我现在感觉有点傻 :P - Jort
3
FormTask不应该这样被处理,要么调用Dispose()方法,要么更好的方式是使用using代码块。 - kdbanman
运行得非常顺畅。 - Abhirath Mahipal

1
最简单的方法是在您的窗体类中添加一个公共属性来返回字符串。
public string opgave
{
    get;
    private set;
}

在对话框关闭时将其分配给此属性,然后从调用ShowDialog()的代码中读取该属性:

private void button1_Click(object sender, EventArgs e)
{
    opgave = textBoxOpgave.Text;
}

...

FormTask formTask = new FormTask(exerciseType);
formOpgaveInvoker.ShowDialog();
DoSomething(formTask.opgave);

3
或者,你可以简单地将属性设置并返回textBoxOpgave.Text。这样可以节省很多不相关的代码行。当你使用ShowDialog显示一个窗体时,控件是保证不会被销毁的,这正是你可以读取它们的值的原因。这就是为什么需要在创建这样的窗体时使用 using 语句。 - Cody Gray

1

FormTask中添加一个属性,例如String1,如下所示:

public string String1 {get; set;}

例如,在button1_Click中设置String1的值,

你可以在MainForm中访问该属性

FormTask formTask = new FormTask(exerciseType);   
formOpgaveInvoer.ShowDialog(); 
string str = formTask.String1;

1

表单只是普通的类。这意味着,您可以在其中创建属性。
因此:创建一个属性并将值分配给它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接