如何将Combobox.Datasource转换为字典?

6 c# winforms

以下是我的代码,它绑定List()到一个ComboBox控件.我试过几个项目添加到使用CombBox控制Insert() methodnot allowed,因为它已经被分配给一个数据源.那么,如何从返回对象的cmbColour.DataSource将数据返回到一个新变量(比如var colours2).Thanx!

var colours= new Dictionary<string, string>
            {
              {"1x","Green"},
              {"2x","Red"},
              {"3y","Blue"},
              {"4y","Black"}
            }.ToList();

cmbColour.ValueMember = "Key";
cmbColour.DisplayMember = "Value";
cmbColour.DataSource = colours;

var colours2 = //how can I get the DataSource back 
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 7

以下代码将返回一个新字典,其中包含绑定到组合框的相同数据.

var list = (List<KeyValuePair<String, String>>)cmbColor.DataSource;

var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Run Code Online (Sandbox Code Playgroud)

该属性DataSource将返回您指定的同一实例,但由于它是键入的,Object您必须先将其强制转换为实际类型,然后才能访问任何成员.

但你为什么不保留原字典?并且它肯定支持修改绑定到数据源的列表 - 这是数据绑定的全部要点.

我想我的答案并没有真正解决你的实际问题,只有你认为你的问题是什么.也许您可以提供一些有关您要实现的目标的其他信息,我或其他人将能够帮助您解决潜在问题.

UPDATE

这应该适用于您的场景 - 我坚持使用用户示例.

public class User
{
    public String Id { get; set; }

    public String Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和表单的代码.

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

注意使用BindingList<T>- 这将通知组合框有关列表的任何更改.一个简单的List<T>也可以工作但是你必须明确告诉组合框刷新数据绑定.