2009-06-04 3 views
1

У меня есть список информации в строковом словаре, который я хочу сохранить в app.config для моей программы.Как вы храните и извлекаете StringDictionary в app.config?

Я создал запись в разделе «настройки» программы под названием «extions», но когда я перехожу к использованию «Settings.Default.Extentions», я получаю сообщение об ошибке, которое равно null.

Есть ли уловка или что-то в этом смысле?

private void LoadextList() 
{ 
    listBox1.Items.Clear(); 
    foreach (KeyValuePair<string, string> kvp in Settings.Default.Extentions) 
    { 
     listBox1.Items.Add(kvp.Key + "\t" + kvp.Value); 
    } 
} 
+0

Можете ли вы вставить код/​​скриншот, в котором вы создали расширения? – Grzenio

+0

Я создал расширения в свойствах проекта под настройками как collection.special.stringdictonary (я могу опубликовать экранный gab, если вы действительно этого хотите) – Crash893

+0

Я также должен отметить, что я могу сделать это со строкой в ​​app.config , Я просто запутался, как это сделать со строковым словарем. – Crash893

ответ

1

Я не понимаю вашу проблему Extensions, но я использовал этот код, прежде чем конвертировать между строкой и NameValueCollection - вы можете легко изменить его использовать StringDictionary:

public NameValueCollection StringToNameValueCollection(string KeyValueData, char KeyValueSeparator, char ItemSeparator) 
    { 
     NameValueCollection nvc = new NameValueCollection(); 

     // split string into array of key/value pairs 
     string[] kvpairs = KeyValueData.Split(new char[]{ItemSeparator}); 

     // add each pair to the collection 
     for (int i = 0; i < kvpairs.Length; i++) 
     { 
      if (!string.IsNullOrEmpty(kvpairs[i])) 
      { 
       if (kvpairs[i].Contains(KeyValueSeparator.ToString())) 
       { 
        // get the key 
        string k = kvpairs[i].Remove(kvpairs[i].IndexOf(KeyValueSeparator.ToString())).Trim(); 
        // get the value 
        string v = kvpairs[i].Remove(0, kvpairs[i].IndexOf(KeyValueSeparator) + 1).Trim(); 

        // add key/value if key is valid 
        if (!string.IsNullOrEmpty(k)) 
        { 
         nvc.Add(k, v); 
        } 
       } 
       else 
       { 
        // no key/value separator in the pair, so add whole string as key and value 
        nvc.Add(kvpairs[i].Trim(), kvpairs[i].Trim()); 
       } 
      } 
     } 
     return nvc; 
    } 

Преобразовать NameValueCollection в строку:

public string NameValueCollectionToString(NameValueCollection nvc, char KeyValueSeparator, char ItemSeparator) 
    { 
     StringBuilder sb = new StringBuilder(); 

     for(int i = 0; i < nvc.Count; i++) 
     { 
      if (i != 0) 
      { 
       sb.Append(ItemSeparator); 
      } 
      sb.Append(nvc.Keys[i]); 
      sb.Append(KeyValueSeparator); 
      sb.Append(nvc[i]); 
     } 

     return sb.ToString(); 
    } 

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

+0

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

+0

Теперь я разобрался, но ваш первый метод выдает сообщение об ошибке, что не все пути дают ответ (возможно, я смогу это выяснить, но вы можете изменить свой код для масс) – Crash893

+0

Спасибо, похоже, пропущен скобка теперь должно быть хорошо. – Nick

0
public Dictionary<string,string> StringToDictonary(string KeyValueData, char KeyValueSeparator, char ItemSeparator) 
{ 
    Dictionary<string, string> Dic = new Dictionary<string, string>(); 

    string[] cells = KeyValueData.Split(ItemSeparator); 
    foreach (string cell in cells) 
    { 
     if (!string.IsNullOrEmpty(cell)) 
     { 
      string[] value = cell.Split(KeyValueSeparator); 
      if (!string.IsNullOrEmpty(value[0]) && !string.IsNullOrEmpty(value[1])) 
      { 
       Dic.Add(value[0], value[1]); 
      } 
     } 
    } 
    return Dic; 
} 

перерыв

public string dictonaryToString(Dictionary<string, string> nvc, char KeyValueSeparator, char ItemSeparator) 
    { 
     StringBuilder sb = new StringBuilder(); 
     bool first = true; 
     foreach (KeyValuePair<string,string> kvp in nvc) 
     { 
      if (!first) 
      { 
       sb.Append(ItemSeparator); 
       first = false; 
      } 
      sb.Append(kvp.Key); 
      sb.Append(KeyValueSeparator); 
      sb.Append(kvp.Value); 
     } 
     return sb.ToString(); 
    } 
} 
1

Следующий вопрос, вероятно, содержит полезную информацию:

How to store a HashTable in the usersettings?

Проблема вы столкнулись в том, что два варианта сериализации, доступные при использовании настроек. файл настроек и связанный с ним автоматически сгенерированный класс сериализуются в XML или сериализуются в строку.

Класс StringDictionary не поддерживает ни XML, ни сериализацию строк. Есть несколько способов, которыми вы можете обойти это ограничение, и некоторые из них перечислены в ответах на ранее упомянутый вопрос.

Смежные вопросы