C#WinForms将字典从静态类传递到非静态表单类

时间:2010-01-27 14:39:14

标签: c# winforms

如果我在静态类中有一个字典随着数据随机更新,那么如果主窗体不是静态的,我该如何将这个字典传递给主窗体以在网格视图中显示它? 当然,如果我创建一个主要形式的新实例,每次我尝试做这个(每15秒)我将有多个主要形式,我将失去数据......对吗?

3 个答案:

答案 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,或者您在表单上创建的任何其他表示。