c#WinForm DataGridView绑定列表

时间:2016-07-02 07:23:13

标签: c# winforms data-binding datagridview

我想将list(ProductList)绑定到DataGridView,但是一列是集合(Categories),但是DataGridView show"(Collection)"而不是List的内容。我无法重写或更改此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等。

这不是我的课,实际上只是一个参考。所以我无法在任何地方改变它。

2 个答案:

答案 0 :(得分:0)

您可以使用DataGridView 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()因此选择List<SomeClass>即可。但对于ToString的情况,您应该覆盖SomeClass的{​​{1}}或选择其中一个属性。

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

答案 1 :(得分:0)

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