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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/853663/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 04:15:42  来源:igfitidea点击:

Is it possible to switch rows and columns in a datagridview?

c#winformsdatagridview

提问by Tim Gradwell

I have 10 records of data in a DataTable which has 3 fields "Foo", "Bar", and "Baz".

我在 DataTable 中有 10 条数据记录,其中有 3 个字段“Foo”、“Bar”和“Baz”。

If I connect wire this into a DataGridView I see 10 rows and 3 columns, and the column headers display the names of the fields.

如果我将它连接到 DataGridView,我会看到 10 行和 3 列,并且列标题显示字段的名称。

I'm wondering how easy it is to reverse the rows and columns so that with the same data I end up with 3 rows and 10 columns, with field names being displayed in the row headers.

我想知道反转行和列是多么容易,以便使用相同的数据最终得到 3 行和 10 列,字段名称显示在行标题中。



I can do some things manualy, like overriding an OnPaint method and drawing the field names directly into the row header cells, but I'm looking for something more automated.

我可以手动做一些事情,比如覆盖 OnPaint 方法并将字段名称直接绘制到行标题单元格中,但我正在寻找更自动化的东西。

Again, there's a suggestion of swapping values manualy, but unless I make all values Strings, this isn't going to work. 3 columns in a data table - Foo, Bar, and Baz of types int, float and string just won't transpose.

同样,建议手动交换值,但除非我将所有值都设置为字符串,否则这是行不通的。数据表中的 3 列 - int、float 和 string 类型的 Foo、Bar 和 Baz 不会转置。

Even if I managed all of these manual changes, my data grids have CheckBox columns, ComboBox columns - no such row counterpart exists - there is no CheckBox row or ComboBox row. Where I currently just need to tell the compiler to "Add a ComboBoxColumn" I'd have to re-write so that every cell was generated individually.

即使我管理了所有这些手动更改,我的数据网格也有 CheckBox 列、ComboBox 列 - 不存在这样的行对应项 - 没有 CheckBox 行或 ComboBox 行。我目前只需要告诉编译器“添加 ComboBoxColumn”,我必须重新编写,以便单独生成每个单元格。

Ideally I'd like a TransposableDataGridView which exposed all functionality of the DataGridView, with an additional bool property "Transposed". That way I could leave all of my code exactly as it is - I wouldn't have to change anything except for the type of the grid.

理想情况下,我想要一个 TransposableDataGridView,它公开了 DataGridView 的所有功能,并带有一个额外的 bool 属性“Transposed”。这样我就可以让我的所有代码保持原样——除了网格的类型之外,我不需要改变任何东西。

If nothing like this exists, I might just have to go and write it. (Should only take me a year or so! :)

如果没有这样的东西存在,我可能只需要去写它。(应该只需要我一年左右的时间!:)

回答by Shea

You can do this by programmatically adding the number of columns you need (e.g., 7 more to make 10) then programmatically swapping row, col with col, row.

您可以通过以编程方式添加所需的列数(例如,增加 7 列以增加 10 列)然后以编程方式交换 row, col 与 col, row 来完成此操作。

回答by svick

You can create new DataTable, add appropriate number of collumns and then copy values from one table to the other, just swap rows and colums.

您可以创建新的 DataTable,添加适当数量的列,然后将值从一个表复制到另一个表,只需交换行和列。

I don't think you can set row header in the same way you can set column header (or at least I don't know how), so you can put the field names in separate colum.

我认为您不能以与设置列标题相同的方式设置行标题(或者至少我不知道如何设置),因此您可以将字段名称放在单独的列中。

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;

回答by Kumar

This code should do the trick http://aspalliance.com/538_CodeSnip_Pivot_Tables_with_ADONET_and_Display_in_a_DataGrid_Paged_Horizontally

此代码应该可以解决问题 http://aspalliance.com/538_CodeSnip_Pivot_Tables_with_ADONET_and_Display_in_a_DataGrid_Paged_Horizo​​ntally

The display is asp.net but you can bind the resulting datatable to datagridview and get the result you want

显示是 asp.net 但您可以将结果数据表绑定到 datagridview 并获得您想要的结果

回答by Julian de Wit

I use the Developer Expres Vertical Grid.. It is like you want a rotated grid. It also allows for a different editor per row.

我使用Developer Express Vertical Grid.. 就像你想要一个旋转的网格。它还允许每行使用不同的编辑器。

Link to vertical grid product page

链接到垂直网格产品页面

回答by Antonio

In my case needed also to add a name to all columns of the new table. I wrote a function to generate a transposed table like this:

在我的情况下,还需要为新表的所有列添加一个名称。我写了一个函数来生成这样的转置表:

static public DataTable Transpose(DataTable inputTable, List<string> newColumnNames)
{
    DataTable outputTable = new DataTable();

    ///You should also verify if newColumnsNames.Count matches inputTable number of row

    //Creates the columns, using the provided column names.
    foreach (var newColumnName in newColumnNames)
    {
        outputTable.Columns.Add(newColumnName, typeof(string));
    }

    foreach (DataColumn inputColumn in inputTable.Columns)
    {
        //For each old column we generate a row in the new table
        DataRow newRow = outputTable.NewRow();

        //Looks in the former header row to fill in the first column
        newRow[0] = inputColumn.ColumnName.ToString();

        int counter = 1;
        foreach (DataRow row in inputTable.Rows)
        {
            newRow[counter] = row[inputColumn.ColumnName].ToString();
            counter++;
        }
        outputTable.Rows.Add(newRow);
    }

    return outputTable;

}

回答by Andrew Roberts

Apply a LayoutTransform to the DataGrid:

将 LayoutTransform 应用到 DataGrid:

<DataGrid Name = "reverseThis">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Top" Binding="{Binding Path=Top}"/>
        <DataGridTextColumn Header="Middle" Binding="{Binding Path=Middle}"/>
        <DataGridTextColumn Header="Bottom" Binding="{Binding Path=Bottom}"/>
    </DataGrid.Columns>
    <DataGrid.LayoutTransform>
        <TransformGroup>
            <RotateTransform Angle="-90"/>
            <ScaleTransform ScaleX="1" ScaleY="-1" />
        </TransformGroup>
    </DataGrid.LayoutTransform>

You also need to reverse the column headers:

您还需要反转列标题:

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}"
                                   BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
        <Setter Property="LayoutTransform">
            <Setter.Value>
                <TransformGroup>
                    <RotateTransform Angle="-90"/>
                    <ScaleTransform ScaleX="1" ScaleY="-1" />
                </TransformGroup>
            </Setter.Value>
        </Setter>
        <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>

and the cells, otherwise they come out mirrored and rotated:

和细胞,否则它们会被镜像和旋转:

    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell" >
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <TransformGroup>
                        <RotateTransform Angle="-90"/>
                        <ScaleTransform ScaleX="1" ScaleY="-1" />
                    </TransformGroup>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.CellStyle>

</DataGrid>