Отказ от ответственности 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 в форме или любое другое представление, которое вы создаете в формах.