如何在其他表格上设置字典值?

时间:2011-05-29 07:13:44

标签: c# winforms

我是C#初学者,我遇到了如下问题,但我不确定是什么导致它或如何解决它。经验编程员,请帮助。

我在Form1中有一个Dictionary,但我想从Form2设置它的值。但是,在分配值后,MessageBox结果仍显示0;

Form1:msgbox show result = 0

    public Form1()
    {
        InitializeComponent();
        bidcoords["TEST"] = 0;
    }

    public Dictionary<string, int> bidcoords = new Dictionary<string, int>();

    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show(bidcoords["TEST"].Value.ToString());
    }

窗体2:

    Form1 form1 = new Form1();

    private void button2_Click(object sender, EventArgs e)
    {
       form1.bidcoords["TEST"] = 30; 
    }

3 个答案:

答案 0 :(得分:4)

Form1 form1 = new Form1();

您正在创建Form1的全新对象。而不是这个,你需要将form1的现有实例传递给from2。但我建议你只传递字典对象而不是表单

public class Form2 : Form
{
    public Dictionary<string, int> Bidcoords {get; set;}

    private void button2_Click(object sender, EventArgs e)
    {
        if(Bidcoords != null && Bidcoords.ContainsKey("TEST"))
           Bidcoords["TEST"] = 30;
    }
}

public class Form1: Form
{
    public void ShowForm2()
    {
        Form2 form = new Form2{Bidcoords = bidcoords ;}
        form.ShowDialog();
        MessageBox.Show(bidcoords["TEST"].Value.ToString());
    }
}

答案 1 :(得分:4)

在您的计划中的某个时刻,您正在创建Form2并展示它。那时你在Form1。您可以在屏幕上看到的Form1是您尝试更新的表单。如果您尝试使用Form1创建另一个new,那么您将拥有两个Form1个实例,这不是您想要的。

您需要在Form1Form2 Form1之间进行通信。

执行此操作有两种常用方法:

  1. 将名为MainForm的媒体资源添加到Form2。创建Form2后,请设置form2.MainForm = this;
  2. Form2添加一个构造函数,该构造函数将Form作为参数并将其保存
  3. 在任何一种情况下,当你在Form2时,使用该变量来设置字典。

答案 2 :(得分:0)

如果您只需要一个常见的词典,则应将其声明为单身

public class DictionarySingleton
{
    public static readonly Dictionary<string, int> Instance = new Dictionary<string, int>();
}

所以你可以从两个表单访问它,甚至有几个同一个类的表单实例改变相同的字典,就像在前面的帖子中所说的那样,你正在创建另一个Form1实例,从而创建你的字典的另一个实例。

从任何地方访问您的字典:

DictionarySingleton.Instance["foo"]=0;