C# 如何将Combobox.Datasource获取到字典?

C# 如何将Combobox.Datasource获取到字典?,c#,winforms,C#,Winforms,下面是我的代码,它将List()绑定到组合框控件。我尝试使用Insert()方法向CombBox控件添加一些项,这是不允许的,因为它已分配给数据源。那么,如何从返回对象的cmbColour.DataSource将datasouce返回到一个新变量(例如,var colors2)。塔克斯 var colours= new Dictionary<string, string> { {"1x","Green"},

下面是我的代码,它将
List()
绑定到
组合框
控件。我尝试使用
Insert()方法向CombBox控件添加一些项,这是
不允许的
,因为它已分配给数据源。那么,如何从返回对象的cmbColour.DataSource将datasouce返回到一个新变量(例如,var colors2)。塔克斯

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 
var colors=新字典
{
{“1x”,“绿色”},
{“2x”,“红色”},
{“3y”,“蓝色”},
{“4y”,“黑色”}
}.ToList();
cmbColour.ValueMember=“Key”;
cmbColour.DisplayMember=“值”;
cmbColour.DataSource=颜色;
var colors2=//如何取回数据源

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

请注意,该对象将是一个引用,而不是原始对象的副本,这意味着如果您最初将数据源设置为字典,然后尝试将其提取以添加项,您将向同一字典添加项

因此,在你的情况下:

 var colours2 = cmbColour.DataSource as List<KeyValuePair<string, string>>;
 // can add items to colours2 here (but it is the same instance as colours)
var colors2=cmbColour.DataSource作为列表;
//可以在此处向颜色2添加项目(但与颜色相同)
var colorslist=cmbColour.DataSource作为列表;
var colors2=colorslist.ToDictionary(x=>x.Key,x=>x.Value);

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

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

var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
以及表单的代码

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.
    }
}
public分部类MainForm:Form
{
私有只读BindingList recentlyAddedUsers=new BindingList();
私有void MainFormLoad(对象发送方,事件参数)
{
this.comboBoxRecentlyAddedUsers.DataSource=this.recentlyAddedUsers;
this.comboBoxRecentlyAddedUsers.ValueMember=“Id”;
this.comboBoxRecentlyAddedUsers.DisplayMember=“Name”;
var recentlyaddededUsersFromService=this.GetRecentlyAddedUsers();
foreach(最近AddedUsersFromService中的var用户)
{
this.recentlyAddedUsers.Add(用户);
}
}
私有无效按钮DNewUserClick(对象发送方,事件参数e)
{
var newUser=newUser();
newUser.Id=this.textBoxUserId.Text;
newUser.Name=this.textBoxUserName.Text;
这个.SaveNewUser(newUser);
此.recentlyAddedUsers.RemoveAt(0);
this.recentlyAddedUsers.Insert(newUser);
}
私有列表GetRecentlyAddedUsers()
{
//从数据库中获取最近添加的用户列表。
}
私有void SaveNewUser(用户用户)
{
//将新用户保存到数据库中。
}
}

注意
BindingList
的用法-这将通知组合框列表的任何更改。一个简单的
列表
也会起作用,但是您必须明确地告诉组合框刷新数据绑定。

您可以使用以下cast返回数据

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;
        }
    }
}
命名空间WebApplication2
{
公共部分类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
新字典
{
{“1x”,“绿色”},
{“2x”,“红色”},
{“3y”,“蓝色”},
{“4y”,“黑色”}
}.ToList();
cmbColour.DataSource=颜色;
列表l1=新列表();
l1=(列表)cmbColour.DataSource;
}
}
}
列表c=新列表
{
新的KeyValuePair(“m”、“n”),
新的KeyValuePair(“k”、“c”)
};
comboBox1.DataSource=c;
c、 添加(新的KeyValuePair(“新”、“新值”));

var list=(list)comboBox1.DataSource;
添加(新的KeyValuePair(“新”、“新值”));

请注意,op在将字典分配给数据源之前会调用该字典上的ToList(),因此尝试将其强制转换为字典将返回null。如果您知道该值始终属于要强制转换的类型,请不要将
用作
。如果您希望
x
始终为string类型,请使用
(string)x
,因为如果您引入错误并且
x
恰好不是string类型,它将引发异常。使用
x作为字符串
时,错误将保持不被注意,它看起来就像
x
null
+1,这就像一个符咒!!!实际上,我需要在列表中保留选定的项目数,并在顶部添加一个,从列表底部删除一个。来自web服务的初始列表。因此,您从服务获取列表,在位置0处插入一个新元素,删除最后一个元素并将更新的列表绑定到组合框?是的,这是正确的。我想向用户显示最近的5项,这样他就可以选择任何一项从web服务再次请求相关数据(不同的调用)。为什么以后要恢复词典?获取
SelectedValue
SelectedIndex
还不够吗?我想你误解了。在表单加载时,我使用服务从服务器获得最近添加的(比如用户)。对吗?这个windows应用程序可以整天向服务器添加越来越多的用户。组合框显示最近添加的用户名。应用程序用户可以再次选择其中任何一个,使用selectedValue(用户名)从服务器检索(比如用户详细信息)。您正在创建一个新列表,并将其分配给
l1
,以便在下一条语句中将其丢弃。次要细节-问题是关于WinForms,而不是WebForms,但这并不重要。
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.
    }
}
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;
        }
    }
}
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"));