c# - 如何获取 Combobox.Datasource 到字典?

标签 c# winforms

以下是我的代码,它将 List() 绑定(bind)到 ComboBox 控件。我尝试使用 Insert() 方法 向 CombBox 控件添加一些项目,这是 不允许 因为它已分配给数据源。那么,如何从返回对象的 cmbColour.DataSource 将数据源返回到新变量(例如,var colours2)。谢谢!

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 

最佳答案

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

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

var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

属性(property)DataSource将返回您分配的相同实例,但因为它的类型为 Object在访问任何成员之前,您必须将其转换回实际类型。

但是你为什么不只保留原始字典呢?并且绝对支持修改绑定(bind)到数据源的列表 - 这就是数据绑定(bind)的全部要点。

我想我的回答并不能真正解决你的实际问题,只能解决你认为你的问题是什么。也许你可以提供一些关于你想要实现的目标的额外信息,我或其他人将能够帮助你解决你的根本问题。

更新

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

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>也可以,但是您必须明确告诉组合框刷新数据绑定(bind)。

关于c# - 如何获取 Combobox.Datasource 到字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13959644/

相关文章:

c# - 如何防止 WinForms 失去焦点?

c# - C#中的抽象方法

c# - 月份和年份的日期时间格式

c# - 如何使 ListBox 中的第一项自动被选中?

c# - 系统.绘图.图形

c# - "The underlying connection was closed: An unexpected error occurred on a send."WebClient.OpenRead 错误(字符串链接)

c# - 如果安全不是问题,那么不可变接口(interface)是一个好的模式吗?

vb.net - 如何在 VB.Net 中自动对 Azure 信息保护的 Outlook 电子邮件敏感度进行分类?

c# - 如何将IP地址转换成MAC地址字节数组?

c# - 在 DateTimePicker 中处理点击 Today