如何在 DataGridView 中显示数组列

How to show array columns in DataGridView

我正在从 Postgres 数据库中选择数据,其中一列的类型为 TEXT[]。我将数据源绑定到 DataGridView,但那些数组列没有显示(dgDataDataGridView)。

dgData.DataSource = getDataTable();

当我现在检查 ((DataTable)dgData.DataSource).Columns[15].DataType 时,我得到了值 {Name = "String[]" FullName = "System.String[]"},表明这是一个字符串数组。 DataGrid.

的渲染中此列刚刚消失

如何显示该数据?

我认为 DataGridView 不会接受类型为 string[] 的列。

如果 可以使用 CellFormatting 事件来创建格式良好的数据显示版本,可能像这样:

private void DataGridView1_CellFormatting(object sender,
                                          DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == yourIndexOrName1 && e.Value != null)
    {
        var s = e.Value as string[];
        e.Value = String.Join(", ", s);
    }
}

但是 该列既不会创建(使用 AutoGenerateColumns 时),也不会被填充。

所以您应该创建一个易于格式化的列。在数据库级别的 SQL 中或稍后在 Linq 行中。

示例:

var dt_ = dt.Rows.Cast<DataRow>().Select(x => new {
    f1 = x.Field<string>(0),
    f2 = x.Field<string[]>(1).Aggregate((i, j) => i + ", " + j),
    f3 = x.Field<int>(2)
});

dataGridView1.DataSource = dt_.ToList();

使用我的测试数据:

DataTable dt = new DataTable();
dt.Columns.Add("col1", typeof(string));
dt.Columns.Add("col2", typeof(string[]));
dt.Columns.Add("col3", typeof(int));

var row = dt.NewRow();
row.SetField<string>("col1",  "A");
row.SetField<string[]>("col2", new string[] { "abc", "xyz", "123" });
row.SetField<int>("col3", 23 );
dt.Rows.Add(row);
row = dt.NewRow();
row.SetField<string>("col1", "B");
row.SetField<string[]>("col2", new string[] { "a-b-c", "x+y+z", "1:2:3" });
row.SetField<int>("col3", 42);
dt.Rows.Add(row);

结果如下所示:

虽然这确实意味着您需要注意每个字段,但在涉及到生产代码时,imo 列的自动生成并不像人们希望的那样强大和灵活..