我有一个主要表单,其中包含大部分功能。我只是想知道如何将变量从弹出窗体传递到该主窗体。
例如:
我有一个需要一些连接信息的主表单。因此,当您单击“输入连接信息”按钮时,它会打开一个新表单,用户可以在其中键入要用于连接的IP地址。
在这个新表单上,我有一个文本框和一个按钮,一旦你输入信息,它应该关闭并将包含ip的字符串传递回原始表单。
有什么建议吗?您是否认为有一种更好的方法来实现这一点,而不是使用Windows窗体,只是继续使用Windows窗体或其他东西?我现在对这个问题感到非常困惑。
答案 0 :(得分:3)
将文本框文本公开为公共只读属性。将连接表单显示为对话框,当它关闭时,从属性获取连接,然后处理表单:
在开放表单处理程序中(按钮单击,菜单,等等)
string connectionString = null;
using (ConnectionForm form = new ConnectionForm())
{
DialogResult result = form.ShowDialog();
if (result == DialogResult.Ok)
connectionString = form.ConnectionString
}
在您的连接表格中:
public class ConnectionForm: Form
{
....
public string ConnectionString { get { return textBox1.Text; } }
}
答案 1 :(得分:0)
您可以在主窗体中创建公共属性,并在弹出构造函数中传递主窗体实例。通过这种方式,您可以更改主窗体属性。
您还可以在弹出窗体中创建一个事件,并将其挂钩在主窗体中。
答案 2 :(得分:0)
引用将对话框Form上的控件绑定到父窗体的属性。
public dlgDbConnProps ( Form Owner )
{
// TODO: Complete member initialization
InitializeComponent ( );
owner = Owner;
}
private void cbo_ProviderLst_SelectedIndexChanged ( object sender, EventArgs e )
{
owner.Provider = cboLst.Text;
}
这是我实施的另一种方法:
...将Func传递给子表单构造函数:
public dlgRequestLogin ( Func<string, string, bool> LoginMethod )
{
InitializeComponent ( );
p_loginMethod = LoginMethod;
}
...然后处理按钮点击(或其他适当的事件):
private void cmd_SendLoginCredentials_Click ( object sender, EventArgs e )
{
bool res = p_loginMethod.Invoke ( txt_UserID.Text, txt_UserPassword.Text );
}
答案 3 :(得分:0)
我喜欢使用这样的模式(忍受我,c#不是我的第一语言):
public class ValueForm: Form
{
public static string GetFromUser(string originalValue)
{
using (ConnectionForm form = new ConnectionForm())
{
form.TheValue = originalValue;
var result = form.ShowDialog();
if (result == DialogResult.Ok)
return form.TheValue;
else
return originalValue;
}
}
public string TheValue {
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
/* also some code behind your OK & cancel buttons to set
DialogResult appropriately,
and do any validation that you need to do
*/
}
然后你会使用它:
string newValue = ValueForm.GetFromUser(oldValue);