6

以下是我将List()a 绑定到ComboBox控件的代码。Insert() method我尝试使用它向 CombBox 控件添加一些项目,not allowed因为它已分配给数据源。那么,如何从 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 
4

5 回答 5

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

于 2012-12-19T19:34:44.550 回答
1

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

请注意,该对象将是原始对象的 REFERENCE 而不是 COPY,这意味着如果您最初将数据源设置为字典,然后尝试提取它以添加您正在将项目添加到 SAME 字典中的项目。

所以在你的情况下:

 var colours2 = cmbColour.DataSource as List<KeyValuePair<string, string>>;
 // can add items to colours2 here (but it is the same instance as colours)
于 2012-12-19T19:34:10.597 回答
1
var coloursList = cmbColour.DataSource as List<KeyValuePair<string, string>>;
var colours2 = coloursList.ToDictionary(x => x.Key, x => x.Value);
于 2012-12-19T19:34:15.610 回答
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"));
于 2014-01-21T13:19:12.223 回答
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;
        }
    }
}
于 2012-12-19T20:17:27.603 回答