【问题标题】:passing data from form2 into form1 and save it in a string variable将数据从 form2 传递到 form1 并将其保存在字符串变量中
【发布时间】:2015-05-20 04:06:43
【问题描述】:

我通过第二个构造函数将来自文本框的数据从 Form2 传递到 Form1。

之后,我想将 Form2 中的文本框值设置为 Form1 中的全局字符串变量。

如果我这样做,全局变量会得到我想要的值,但不会那么长。在我关闭 Form2 对话框(代码继续执行后this.Close())后,主构造函数再执行一次,我失去了全局字符串变量的值...

我有一个解决方法,我将文本框值保存到文本文件中,如果我想要其中的值,可以读取它,但这不是我要寻找的解决方案。

【问题讨论】:

  • 请贴出你目前写的代码
  • 可能值得研究使用模块来存储值。此外,您可能希望将 winforms 添加到标签中,这样人们就知道您正在专门寻找 Windows 表单解决方案,而不必单击问题来查找...
  • 使用会话变量...

标签: c#


【解决方案1】:

我认为您需要 Form2 中的公共属性。我过去做过这个(而且很简单而且效果很好),但我发布的不是经过测试的代码。不过,它应该可以帮助您入门。

表格 2 代码: public string CommunicationStuff {get;set;} // private set // if one-way communication CommunicationStuff = myTextBox.Text;

然后在你调用form2并关闭后在form1中,你可以说

FORM1 代码: Form2 subform = new Form2; subform.CommunicationStuff = "Default value based on program state"; subform.ShowDialog(); string results = subform.CommunicationStuff;

编辑:在搜索示例时,我发现了这个 SO 帖子:How to return a value from a Form in C#?

【讨论】:

  • 嗯,公共财产是关键。我没想到。谢谢
  • 如果您关闭 Form2,您将失去财产的价值。这与 OP 一开始遇到的问题完全相同。
  • 永远不要公开成员。使用private set
  • 你为什么要这样做?这取决于您打算如何处理该物业。
  • 在这种情况下,他的代码与“public string CommunicationStuff;”没有什么不同。这是一个公开的成员。你不应该公开成员。这就像 OOP 101
【解决方案2】:

有几种方法可以实现这一目标。您可以将静态属性存储在静态类中,将静态属性/属性存储在表单类中,或者将值存储在集合中。

示例 1

具有静态属性的静态类。

来源:

public static class FormValues
{
    private static string _message;
    public static string Message
    {
        get { return _message; }
        set
        {
            // Do stuff with value ...
            // Handle any errors with the value ...
            // Throwing an exception here will tell you which form it was thrown at too ...
            _message = value;
        }
    }
}

用法:

// Form1
FormValues.Message = "Hello Form2";

// Form2
string message = FormValues.Message;

示例 2

表单中的属性。

来源:

// Form1 etc.
public static string Form1GlobalMessage { get; private set; }
public string Form1Message { get; private set; }

用法:

// Form1
Form1Message = "This message is unique to this instance.";
Form1GlobalMessage = "This message is shared by all Form1 instances.";

// Form2
var form1 = new Form1();
string uniqueMessage = form1.Form1Message;
string globalMessage = Form1.Form1GlobalMessage;

以上所有表格都可以完成,并且可以随心所欲地使用。这只能在表单之外读取,因为只有 Form1 有权修改属性。如果您想通过从多个表单获取和设置来分享类似的内容,请使用示例 1

示例 3

一个价值集合。

在我看来,这可能是最少使用的解决方案,并且仅在您希望通过动态标识获取/设置动态值时才应使用。 Example 1Example 2 可用作在何处实现集合的参考。而不是属性,您只需放置一个集合 ex。 Dictionary<TKey,TValue>

来源:

// Example for the static class
public static class FormValues
{
    private static Dictionary<string,string> _messages;
    static FormValues()
    {
        _messages = new Dictionary<string, string>();
    }

    public static Dictionary<string,string> Messages
    {
        get { return _messages; }
    }
}

用法:

// Form1
FormValues.Messages.Add("Message", "Hello World!");
// Form2
string message = FormValues.Messages["Message"];

当然,还有很多其他的方法可以实现这种机制,这完全取决于你正在做什么和想要做什么,你以何种方式做到这一点。

不过,这应该有助于您理解这个概念。

【讨论】:

    【解决方案3】:

    我建议您使用专门用于存储和传递配置值的类。在以下示例中,您有一个可用于保存和检索变量“环境”的值的单例:

    public class GUIHelper
    {
        public static GUIHelper _instance = new GUIHelper();
        public static GUIHelper Instance { get { return _instance; }}
        public string Environment { get; set; }
    }
    
    public class Form2
    {
        public TextBox TextBox = new TextBox();
        public Form2()
        {
            TextBox.Text = GUIHelper.Instance.Environment;
        }
    }
    

    您甚至可以更进一步,将文本框的值绑定到 GUIHelper 的属性。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多