正在做一数据分析软件,遇到关于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];
}
}
}
...全文
403 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
随风秀舞 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
  • 打赏
  • 举报
回复
结果是对的么?
wuyi8808 2009-03-02
  • 打赏
  • 举报
回复
路过。
jlj84237485 2009-03-02
  • 打赏
  • 举报
回复
帮顶一下
悔说话的哑巴 2009-03-02
  • 打赏
  • 举报
回复
路过,帮顶
sxmonsy 2009-03-02
  • 打赏
  • 举报
回复
路过,帮顶
EveryCase 2009-03-02
  • 打赏
  • 举报
回复
顶··················

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧