我在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”。这样我就可以完全保留我的所有代码 - 除了网格的类型之外,我不需要改变任何东西。
如果不存在这样的情况,我可能只需要去写它。 (应该只花一年左右!)
答案 0 :(得分:5)
您可以创建新的DataTable,添加适当数量的collumns,然后将值从一个表复制到另一个表,只需交换行和列。
我认为您不能像设置列标题一样设置行标题(或者至少我不知道如何),因此您可以将字段名称放在单独的列中。
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;
答案 1 :(得分:2)
我使用 Developer Expres Vertical Grid .. 就像你想要一个旋转的网格。 它还允许每行使用不同的编辑器。
答案 2 :(得分:1)
您可以通过以编程方式添加所需的列数(例如,再制作10个列)来执行此操作,然后以编程方式交换row,col与col,row。
答案 3 :(得分:1)
显示是asp.net但您可以将生成的数据绑定到datagridview并获得您想要的结果
答案 4 :(得分: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>
答案 5 :(得分: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;
}