我在 DataTable 中有 10 条数据记录,它有 3 个字段“Foo”、“Bar”和“Baz”。
如果我将它连接到 DataGridView,我会看到 10 行和 3 列,并且列标题显示字段的名称。
我想知道颠倒行和列以便使用相同的数据最终得到 3 行和 10 列,字段名称显示在行标题中是多么容易。
我可以手动做一些事情,比如覆盖 OnPaint 方法并将字段名称直接绘制到行标题单元格中,但我正在寻找更自动化的东西。
同样,有人建议手动交换值,但除非我将所有值都设为字符串,否则这是行不通的。数据表中的 3 列 - int、float 和 string 类型的 Foo、Bar 和 Baz 不会转置。
即使我管理了所有这些手动更改,我的数据网格也有 CheckBox 列、ComboBox 列 - 不存在这样的对应行 - 没有 CheckBox 行或 ComboBox 行。我目前只需要告诉编译器“添加 ComboBoxColumn”,我必须重新编写,以便单独生成每个单元格。
理想情况下,我想要一个 TransposableDataGridView,它公开了 DataGridView 的所有功能,并带有一个额外的 bool 属性“Transposed”。这样我就可以让我的所有代码完全保持原样 - 除了网格类型之外我不需要更改任何东西。
如果不存在这样的东西,我可能只好去写了。 (应该只需要我一年左右的时间!:)
最佳答案
您可以创建新的 DataTable,添加适当数量的列,然后将值从一个表复制到另一个表,只需交换行和列。
我认为您不能像设置列标题一样设置行标题(或者至少我不知道如何设置),因此您可以将字段名称放在单独的列中。
DataTable oldTable = new DataTable();
...
DataTable newTable = new DataTable();
newTable.Columns.Add("Field Name");
for (int i = 0; i < oldTable.Rows.Count; i++)
newTable.Columns.Add();
for (int i = 0; i < oldTable.Columns.Count; i++)
{
DataRow newRow = newTable.NewRow();
newRow[0] = oldTable.Columns[i].Caption;
for (int j = 0; j < oldTable.Rows.Count; j++)
newRow[j+1] = oldTable.Rows[j][i];
newTable.Rows.Add(newRow);
}
dataGridView.DataSource = newTable;
关于c# - 是否可以在 datagridview 中切换行和列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/853663/