C # WinForms Передача словаря из статического класса в класс нестатической формы - PullRequest
0 голосов
/ 27 января 2010

Если у меня есть словарь в статическом классе, который обновляется случайным образом с данными, как мне затем передать этот словарь в основную форму, чтобы отобразить его в виде сетки, если основная форма не является статической? Конечно, если я создам новый экземпляр основной формы, у меня будет несколько основных форм каждый раз, когда я пытаюсь сделать это (каждые 15 секунд), и я потеряю данные ...... верно?

Ответы [ 3 ]

1 голос
/ 27 января 2010

Оставляя комментарии к вашему дизайну (ура ... извините, ничего не поделаешь), дешевая и простая вещь - дать вашему статическому средству обновления свою основную форму и позволить статическому классу обновить вашу форму вручную.

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 */
  }
}
1 голос
/ 27 января 2010
0 голосов
/ 27 января 2010

Отказ от ответственности 1: утверждение в вашем вопросе: «если я создам новый экземпляр главной формы, у меня будет несколько основных форм каждый раз, когда я пытаюсь сделать это (каждые 15 секунд), и я потеряю данные ...... верно» ?» мне совсем не понятно. Я собираюсь ответить здесь, интерпретируя ваше утверждение, что вы хотите статический словарь, как означающее, что вы хотите один-единственный-единственный, независимо от того, сколько других форм может быть запущено одним экземпляром приложения.

Отказ от ответственности 2: Кроме того, код, который я здесь показываю, должен контрастировать с ответом Уилла, где статический класс обновляет основную форму. И здесь ответ вовсе не касается динамического связывания (привязки данных): здесь нет кода для того, чтобы пользователь вносил изменения в форму в 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, либо путем определения пользовательских событий в вызываемых методах статического класса: эти события затем подписываются на форму и когда вы перехватываете эти изменения в форме, вы можете предпринять действия для обновления любого представления, которое вы имеете в форме.

Вот пример определения пользовательского события в статическом классе:

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

Затем, в качестве примера того, как вы подписываетесь на это пользовательское событие в форме: в данном случае в событии «Load»:

        DictionaryResource.KeyValuePairAdded += new DictionaryResource.addKVP(DictionaryResource_KeyValuePairAdded);

Где вы определили обработчик для события ... в Форме ... как:

    private void DictionaryResource_KeyValuePairAdded(string theString, int theInt)
    {
        Console.WriteLine("dict update : " + theString + " : " + theInt);
    }

Типичный проверочный тест, выполняемый в коде формы, может иметь такие вызовы, как:

        DictionaryResource.AddKVP("hello", 100);
        DictionaryResource.AddKVP("goodbye", 200);

Очевидно, что вы изменили бы этот код в обработчике формы, который теперь выводит на консоль отчет, чтобы изменить ваш DataGridView в форме или любое другое представление, которое вы создаете в формах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...