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

本文关键字:设置 字典 表单 其他 | 更新日期: 2023-09-27 17:57:58

我是C#初学者,遇到了如下问题,但我不确定是什么原因导致的,也不知道如何解决。有经验的程序员,请提供帮助。

我在Form1中有一个Dictionary,但我想从Form2设置它的值。然而,在赋值之后,MessageBox结果仍然显示为0;

Form1:msgbox显示结果=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; 
    }

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

Form1 form1 = new Form1();

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

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

在程序中的某个时刻,您正在创建Form2并显示它。此时,您正处于Form1中。Form1,也就是你在屏幕上看到的那个,就是你试图更新的表单。如果您尝试使用new创建另一个Form1,那么您将只拥有两个Form1实例,这不是您想要的。

您需要在Form1Form2之间通信Form1的实例。

有两种常见的方法:

  1. 将名为MainForm的属性添加到Form2。创建Form2后,设置form2.MainForm = this;
  2. Form2添加一个以Form为参数的构造函数,并将其保存

在任何一种情况下,当您处于Form2时,都可以使用该变量来设置字典。

如果您只需要一个公共dictionay,则应将其声明为单例

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

因此,您可以从两个表单访问它,甚至可以让同一类的多个表单实例更改同一字典,就像前面的文章中所说的那样,您正在创建Form1的另一个实例,从而创建字典的另一实例。

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

DictionarySingleton.Instance["foo"]=0;