• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

正在做一数据分析软件,遇到关于DataGridView的行列转置的问题(附代码):

bwangel 2009-03-01 11:28:55
以下的解决方案不太理想,主要是效率问题.遇到超过300行的表转置过来速度就牛慢.
而令我感到奇怪的是,同样的方法,在程序启动时调用速度却很快.而运行过程中,再点工具栏按钮进行转置却很慢.

                //横向显示表格
private void RotateDGV(DataTable dt , DataGridView DgvData)
{
DgvData.Rows.Clear();
DgvData.Columns.Clear();

//添加列到DgvData
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
column.HeaderText = column.Name = dt.Columns[0].ColumnName;
column.FillWeight = 10;
DgvData.Columns.Add(column);
DataGridViewTextBoxColumn[] columns = new DataGridViewTextBoxColumn[dt.Rows.Count];
for (int dtrow = 0; dtrow < dt.Rows.Count; dtrow++)
{
column = new DataGridViewTextBoxColumn();
object o = dt.Rows[dtrow][0];
if (o.GetType().Name == "DateTime")
{
column.HeaderText = column.Name = ((DateTime)o).ToString("yyyy-MM");
}
else
column.HeaderText = o.ToString();

columns[dtrow] = column;
column.FillWeight = 10;
}
DgvData.Columns.AddRange(columns); ///在运行中强行中断, 光标总是停留在这一行.

//添加数据
DgvData.Rows.Add(dt.Columns.Count - 1);
for (int dtcol = 1; dtcol < dt.Columns.Count; dtcol++)
{
DgvData[0, dtcol - 1].Value = dt.Columns[dtcol].ColumnName;
string colType = DgvData[0, dtcol - 1].Value.GetType().Name;
DgvData[0, dtcol - 1].Style.Alignment = colType
== "String" ? DataGridViewContentAlignment.MiddleLeft : DataGridViewContentAlignment.MiddleCenter;
for (int dtrow = 0; dtrow < dt.Rows.Count; dtrow++)
{
DgvData[dtrow + 1, dtcol - 1].Value = dt.Rows[dtrow][dtcol];
}
}
}
...全文
209 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
随风秀舞 2012-05-18
求楼主说怎么解决的呀。。。。
回复
paul9137 2010-05-21
呵呵,我正要用到这个啊,正想问是怎么解决的,才发现已经过了一年了。还有人回答不?
回复
bwangel 2009-03-24
难道没人问我是怎么解决的,太失败了,就此结贴.
回复
yagebu1983 2009-03-22
可能循环太多了
回复
bwangel 2009-03-22
我已经找到解决方法了,谢谢各位.
回复
bwangel 2009-03-02
主要的瓶预在我标记的那一行:
DgvData.Columns.AddRange(columns); ///在运行中强行中断, 光标总是停留在这一行.

我不明白的是启动时为什么不卡. 用DgvData.SuspandLayout(),ResumeLayout()无效. 因为这不是布局问题.
回复
zlb789 2009-03-02
帮顶
回复
ojwftded 2009-03-02
超过300行转换成列好像有点过分了吧,我还没有见过这么多列的表,一定要转置么?
你可以试试,先把上边注释掉,不转换第一行的时间,进行下边的转换,我估计应该也会很卡
另外你说启动时不卡,我也不明白,只能说你点按钮进行转换的时候应该另起一个线程,不要在主线程里面做,还有最好加一个等待的界面,因为这个转换肯定是很耗时的
回复
JaggerLee 2009-03-02
我觉得你可以用 SQL 行转列
回复
Cherishny 2009-03-02
UP
回复
JaggerLee 2009-03-02
结果是对的么?
回复
-空军- 2009-03-02
路过。
回复
jlj84237485 2009-03-02
帮顶一下
回复
路过,帮顶
回复
sxmonsy 2009-03-02
路过,帮顶
回复
EveryCase 2009-03-02
顶··················
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2009-03-01 11:28
社区公告

让您成为最强悍的C#开发者