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

时间:2012-12-19 19:25:01

标签: c# winforms

以下是我的代码,它将List()绑定到ComboBox控件。我尝试使用Insert() methodnot allowed添加到CombBox控件中,因为它已分配给数据源。那么,如何从返回对象的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 

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

由于DataSource被输入为object,因此没有一种简洁的方法可以从中提取数据。如果您知道数据源的基础类型(意味着您将其设置在其他位置以便知道它是什么类型),您可以将其强制转换并将项目添加到集合中。

请注意,该对象将是REFERENCE而不是原始对象的COPY,这意味着如果您最初将数据源设置为字典,则尝试将其解压缩以将要添加项目的项目添加到SAME字典中。 / p>

所以在你的情况下:

 var colours2 = cmbColour.DataSource as List<KeyValuePair<string, string>>;
 // can add items to colours2 here (but it is the same instance as colours)

答案 2 :(得分:1)

var coloursList = cmbColour.DataSource as List<KeyValuePair<string, string>>;
var colours2 = coloursList.ToDictionary(x => x.Key, x => x.Value);

答案 3 :(得分:0)

您可以使用以下演员来获取数据。

namespace WebApplication2
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var colours = new Dictionary<string, string>
            {
                {"1x", "Green"},
                {"2x", "Red"},
                {"3y", "Blue"},
                {"4y", "Black"}
            }.ToList();

            cmbColour.DataSource = colours;

            List<KeyValuePair<string, string>> l1 = new List<KeyValuePair<string, string>>();

            l1 = (List<KeyValuePair<string, string>>)cmbColour.DataSource;
        }
    }
}

答案 4 :(得分:0)

List<KeyValuePair<String, String>> c = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("m", "n"),
            new KeyValuePair<string, string>("k", "c")
        };

comboBox1.DataSource = c;

c.Add(new KeyValuePair<string, string>("new","new value"));

var list = (List<KeyValuePair<String, String>>)comboBox1.DataSource;
list.Add(new KeyValuePair<string, string>("new", "new value"));