.net 如何将datagridview绑定到对象包含列表属性的集合?
像往常一样,我觉得好像我错过了一些明显的东西,但我无法弄明白这一点,也无法在网上找到任何东西(尽管我找到了一些几乎描述了我所追求的东西的帖子),尽管我确信我尝试做的事情很普遍 假设我有一个清单:.net 如何将datagridview绑定到对象包含列表属性的集合?,.net,data-binding,datagridview,.net,Data Binding,Datagridview,像往常一样,我觉得好像我错过了一些明显的东西,但我无法弄明白这一点,也无法在网上找到任何东西(尽管我找到了一些几乎描述了我所追求的东西的帖子),尽管我确信我尝试做的事情很普遍 假设我有一个清单: public class Person { public int ID { get; set; } public string Name { get; set; } public List<string> Nicknames { get; set; } } 公共类
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public List<string> Nicknames { get; set; }
}
公共类人物
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表昵称{get;set;}
}
只需绑定到datagridview并在组合框列中显示每个人的昵称。这是怎么做到的?我可以一行一行地手动加载它们,但无法确定如何将它们指定为DGV的数据源
我试过这样的东西,但运气不好:
private void CreateColumns()
{
BindingList<Person> people = GetAllPeople();
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.HeaderText = "ID";
col.DataPropertyName = "ID";
dataGridView1.Columns.Add(col);
col = new DataGridViewTextBoxColumn();
col.HeaderText = "Name";
col.DataPropertyName = "Name";
dataGridView1.Columns.Add(col);
DataGridViewComboBoxColumn colCombo = new DataGridViewComboBoxColumn();
//colCombo.DataPropertyName = "Nicknames";
colCombo.DataSource = (from p in people select p.Nicknames.ToString()).ToList();
colCombo.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
colCombo.HeaderText = "Nicknames";
dataGridView1.Columns.Add(colCombo);
dataGridView1.DataSource = people;
}
private void CreateColumns()
{
BindingList-people=GetAllPeople();
DataGridViewTextBoxColumn=新DataGridViewTextBoxColumn();
col.HeaderText=“ID”;
col.DataPropertyName=“ID”;
dataGridView1.Columns.Add(col);
col=新的DataGridViewTextBoxColumn();
col.HeaderText=“Name”;
col.DataPropertyName=“Name”;
dataGridView1.Columns.Add(col);
DataGridViewComboxColumn colCombo=新DataGridViewComboxColumn();
//colCombo.DataPropertyName=“昵称”;
colCombo.DataSource=(从people中的p选择p.昵称.ToString()).ToList();
colCombo.AutoSizeMode=DataGridViewAutoSizeColumnMode.Fill;
colCombo.HeaderText=“昵称”;
dataGridView1.Columns.Add(colCombo);
dataGridView1.DataSource=人;
}
谢谢你在这方面的任何想法。我有一种感觉,当这个问题得到回答时,我会想拍自己的前额。不要拍自己的前额,恐怕你必须手动一行一行地加载它们。我将这样的代码放在DataGridView的DataBindingComplete事件处理程序中:
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {
foreach (DataGridViewRow row in dataGridView1.Rows) {
var person = row.DataBoundItem as Person;
if (person != null) {
var combo = row.Cells["NicknameDropdown"] as DataGridViewComboBoxCell;
combo.DataSource = person.Nicknames;
}
}
}
这种方法确实简化了DataGridViewComboBoxColumn的构造代码。它变成(请注意,没有明确的数据绑定):
旁注:当我最初不得不做一些类似的事情时,我不喜欢DataGridViewComboxCell加载时没有选择项的事实。我发现我通常如何设置选定的Combobox项不起作用(SelectedIndex、SelectedItem等),因此我最终使用了DataGridViewComboBoxCell属性。您可以在DataBindingComplete中添加(容易发生危险的)如下代码:
combo.Value = combo.Items["Big Joe"];
别拍自己的额头,恐怕你得一行一行地手动加载。我将这样的代码放在DataGridView的DataBindingComplete事件处理程序中:
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {
foreach (DataGridViewRow row in dataGridView1.Rows) {
var person = row.DataBoundItem as Person;
if (person != null) {
var combo = row.Cells["NicknameDropdown"] as DataGridViewComboBoxCell;
combo.DataSource = person.Nicknames;
}
}
}
这种方法确实简化了DataGridViewComboBoxColumn的构造代码。它变成(请注意,没有明确的数据绑定):
旁注:当我最初不得不做一些类似的事情时,我不喜欢DataGridViewComboxCell加载时没有选择项的事实。我发现我通常如何设置选定的Combobox项不起作用(SelectedIndex、SelectedItem等),因此我最终使用了DataGridViewComboBoxCell属性。您可以在DataBindingComplete中添加(容易发生危险的)如下代码:
combo.Value = combo.Items["Big Joe"];
谢谢你,杰,给我回电话。这基本上就是我的方向,你的回答让我更有信心。谢谢你,杰伊,谢谢你回复我。这基本上就是我的方向,你的回答让我更有信心。我很感激。