datagridview 中可以切换行和列吗?

问题描述 投票:0回答:6

我的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 的所有功能,并带有附加的布尔属性“Transpose”。 这样我就可以让所有代码保持原样 - 除了网格类型之外,我不需要更改任何内容。

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

c# winforms datagridview
6个回答
6
投票

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

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

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;

2
投票

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

垂直网格产品页面链接


1
投票

您可以通过以编程方式添加所需的列数(例如,再加 7 列以达到 10 列),然后以编程方式将 row, col 与 col, row 交换来实现此目的。


1
投票

将 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>

您还需要反转列标题:

<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>

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

    <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>

0
投票

就我而言,还需要为新表的所有列添加名称。我编写了一个函数来生成这样的转置表:

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;

}

0
投票

转置不是 DataGridView 的功能。即使您创建一个新的数据表,您也不会更改每个单元格的数据类型。

您可以使用不同的数据网格控件,例如 Mescius 的 ComponentOne FlexGrid。转置 FlexGrid 的代码很简单:

c1FlexGrid1.Transposed = true;
c1FlexGrid1.AutoSizeRows();
c1FlexGrid1.AutoSizeCols();

自动调整行和列的大小不是必需的,但这是一个很好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.