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,等

这不是我的类,实际上只是一个引用。所以我不能在任何地方改变它。

c# WinForm DataGridView绑定列表中的列表

您可以使用DataGridViewCellFormatting事件来提供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>的情况,您应该覆盖SomeClassToString或选择它的一个属性。

作为另一个选项,你可以使用新的ViewModel或使用匿名类型来塑造查询的结果,但在Product模型不属于你的当前情况下,它有很多属性,以前的解决方案是最简单的选择。

类似

dataGridView1.DataSource = (from p in model.Products 
                            select string.Join(", ", p.categories.ToArray())).ToList();