以下是我的代码,它将List()
绑定到ComboBox
控件。我尝试使用Insert() method
将not 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
答案 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"));