【问题标题】:Passing object to different windows forms将对象传递给不同的窗体
【发布时间】:2010-06-02 11:54:08
【问题描述】:

我想在 win 表单之间传递一个 C# 对象。目前,我已经设置了一个基本项目来学习如何做到这一点,它由两个表单组成 - form1 和 form2 以及一个名为 class1.cs 的类,其中包含 get 和 set 方法来设置一个字符串变量,其中输入了一个在 form1 中的值。 (形式2应该是获取class1对象中存储的值)

如何从 form1 中设置的对象中获取字符串值?我需要将它作为参数传递给form2吗?

任何 cmets/help 都会被接受!

谢谢,

编辑:这是我目前拥有的代码:(form1.cs)

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();

        Form2 form2 = new Form2();

        form2.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (textBox1.Text != "")
        {
            Class1 class1 = new Class1();

            class1.setStringValue(textBox1.Text);
        }
    }
}

}

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    有几种不同的方法可以做到这一点,您可以使用静态类对象,上面的示例非常适合此活动。

    public static class MyStaticClass
    {
      public static string MyStringMessage {get;set;}
    }
    

    您不需要实例化该类,只需调用它

    MyStaticClass.MyStringMessage = "Hello World";
    Console.WriteLine (MyStaticClass.MyStringMessage);
    

    如果你想要一个对象的实例,你可以将你在 Form1 上创建的类对象传递给 Form2,如下所示。

    private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form2 form2 = new Form2();
            form2.MyClass = class1;
            form2.Show();
        }
    

    然后在 Form2 上创建一个属性来接受类对象。

    public Class1 MyClass {get;set;}
    

    记得将 Class1 对象设为全局变量,而不是在按钮 2 本身内创建它。

    【讨论】:

    • 感谢代码 sn-p,Sres。您是否会使用静态类,例如,如果您想使用一个类来存储不需要很多实例的东西,例如应用程序的设置?然而,如果需要,可以使用标准类创建多个实例,例如用户对象?
    • 正是如此,我在很多地方使用静态类来保存数据库连接详细信息、CurrentUser 详细信息。请小心,尤其是如果您获得可能更改的数据,您最终可能会得到过时的信息。
    【解决方案2】:

    是的,在 Form1 中声明一个 Class1 的实例,然后根据需要设置参数,然后将其传递给 Form2。例如,您可以在 Form2 中有一个构造函数,并在其中有一个 Class1 参数。假设Form1创建了Form2,否则你必须有办法让Form1找到Form2来传递实例。

    【讨论】:

    • 感谢您的回复。我已经编辑了我的问题并添加了 form1.cs 的代码 - 我如何将对象实例传递给 form2,因为当单击不同的按钮时正在调用 form2.show()?你能举个例子吗?
    • 与其在 button1 事件处理程序中声明Form2 form2 = new ...,不如将​​其声明为类的成员。这样,您就可以在 button1 事件处理程序中调用 Form2.Show(),也可以在 button2 处理程序中调用 From2.ShowNewValues(class1) 之类的东西。
    • 在这里你可以找到一个班级成员的样本:csharp-station.com/Tutorials/Lesson07.aspx
    • 这是有道理的,但我是否必须在 class1.cs 中有 get 和 set 方法,在 form2.cs 中有一个 get 方法才能获取存储在 class1 的对象实例中的数据?或者我会在form2方法ShowNewValues()中调用get方法吗?
    • 无论哪种方式,但我可能会在 ShowNewValues 方法中调用 class1.GetSomething 来获取值,然后立即使用它们。虽然您可能希望将整个 class1 实例的副本存储为 Form2 的成员,如果您稍后要使用相同的值。
    【解决方案3】:

    自从过去几年我一直在 ASP.Net 中工作以来,我发现自己经常使用 Newtonsoft.Json。结果证明在 WinForms 中也很棒,在这种情况下,似乎简化了表单之间的对象传递……即使是复杂的对象也是轻而易举的事!

    实现是这样的:

    // Set Object Property within Form
     public partial class FlashNotify : Form
     {
         public string Json { get; set; }
     }
    

    在表单加载事件中,您可以抓取您的对象:

     private void FlashNotify_Load(object sender, EventArgs e)
     { 
        // Deserialize from string back to object
        CommUserGroupMessage msg = new CommUserGroupMessage();
        msg = Newtonsoft.Json.JsonConvert.DeserializeObject<CommUserGroupMessage>(Json);
     }
    

    最后是将对象传递给表单:

    // Serialize the Object into a string to pass
     string json = Newtonsoft.Json.JsonConvert.SerializeObject(msg);
     FlashNotify fn = new FlashNotify();
     fn.Json = json;
     fn.Show();
    

    授予最初选择的答案可能更容易,但是我喜欢这种方法因为它避免了在表单中复制类的需要,我认为这更容易维护更正: 没看错示例中的静态类,我一开始还以为是复制到form里面)。

    【讨论】:

    • “避免在表单中复制类” - 嗯?
    【解决方案4】:

    使用 Delegate,您可以轻松地将数据传递给表单。

    从技术上讲,委托是一种引用类型,用于封装具有特定签名和返回类型的方法

    第 1 步

    向form1添加委托签名,如下所示:

    public delegate void delPassDataToFrom(Object obj);
    

    第 2 步 在 form1 的任意按钮单击事件处理程序中,实例化 form2 类并委托。将form2中的函数分配给委托并调用委托如下:

    private void btnSend_Click(object sender, System.EventArgs e)
    {
       Form2 frm = new Form2();
       delPassDataToFrom del = new delPassDataToFrom(frm.retrieveData);
       del(objectToPass);
       frm.Show();
    }
    

    第 3 步

    在form2中,添加一个委托应该指向的函数。此函数将使用传递的对象:

    public void retrieveData(Object objPassedFromParent)
    {
      //use the objPassedFromParent object as needed
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2015-01-31
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多