2009-06-04 20 views
1

私のプログラムのapp.configに格納する情報のリストが文字列辞書にあります。app.configにStringDictionaryを格納して取得するにはどうすればよいですか?

私はプログラムの "設定"部分に "extentions"という名前のエントリを作成しましたが、 "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

私はコレクションの設定でプロジェクトのプロパティにエクステンションを作成しました.special.stringdictonary(あなたが本当にそれを望むなら、私はスクリーンギャブを投稿できます) – Crash893

+0

私はapp.configの文字列でこれを行うことができます。私はちょうど文字列辞書でそれを行う方法を混乱させる。 – Crash893

答えて

1

私はあなたの拡張機能の問題を理解していないが、私は、文字列と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(); 
    } 

私が使用したコードからいくつかの変更を加えなければなりませんでしたが、ビルドする必要があります。あまりにも寛容ではないことに注意してください。セパレータ文字は、 'key'または 'value'のいずれの文字列にも現れません。

+0

私はまだ私がそのstringdictonaryを保存することができない理由を知っていないについての基礎を欠いているように感じる。 – 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も文字列のシリアル化もサポートしていません。この制限を回避するにはいくつかの方法があり、そのうちのいくつかは前述の質問に対する回答に記載されています。

関連する問題