如果我在静态类中有一个字典随着数据随机更新,那么如果主窗体不是静态的,我该如何将这个字典传递给主窗体以在网格视图中显示它? 当然,如果我创建一个主要形式的新实例,每次我尝试做这个(每15秒)我将有多个主要形式,我将失去数据......对吗?
答案 0 :(得分:1)
你应该看看
答案 1 :(得分:1)
留下对你的设计的评论(对不起......抱歉无济于事)便宜又简单的事情就是让你的静态更新程序成为你的主要表单,让静态类手动更新你的表单。
public static class OmfgUpdater
{
private static MyForm _mainForm;
public static void RegisterForm(MyForm form)
{
_mainForm = form;
}
/*however this is done in your class*/
internal static void Update(Dictionary<string,string> updates)
{
_mainForm.Update(updates);
}
}
public class MyForm : Form
{
public MyForm()
{
OmfgUpdater.RegisterForm(this);
}
public void Update(Dictionary<string,string> updates)
{
/* oh look you got updates do something with them */
}
}
答案 2 :(得分:0)
免责声明1:您的问题中的陈述:“如果我创建一个新的mainform实例,每次尝试执行此操作时都会有多个mainforms(每15秒),我将丢失数据...... ?”对我来说一点也不清楚。我将通过解释你的语句来解释你想要一个静态字典,这意味着无论一个应用程序实例可以启动多少其他表单,你想要一个一个而且只有一个。
免责声明2:此处显示的代码也与Will的答案形成鲜明对比,静态类更新主表单。这里的答案根本没有涉及动态链接(数据绑定):这里没有代码可供用户在DataGridView中对表单进行更改,并进行反向传播以更新基础字典。
假设您希望每个应用程序实例只有一个且只有一个字典:如果您有一个公共静态类,它包含一个字典的公共静态实例,如:
public static class DictionaryResource
{
// make dictonary internal so the only way to access it is through a public property
internal static Dictionary<string, int> theDictionary = new Dictionary<string, int>();
// utility methods :
// 1. add a new Key-Value Pair (KVP)
public static void AddKVP(string theString, int theInt)
{
if (! theDictionary.ContainsKey(theString))
{
theDictionary.Add(theString, theInt);
}
}
// 2. delete an existing KVP
public static void RemoveKVP(string theString)
{
if (theDictionary.ContainsKey(theString))
{
theDictionary.Remove(theString);
}
}
// 3. revise the value of an existing KVP
public static void ChangeDictValue(string theString, int theValue)
{
if(theDictionary.ContainsKey(theString))
{
theDictionary[theString] = theValue;
}
}
// expose the internal Dictionary via a public Property 'getter
public static Dictionary<string,int> TheDictionary
{
get { return theDictionary; }
}
}
此时,您可以通过DataBinding技术在Form上实现动态更新Dictionary的内容,或者通过在静态类中的方法中定义自定义事件来引发这些事件:然后在Form上订阅这些事件,当您截取表单中的这些更改时,您可以采取措施更新您在表单上的任何表示。
以下是在静态类中定义自定义事件的示例:
// delegate signature
public delegate void addKVP(string sender, int value);
// delegate instance
public static event addKVP KeyValuePairAdded;
// delegate run-time dispatcher
public static void OnKVPAdded(string sender, int theInt)
{
if (KeyValuePairAdded != null)
{
KeyValuePairAdded(sender, theInt);
}
}
然后,作为如何在表单中订阅该自定义事件的示例:在本例中,在“加载事件:
中 DictionaryResource.KeyValuePairAdded += new DictionaryResource.addKVP(DictionaryResource_KeyValuePairAdded);
您在Form ...中定义了事件的处理程序... as:
private void DictionaryResource_KeyValuePairAdded(string theString, int theInt)
{
Console.WriteLine("dict update : " + theString + " : " + theInt);
}
在表单代码中执行的典型验证测试可能会调用:
DictionaryResource.AddKVP("hello", 100);
DictionaryResource.AddKVP("goodbye", 200);
显然,您可以在Form的处理程序中修改该代码,该处理程序现在只是向控制台打印报告,以修改表单上的DataGridView,或者您在表单上创建的任何其他表示。