c# WinForm DataGridView绑定列表中的列表
本文关键字:列表 绑定 WinForm DataGridView | 更新日期: 2023-09-27 17:54:31
我想绑定列表(ProductList)到DataGridView,但一列是集合(类别),但DataGridView显示"(集合)"而不是列表的内容。我不能重写或更改这个ProductList类。我如何绑定这个类别列表列?
这是绑定:
dataGridView1.AutoGenerateColumns = false;
dataGridView1.ColumnCount = model.ColumnsNames.Length;
for (int i = 0; i < model.ColumnsNames.Length; i++)
{
string columnName = model.ColumnsNames[i];
dataGridView1.Columns[i].Name = columnName;
dataGridView1.Columns[i].DataPropertyName = columnName;
}
dataGridView1.DataSource = model.Products;
这里是ProductModel,网格数据源为List<Product>
:
public class Product
{
//...
/// <summary>
/// List of product categories names (string).
/// In write-mode need to pass a array of categories IDs (integer)
/// (uses wp_set_object_terms())
/// </summary>
public List<object> categories { get; set; }
// ...
}
我不想使用子网格,我只是想显示属性作为一个字符串在TextBoxColumn像这样:CollectionElement1, CollectionElement2,等
这不是我的类,实际上只是一个引用。所以我不能在任何地方改变它。
您可以使用DataGridView
的CellFormatting
事件来提供categories
属性的友好表示:
void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//Use zero based index of the cell that contains categories
var cell= 3;
if (e.ColumnIndex == cell && e.RowIndex >= 0)
{
var categories = (List<object>)dataGridView1.Rows[e.RowIndex].Cells[cell].Value;
e.Value = string.Join(", ", categories.Select(x => x.ToString()));
}
}
在这种情况下,categories
包含List of product categories names (string).
,所以选择ToString()
是OK的。但是对于List<SomeClass>
的情况,您应该覆盖SomeClass
的ToString
或选择它的一个属性。
作为另一个选项,你可以使用新的ViewModel
或使用匿名类型来塑造查询的结果,但在Product
模型不属于你的当前情况下,它有很多属性,以前的解决方案是最简单的选择。
类似
dataGridView1.DataSource = (from p in model.Products
select string.Join(", ", p.categories.ToArray())).ToList();