次のコードは、コンボボックスにバインドしたものと同じデータを含む新しい辞書を返します。
var list = (List<KeyValuePair<String, String>>)cmbColor.DataSource;
var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
プロパティDataSource
は、割り当てたものと同じインスタンスを返しますが、型指定されているためObject
、メンバーにアクセスする前に、実際の型にキャストして戻す必要があります。
でも、元の辞書だけを残してみませんか?また、データソースにバインドされたリストを変更することは確実にサポートされています。これがデータバインディングの要点です。
私の答えはあなたの実際の問題を実際に解決するのではなく、あなたがあなたの問題が何であると思うかだけを解決すると思います。たぶん、あなたはあなたが達成しようとしていることについていくつかの追加情報を与えることができ、私または他の誰かがあなたの根本的な問題についてあなたを助けることができるでしょう。
アップデート
これはあなたのシナリオでうまくいくはずです-私はユーザーの例に固執します。
public class User
{
public String Id { get; set; }
public String Name { get; set; }
}
そして、フォームのコード。
public partial class MainForm : Form
{
private readonly BindingList<User> recentlyAddedUsers = new BindingList<User>();
private void MainFormLoad(Object sender, EventArgs e)
{
this.comboBoxRecentlyAddedUsers.DataSource = this.recentlyAddedUsers;
this.comboBoxRecentlyAddedUsers.ValueMember = "Id";
this.comboBoxRecentlyAddedUsers.DisplayMember = "Name";
var recentlyAddedUsersFromService = this.GetRecentlyAddedUsers();
foreach (var user in recentlyAddedUsersFromService)
{
this.recentlyAddedUsers.Add(user);
}
}
private void ButtonAddNewUserClick(Object sender, EventArgs e)
{
var newUser = new User();
newUser.Id = this.textBoxUserId.Text;
newUser.Name = this.textBoxUserName.Text;
this.SaveNewUser(newUser);
this.recentlyAddedUsers.RemoveAt(0);
this.recentlyAddedUsers.Insert(newUser);
}
private List<User> GetRecentlyAddedUsers()
{
// Get a list of recently added users from the database.
}
private void SaveNewUser(User user)
{
// Save the new user to the database.
}
}
-の使用法に注意してくださいBindingList<T>
。これにより、リストへの変更がコンボボックスに通知されます。単純なList<T>
ものでも機能しますが、データバインディングを更新するようにコンボボックスに明示的に指示する必要があります。