像往常一样,我觉得我似乎错过了一些显而易见的东西,但我无法弄清楚这一点并且无法在网上找到任何东西(尽管我找到了几篇几乎描述我之后的帖子)虽然我确定我要做的事情很常见。
说我有一个清单:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public List<string> Nicknames { get; set; }
}
并且只想绑定到datagridview并在组合框列中显示每个Person的昵称。这是怎么做到的?我可以手动,逐行加载它们,但无法弄清楚如何将它们分配为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;
}
感谢您提出任何想法。我有一种感觉,当得到答案时,我会想要在额头上拍打自己。
答案 0 :(得分:0)
不要在额头上拍打自己,我担心你不得不一个接一个地手动加载它们。我将这样的代码放在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的构造代码。它变成(注意没有明确的数据绑定):
DataGridViewComboBoxColumn colCombo = new DataGridViewComboBoxColumn();
colCombo.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
colCombo.HeaderText = "Nicknames";
colCombo.Name = "NicknameDropdown";
dataGridView1.Columns.Add(colCombo);
旁注:
当我最初不得不做类似的事情时,我不喜欢DataGridViewComboBoxCell没有加载选定项目的事实。我发现我通常如何设置一个选定的Combobox项目不起作用(SelectedIndex,SelectedItem等),所以我最终使用了DataGridViewComboBoxCell Value
属性。您可以向DataBindingComplete添加(易于发生危险的)代码:
combo.Value = combo.Items["Big Joe"];