如何在 DataGridView 中显示数组列
How to show array columns in DataGridView
我正在从 Postgres 数据库中选择数据,其中一列的类型为 TEXT[]
。我将数据源绑定到 DataGridView
,但那些数组列没有显示(dgData
是 DataGridView
)。
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 列的自动生成并不像人们希望的那样强大和灵活..
我正在从 Postgres 数据库中选择数据,其中一列的类型为 TEXT[]
。我将数据源绑定到 DataGridView
,但那些数组列没有显示(dgData
是 DataGridView
)。
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 列的自动生成并不像人们希望的那样强大和灵活..