C#多形式变量

本文关键字:变量 多形式 | 更新日期: 2023-09-27 17:57:47

我有一个包含大部分功能的主窗体。我只是想知道如何将一个变量从弹出窗体传递到该主窗体。

例如:

我有一个主表单,需要一些连接信息。因此,当你点击"输入连接信息"按钮时,它会打开一个新的表单,用户可以键入他想用于连接的IP地址。

在这个新表单上,我有一个文本框和一个按钮,一旦你输入信息,它就会关闭并将包含ip的字符串传递回原始表单

有什么建议吗?你认为有比使用windows窗体更好的方法来实现这一点吗?我现在对这个问题很困惑。

C#多形式变量

将文本框文本公开为公共只读属性。将连接表单显示为对话框,当它关闭时,从属性获取连接,然后处理表单:

在打开的表单处理程序(按钮点击,菜单,任何)

 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; } }
 }

您可以在主窗体中创建一个公共属性,并在弹出式构造函数中传递主窗体实例。通过这种方式,您可以更改主窗体属性。

您也可以在弹出窗体中创建一个事件,并将其挂接到主窗体中。

我喜欢使用类似这样的模式(请记住,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);

引用将对话框窗体上的控件绑定到父窗体的属性。

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 );
}