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

C# 是否可以在datagridview中切换行和列?,c#,winforms,datagridview,C#,Winforms,Datagridview,我在一个DataTable中有10条数据记录,它有3个字段“Foo”、“Bar”和“Baz” 如果将其连接到DataGridView,我会看到10行3列,列标题显示字段的名称 我想知道反转行和列有多容易,这样对于相同的数据,我会得到3行10列,字段名显示在行标题中 我可以手动地做一些事情,比如重写OnPaint方法并将字段名直接绘制到行标题单元格中,但我正在寻找更自动化的方法 同样,有人建议手动交换值,但除非我将所有值都设置为字符串,否则这是行不通的。数据表中的3列—int、float和str

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

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

我想知道反转行和列有多容易,这样对于相同的数据,我会得到3行10列,字段名显示在行标题中


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

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

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

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


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

您可以通过编程方式添加所需的列数(例如,再增加7列,使之成为10列),然后通过编程方式交换行、列和列。

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

我不认为可以像设置列标题那样设置行标题(或者至少我不知道如何设置),所以可以将字段名放在单独的列中

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;
DataTable oldTable=newdatatable();
...
DataTable newTable=新DataTable();
newTable.Columns.Add(“字段名”);
对于(int i=0;i
我使用开发者表达式垂直网格。。 这就像你想要一个旋转的网格。 它还允许每行使用不同的编辑器


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

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;

}
静态公共数据表转置(数据表可输入,列出新列名)
{
DataTable outputTable=新DataTable();
///您还应该验证newColumnsNames.Count是否与可输入的行数匹配
//使用提供的列名创建列。
foreach(newColumnNames中的var newColumnName)
{
outputTable.Columns.Add(newColumnName,typeof(string));
}
foreach(可输入的.Columns中的DataColumn inputColumn)
{
//对于每个旧列,我们在新表中生成一行
DataRow newRow=可输出的.newRow();
//查找前一标题行以填充第一列
newRow[0]=inputColumn.ColumnName.ToString();
int计数器=1;
foreach(可输入的.Rows中的数据行)
{
newRow[counter]=行[inputColumn.ColumnName].ToString();
计数器++;
}
可输出的.Rows.Add(newRow);
}
返回可输出;
}

将布局转换应用于数据网格:

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


您是建议将列添加到DataTable还是DataGridView?感谢您的回答-如果我有一个bool DataColumn和一个string DataColumn,会发生什么情况-我应该将转置网格的列设置为什么类型?如果您不设置类型,它默认为string,因此如果您只想向用户显示数据,这对您来说很好,因为其他类型的值将自动转换。另一种可能是将类型设置为object。这种类型的变量可以包含任何内容。我意识到最初的问题是关于DataGridView的,但我的答案是针对DataGrid的。这篇文章是“datagrid交换行和列”在Google上的第一次成功,所以我就不写了。