You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过后端SQL或前端VB.NET将DataGrid横向数据转为纵向展示

问题场景

现有数据表tbl_info中的数据格式如下:

No1 Name1 No2 Name2 No3 Name3
232 Sanp  453 Awerk 374 Wash

我通过SQL语句:

select No1,Name1,No2,Name2,No3,Name3 from tbl_info

将数据导入DataTable,但因为存在50组类似NoX/NameX的列,且仅单条记录,横向展示可读性极差,希望把DataGrid中的数据改成纵向格式,效果如下:

No1   232
Name1 Sanp
No2   453
Name2 Awerk
No3   374
Name3 Wash
解决方案

方案1:SQL查询层面直接转纵向(数据库支持时优先用)

以SQL Server为例,用UNPIVOT操作将列转换为行,查询结果直接是纵向结构,绑定DataGrid即可:

SELECT ColumnName, ColumnValue
FROM (
    SELECT CAST(No1 AS VARCHAR) AS No1, Name1,
           CAST(No2 AS VARCHAR) AS No2, Name2,
           CAST(No3 AS VARCHAR) AS No3, Name3
           -- 依次添加剩余47组NoX/NameX列,注意统一转成字符串类型(UNPIVOT要求列类型一致)
    FROM tbl_info
) t
UNPIVOT (
    ColumnValue FOR ColumnName IN (No1, Name1, No2, Name2, No3, Name3 /* 补充剩余列名 */)
) up

方案2:在DataTable中转换数据

如果不想修改SQL,可在获取原DataTable后,手动构建纵向结构的新表:

// 假设原数据表为originalDt
DataTable verticalDt = new DataTable();
verticalDt.Columns.Add("属性名", typeof(string));
verticalDt.Columns.Add("值", typeof(string));

// 遍历原表所有列,逐行写入新表
foreach (DataColumn col in originalDt.Columns)
{
    string cellValue = originalDt.Rows[0][col.ColumnName].ToString();
    verticalDt.Rows.Add(col.ColumnName, cellValue);
}

// 将新表绑定到DataGrid
dataGrid.DataSource = verticalDt;

方案3:UI层自定义DataGrid模板(以WPF为例)

不修改数据源,通过自定义模板实现纵向展示:

<DataGrid ItemsSource="{Binding OriginalData}" AutoGenerateColumns="False">
    <DataGrid.Template>
        <ControlTemplate>
            <ItemsControl ItemsSource="{Binding Columns}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="120"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Text="{Binding ColumnName}" Margin="5"/>
                            <TextBlock Grid.Column="1" Text="{Binding DataContext[ColumnName], RelativeSource={RelativeSource AncestorType=ItemsControl}}" Margin="5"/>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ControlTemplate>
    </DataGrid.Template>
</DataGrid>

内容的提问来源于stack exchange,提问作者Jen K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:05:13