この質問は、数人から 100 回質問され、回答されています。ただし、まだ問題があるようです。データベース内の整数である列への DataBinding を持つ ComboBox があります。ComboBox DataSource を設定する Dictionary クラスがあります。フォームを実行すると、コンボボックスに何も表示されないか、辞書の「テキスト」ではなく、データベースの整数値が表示されます。フォームがどのように見えるかの写真を添付しました。
この ComboBox を生成するために使用されるコードは次のとおりです。
public static SortedDictionary<int, string> SecurityCodes()
{
SortedDictionary<int, string> SecurityCodes = new SortedDictionary<int, string>
{
{1, "View only"},
{3, "Print reports"},
{4, "Post changes"},
{5, "Edit records"},
{6, "Revise postings"},
{7, "Add records"},
{8, "Remove postings"},
{9, "Supervisor"},
{10, "Programmer"}
};
return SecurityCodes;
}
this.cboSecurity.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.loginInfoBindingSource, "Security_Level", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.cboSecurity.DataSource = new BindingSource(BaseDictionaries.SecurityCodes(), null);
this.cboSecurity.DisplayMember = "Value";
this.cboSecurity.ValueMember = "Key";
ここで、DataBinding を「Text」ではなく「ValueMember」に変更すると、テキストは表示されますが、別のレコードに移動しても更新されず、常に Dictionary の最初の項目に残ります。DataBinding を、ディクショナリにあるものと一致するエントリを持つビューに変更すると、DataBinding が "Text" に設定された適切な "Text" が ComboBox に表示されます。それは問題ありませんが、これらのエントリだけでデータベース内のテーブルを維持する必要があり、そのルートには行きたくありません。
誰かが私が間違ったことを見ることができますか?
以下を含むさまざまな種類の DataSource の組み合わせを試しましたが、動作は変わりません。
SortedDictionary<int, string> loDataSource = BaseDictionaries.SecurityCodes();
KeyValuePair<int, string>[] kvp = new KeyValuePair<int,string>[loDataSource.Count];
loDataSource.CopyTo(kvp,0);
new BindingSource(kvp, "Key");
this.cboSecurity.DataSource = kvp;