2 sinat 29365483 sinat_29365483 于 2017.08.28 17:52 提问

求datagridview快速填充的方法

目前是用循环list填充的,但是数据一多,还要赋颜色等等操作,卡成狗。有一列是checkbox的,没法datatable,或者我用不来。求问大佬平时都是如何填充dgv的,并且保证界面不卡住。winform。

if (_or.Count > 0)
{
for (int i = 0; i < _or.Count; i++)
{
int rowIndex = dgv_newOrder.Rows.Add();
dgv_newOrder.Rows[rowIndex].Cells[0].Value = false;
dgv_newOrder.Rows[rowIndex].Tag = _or[i];
if (_or[i].ksrq.Length > 8)
{
_or[i].ksrq = _or[i].ksrq.Insert(8, " ");
_or[i].ksrq = _or[i].ksrq.Insert(6, "-");
_or[i].ksrq = _or[i].ksrq.Insert(4, "-");
}
if (_or[i].tzrq.Length > 8)
{
_or[i].tzrq = _or[i].tzrq.Insert(8, " ");
_or[i].tzrq = _or[i].tzrq.Insert(6, "-");
_or[i].tzrq = _or[i].tzrq.Insert(4, "-");
}
dgv_newOrder.Rows[rowIndex].Cells[1].Value = _or[i].bedNo;
dgv_newOrder.Rows[rowIndex].Cells[2].Value = _or[i].name;
if (_or[i].CQLS == "1")
dgv_newOrder.Rows[rowIndex].Cells[3].Value = "长期";
else
dgv_newOrder.Rows[rowIndex].Cells[3].Value = "临时";
dgv_newOrder.Rows[rowIndex].Cells[4].Value = _or[i].yzlx;
dgv_newOrder.Rows[rowIndex].Cells[5].Value = _or[i].ordername + ":" + _or[i].groupno;
dgv_newOrder.Rows[rowIndex].Cells[6].Value = _or[i].supplyname;
dgv_newOrder.Rows[rowIndex].Cells[7].Value = _or[i].frequcode;
dgv_newOrder.Rows[rowIndex].Cells[8].Value = _or[i].zxdwl;
dgv_newOrder.Rows[rowIndex].Cells[9].Value = _or[i].zxdw.Trim();
dgv_newOrder.Rows[rowIndex].Cells[10].Value = _or[i].drugquan.Trim();
dgv_newOrder.Rows[rowIndex].Cells[11].Value = _or[i].ksrq;
dgv_newOrder.Rows[rowIndex].Cells[12].Value = _or[i].tzrq;
}
}
经过测试,卡的地方在这段。
我是填充数据的时候卡,不是sql查询的时候卡。有一列checkbox,选中的时候有事件,需要整行的tag```

2个回答

sinat_29365483
sinat_29365483   2017.08.29 09:57
已采纳

if (_or.Count > 0)
{
for (int i = 0; i < _or.Count; i++)
{
int rowIndex = dgv_newOrder.Rows.Add();
dgv_newOrder.Rows[rowIndex].Cells[0].Value = false;
dgv_newOrder.Rows[rowIndex].Tag = _or[i];
if (_or[i].ksrq.Length > 8)
{
_or[i].ksrq = _or[i].ksrq.Insert(8, " ");
_or[i].ksrq = _or[i].ksrq.Insert(6, "-");
_or[i].ksrq = _or[i].ksrq.Insert(4, "-");
}
if (_or[i].tzrq.Length > 8)
{
_or[i].tzrq = _or[i].tzrq.Insert(8, " ");
_or[i].tzrq = _or[i].tzrq.Insert(6, "-");
_or[i].tzrq = _or[i].tzrq.Insert(4, "-");
}
dgv_newOrder.Rows[rowIndex].Cells[1].Value = _or[i].bedNo;
dgv_newOrder.Rows[rowIndex].Cells[2].Value = _or[i].name;
if (_or[i].CQLS == "1")
dgv_newOrder.Rows[rowIndex].Cells[3].Value = "长期";
else
dgv_newOrder.Rows[rowIndex].Cells[3].Value = "临时";
dgv_newOrder.Rows[rowIndex].Cells[4].Value = _or[i].yzlx;
dgv_newOrder.Rows[rowIndex].Cells[5].Value = _or[i].ordername + ":" + _or[i].groupno;
dgv_newOrder.Rows[rowIndex].Cells[6].Value = _or[i].supplyname;
dgv_newOrder.Rows[rowIndex].Cells[7].Value = _or[i].frequcode;
dgv_newOrder.Rows[rowIndex].Cells[8].Value = _or[i].zxdwl;
dgv_newOrder.Rows[rowIndex].Cells[9].Value = _or[i].zxdw.Trim();
dgv_newOrder.Rows[rowIndex].Cells[10].Value = _or[i].drugquan.Trim();
dgv_newOrder.Rows[rowIndex].Cells[11].Value = _or[i].ksrq;
dgv_newOrder.Rows[rowIndex].Cells[12].Value = _or[i].tzrq;
}
}
经过测试,卡的地方在这段。
我是填充数据的时候卡,不是sql查询的时候卡。有一列checkbox,选中的时候有事件,需要整行的tag```


sinat_29365483
sinat_29365483 回复英俊小先生: 已经解决,这种填充方式没改变一个单元格就会重绘一次界面,原本应该不会卡几百条数据,后来我有分开的又循环了一次给行赋颜色,某些单元格又需要重新赋值。所以占用资源多,造成假死。已换datagridviewRow 赋值一行后,颜色还有特殊的单元格设置 最好也在赋row时,按需要赋值,切莫在外面再一次循环全部行。
3 个月之前 回复
sinat_29365483
sinat_29365483 回复英俊小先生: 已经解决,这种填充方式没改变一个单元格就会重绘一次界面,原本应该不会卡几百条数据,后来我有分开的又循环了一次给行赋颜色,某些单元格又需要重新赋值。所以占用资源多,造成假死。已换datagridviewRow 赋值一行后,颜色还有特殊的单元格设置 最好也在赋row时,按需要赋值,切莫在外面再一次循环全部行。
3 个月之前 回复
caozhy
caozhy   Ds   Rxr 2017.08.29 00:03
sinat_29365483
sinat_29365483 数据量没那么多,只有一两千条
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片