问题描述
我用循环的方式给一个DataGridView填充数据,特别慢,一个30多行的数据要几秒钟,400多行的数据要十几秒,太不正常了,求大神指教,我的DataGridView中有两个隐藏咧,还有一列是复选框咧,其他都是显示的列,除了复选框列我都给填充值了
解决方案
解决方案二:
怎么个循环方式??
解决方案三:
循环给后台datatable赋值,然后表格.datasource=dt否则你改一次值,表格就刷新一次,不卡才怪
解决方案四:
经过断点测试,慢的代码如下,就是找不到哪里不对,各种写法都试过for(inti=0;i<dt.Rows.Count;i++){intnewIndex=this.dgv_PurcInfo.Rows.Add();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Check"].Value=false;this.dgv_PurcInfo.Rows[newIndex].Cells["col_PlanNo"].Value=dt.Rows[i]["plan_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_ItemNo"].Value=dt.Rows[i]["item_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_DrugCode"].Value=dt.Rows[i]["drug_code"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugName"].Value=dt.Rows[i]["drug_name"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugSpec"].Value=dt.Rows[i]["package_spec"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Unit"].Value=dt.Rows[i]["package_units"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_FirmID"].Value=dt.Rows[i]["firm_id"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Quantity"].Value=dt.Rows[i]["quantity"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_PurcPrice"].Value=dt.Rows[i]["purchase_price"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Supplier"].Value=dt.Rows[i]["supplier"].ToString();}
解决方案五:
引用2楼Z65443344的回复:
循环给后台datatable赋值,然后表格.datasource=dt否则你改一次值,表格就刷新一次,不卡才怪
但是我看别人的代码一样的写法,6,7百行记录也没事,怎么我的那么卡
解决方案六:
引用3楼locizhang的回复:
经过断点测试,慢的代码如下,就是找不到哪里不对,各种写法都试过for(inti=0;i<dt.Rows.Count;i++){intnewIndex=this.dgv_PurcInfo.Rows.Add();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Check"].Value=false;this.dgv_PurcInfo.Rows[newIndex].Cells["col_PlanNo"].Value=dt.Rows[i]["plan_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_ItemNo"].Value=dt.Rows[i]["item_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_DrugCode"].Value=dt.Rows[i]["drug_code"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugName"].Value=dt.Rows[i]["drug_name"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugSpec"].Value=dt.Rows[i]["package_spec"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Unit"].Value=dt.Rows[i]["package_units"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_FirmID"].Value=dt.Rows[i]["firm_id"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Quantity"].Value=dt.Rows[i]["quantity"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_PurcPrice"].Value=dt.Rows[i]["purchase_price"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Supplier"].Value=dt.Rows[i]["supplier"].ToString();}
看你写的这段代码就知道你对DataGridView控件不是很熟悉,DataGridView可以直接填充数据,例如DataGridView。DataSource=dt;何必那么麻烦,同样DataGridView也可以设置隐藏列。
解决方案七:
把this.dgv_PurcInfo.Rows[newIndex]提取才DataGridViewRow;dt.Rows[i]提取出DataRow试试
解决方案八:
我当然知道能绑定,但是我需要有一列是复选框的
解决方案九:
循环不慢,慢的是DataGridView显示数据时候,所以要减少DataGridView刷数据次数。参看2
解决方案十:
#引用7楼locizhang的回复:
我当然知道能绑定,但是我需要有一列是复选框的
那就修改你的Datatable的结构,增加一列用于绑定到checkbox上,比如:isCheck默认值设置为false
解决方案十一:
引用9楼duanzi_peng的回复:
Quote: 引用7楼locizhang的回复:
我当然知道能绑定,但是我需要有一列是复选框的那就修改你的Datatable的结构,增加一列用于绑定到checkbox上,比如:isCheck默认值设置为false
这个方法行不通吧,的数据绑定好像是不允许DataGridView有自己的表头的
解决方案十二:
引用8楼china_ggd的回复:
循环不慢,慢的是DataGridView显示数据时候,所以要减少DataGridView刷数据次数。参看2#
但是复选框怎么办
解决方案十三:
引用10楼locizhang的回复:
Quote: 引用9楼duanzi_peng的回复:
Quote: 引用7楼locizhang的回复:
我当然知道能绑定,但是我需要有一列是复选框的那就修改你的Datatable的结构,增加一列用于绑定到checkbox上,比如:isCheck默认值设置为false
这个方法行不通吧,的数据绑定好像是不允许DataGridView有自己的表头的
你可以添加一列类型为DataGridViewCheckBoxColumn的,这就是DataGridView中的复选框
解决方案十四:
我刚刚看了一下,DataGridView中的DataGridViewCheckBoxColumn列,有数据这个选项,里面可以设置选中时和不选中时的数据。
解决方案十五:
引用13楼luanjun123456的回复:
我刚刚看了一下,DataGridView中的DataGridViewCheckBoxColumn列,有数据这个选项,里面可以设置选中时和不选中时的数据。
我就是添加了这一列,所以其他列不能用数据绑定了,只能循环去填充,所以就慢了,但是别人同样的写法,数据量还比我大,速度一两秒,快多了,不知道为什么,
解决方案:
如果你添加的这一列不需要数据绑定那么先设置datasource,再给表格add一列
解决方案:
或者你仔细看看Designer.cs文件里的代码先设置布局逻辑挂起等循环加载完数据再执行布局逻辑这样就不会每加进一个值就刷新一次了
解决方案:
if(this.iedGridView.Columns.Count==0){foreach(DataColumndataColinthis.iedDatas.Columns){DataGridViewColumncolumn=null;switch(dataCol.Caption){caseConstStrDef.ROW_NUM:column=newDataGridViewTextBoxColumn();column.ReadOnly=true;break;caseConstStrDef.MAC_DEST:caseConstStrDef.MAC_SOURCE:column=newDataGridViewTextBoxColumn();column.MinimumWidth=macWidth;break;caseConstStrDef.PORT:column=newDataGridViewComboBoxColumn();DataGridViewComboBoxColumncomboboxColumn=columnasDataGridViewComboBoxColumn;comboboxColumn.Items.AddRange(KF920_61850_Set_CommonData.PortStrList.ToArray());comboboxColumn.DisplayStyle=DataGridViewComboBoxDisplayStyle.DropDownButton;comboboxColumn.FlatStyle=FlatStyle.Flat;break;caseConstStrDef.TEST:column=newDataGridViewCheckBoxColumn();break;default:column=newDataGridViewTextBoxColumn();break;}//不允许排序column.SortMode=DataGridViewColumnSortMode.NotSortable;column.DefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;column.Name=dataCol.Caption;column.DataPropertyName=dataCol.Caption;column.HeaderText=dataCol.Caption;this.iedGridView.Columns.Add(column);}//让添加的列与DataTable中列名相同的列绑定this.iedGridView.AutoGenerateColumns=false;this.iedGridView.AllowUserToAddRows=false;this.iedGridView.RowHeadersVisible=false;this.iedGridView.MultiSelect=false;this.iedGridView.SelectionMode=DataGridViewSelectionMode.FullRowSelect;this.iedGridView.ColumnHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;this.iedGridView.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;this.iedGridView.AlternatingRowsDefaultCellStyle.BackColor=Color.LemonChiffon;this.iedGridView.BackgroundColor=Color.White;this.iedGridView.ContextMenuStrip=iedContextMenuStrip;//添加事件this.iedGridView.SelectionChanged+=newEventHandler(iedGridView_SelectionChanged);this.iedGridView.EditingControlShowing+=newDataGridViewEditingControlShowingEventHandler(GridView_EditingControlShowing);this.iedGridView.KeyPress+=newKeyPressEventHandler(GridView_KeyPress);}this.iedGridView.DataSource=iedDatas;
this.iedGridView.AutoGenerateColumns=false;这句很关键
解决方案:
使用字符串数组为DataGridView新增行填充单元格privateList<Fruit>G_Fruit;privatevoidFrm_Main_Load(objectsender,EventArgse){G_Fruit=newList<Fruit>(){//创建集合并添加元素newFruit(){Name="香瓜",Price=30},newFruit(){Name="西瓜",Price=40},newFruit(){Name="大枣",Price=33},newFruit(){Name="火龙果",Price=31}};dgv_Message.Columns.Add("Fruit","水果");//添加列dgv_Message.Columns.Add("Pric","价格");//添加列foreach(FruitfinG_Fruit)//添加元素{dgv_Message.Rows.Add(newstring[]{f.Name,f.Price.ToString()});}dgv_Message.Columns[0].Width=200;//设置列宽度dgv_Message.Columns[1].Width=170;//设置列宽度floatsum=0;//定义float类型变量G_Fruit.ForEach((pp)=>{sum+=pp.Price;//求和});dgv_Message.Rows.Add(newstring[]//在新列中显示平均值及合计信息{"合计:"+sum.ToString()+"元","平均价格:"+(sum/G_Fruit.Count).ToString()+"元"});}
解决方案:
你的方法没什么错,你再检查一下程序,或者在想点别的办法
解决方案:
引用3楼locizhang的回复:
经过断点测试,慢的代码如下,就是找不到哪里不对,各种写法都试过for(inti=0;i<dt.Rows.Count;i++){intnewIndex=this.dgv_PurcInfo.Rows.Add();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Check"].Value=false;this.dgv_PurcInfo.Rows[newIndex].Cells["col_PlanNo"].Value=dt.Rows[i]["plan_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_ItemNo"].Value=dt.Rows[i]["item_no"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_DrugCode"].Value=dt.Rows[i]["drug_code"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugName"].Value=dt.Rows[i]["drug_name"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_drugSpec"].Value=dt.Rows[i]["package_spec"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Unit"].Value=dt.Rows[i]["package_units"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_FirmID"].Value=dt.Rows[i]["firm_id"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Quantity"].Value=dt.Rows[i]["quantity"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_PurcPrice"].Value=dt.Rows[i]["purchase_price"].ToString();this.dgv_PurcInfo.Rows[newIndex].Cells["col_Supplier"].Value=dt.Rows[i]["supplier"].ToString();}
看这段代码,几百行数据应该都是不会慢的。楼主还是去找找是否有其他原因吧
解决方案:
如果楼主还给单元格改变加了事件那么这样代码直接操作单元格,会触发事件的
解决方案:
用数据集填充啊,几行代码搞定