c# - 是否可以在 datagridview 中切换行和列?

标签 c# winforms datagridview

我在 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/

相关文章:

c# - WPF - 集合中的标签文本?

c# - 如何以正确的字体呈现 unicode 字符? (C#/窗体)

c# - 更改 DataGridView 标题单元格的文本对齐方式和字体大小

c# - 更改 DataGridView 中按钮的颜色

c# - 在Ilist中使用Func,为什么是lambda表达式?

c# - 在 DataTemplate 中显示数据绑定(bind)的 StackPanel

c# - 如何使用 c# 套接字有效地同时接收和发送数据

c# - ListBox 项目在 OwnerDrawFixed 模式下不显示

c# - 如何在 C# 中应用多个 .Tag 属性?

vb.net - 使用新数据输入自动更新图表