【问题标题】:Sharing a variable between two winforms在两个winforms之间共享一个变量
【发布时间】:2012-10-20 04:54:30
【问题描述】:

我有一个 winforms 应用程序。

我在一个表单上有一个文本框(调用 F1),当单击此表单上的按钮(调用 F2)时,它会启动另一个表单。

在F2上,我想通过一个文本框设置一个字符串(并将其保存到类中的一个变量中),然后当我关闭这个表单时,该字符串将出现在F1的一个标签中。

所以我基本上是在两种形式之间共享变量。但是,我无法让它正常工作。这段代码看起来如何?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我会在 form2 中添加一个新属性。说是电话号码。然后我会添加一个朋友属性 m_phone() 作为字符串到表单 2。在显示 form2 的实例后但在关闭它之前,您可以参考 form1 代码中的属性 m_phone。

    这是 Matthew Abbott 解决方案的额外间接级别。它不会将 form2 UI 控件暴露给 form1。

    编辑

    例如:

    public string StoredText
    {
        get;
        private set;
    }
    

    在set里面你可以引用你的UI控件,比如return textBox1.text。使用 get 设置先前加载的文本框值。

    还有:

    public string GetSomeValue()
    {
        var form = new F2();
        form.ShowDialog();
    
        return form.StoredText;
    }
    

    只需确保在关闭表单之前填充(或不填充,如果合适的话)StoredText

    【讨论】:

    • 完全同意,我应该知道,您应该真正提供属性来访问值而不是公开 UI 字段。我已编辑您的答案并为该属性 +1。
    • 只是好奇-为什么要公开而不是朋友?我认为不需要在 .sln 之外读取此属性
    • 在我的具体情况下,不必如此。无论如何,这很好。
    【解决方案2】:

    您是否将第二种形式显示为对话框,这可能是最好的方法。如果您可以避免使用共享变量,则可以执行以下操作:

    public string GetSomeValue()
    {
        var form = new F2();
        form.ShowDialog();
    
        return form.TextBox1.Text;
    }
    

    并在代码中调用:

    Label1.Text = GetSomeValue();
    

    【讨论】:

      【解决方案3】:

      这可能不是最有效的方法,但您可以创建一个名为 DB(数据库)的类。在这个类中,创建像

      这样的变量

      public static bool testpublic static bool[] test = new bool[5];

      在您的其他表单中,您可以只创建一个实例。 DB db = new DB(); 然后使用db.test = true/false 获取信息。这就是我一直在做的,而且效果很好。

      对不起,我只晚了一年。

      【讨论】: