我是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;
}
答案 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
个实例,这不是您想要的。
您需要在Form1
和Form2
Form1
之间进行通信。
执行此操作有两种常用方法:
MainForm
的媒体资源添加到Form2
。创建Form2
后,请设置form2.MainForm = this;
Form2
添加一个构造函数,该构造函数将Form
作为参数并将其保存在任何一种情况下,当你在Form2
时,使用该变量来设置字典。
答案 2 :(得分:0)
如果您只需要一个常见的词典,则应将其声明为单身
public class DictionarySingleton
{
public static readonly Dictionary<string, int> Instance = new Dictionary<string, int>();
}
所以你可以从两个表单访问它,甚至有几个同一个类的表单实例改变相同的字典,就像在前面的帖子中所说的那样,你正在创建另一个Form1实例,从而创建你的字典的另一个实例。
从任何地方访问您的字典:
DictionarySingleton.Instance["foo"]=0;