C# DataGridView 数据填充问题

问题描述

我用循环的方式给一个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();}

看这段代码,几百行数据应该都是不会慢的。楼主还是去找找是否有其他原因吧
解决方案:
如果楼主还给单元格改变加了事件那么这样代码直接操作单元格,会触发事件的
解决方案:
用数据集填充啊,几行代码搞定

时间: 2024-07-31 21:59:01

C# DataGridView 数据填充问题的相关文章

Excel如何将空白单元格以重复的数据填充或删除

  1. 批量填充重复数据 在Excel中,快速数据填充功能可以用来批量填充重复数据,还可以借助ctrl+Enter组合键来快速批量填充重复数据. 示例1: 图1所示的数据表中,第3行~第11行员工所属的分公司为"北京",而第13行~第20行员工所属的分公司为"东京".如何将空缺的数据快速填充上? 图1 操作步骤: 1) 在图 1中选中需要填充数据的列(D列). 2) 按"F5",弹出"定位"对话框,在"定位&quo

关于WPS数据填充单元格的操作方法介绍

  进行数据填充可以通过以下几种方法: 1.鼠标左键直接拖动填充柄填充(此时会以升序的方式填充). 2.Ctrl+鼠标左键拖动填充柄(此时是以复制单元格的形式填充). 3.鼠标右键拖动单元格,在弹出的菜单中进行选择填充 4.通过"编辑->填充(需要先选中编辑区域)".

Excel如何按顺序进行数据填充呢?

  在生活工作中,经常使用excel制作表格,如何按顺序进行数据填充呢?下面由我教大家怎样使用. 软件名称: Excel2003绿色版 EXCEL2003精简绿色版 (附excel2003绿色工具) 软件大小: 13.3MB 更新时间: 2012-06-19 方法/步骤 例如,填充学号 先选中学号所在列 在工具栏中找到'填充' 4 找到'填充'下的'系列' 打开后的样子如图 接下来进行修改数据,步长值根据所需进行调整, 确定后,就完成啦!! 以上就是Excel如何按顺序进行数据填充方法介绍,希望

java报表-基于excel模板的数据填充,即允许客户自定义编辑模板并生成报表

问题描述 基于excel模板的数据填充,即允许客户自定义编辑模板并生成报表 现有这样的开发需求,针对java语言的.目前有没有这样的技术,能允许客户对web页面上展示的多行多列数据进行随意筛选,并指定这些选中的数据在excel模板上的某列显示数据,是不是可行的?我在网上搜查了一下,有一个工具比较符合要求,但是资料太少,无法开发,这工具是ExcelUtils,它是基于模板生产报表,但是效果还是不理想,不满足需求,请问还有其他工具或技术可以实现吗?谢谢! 解决方案 Java体系下读写Excel的技术

java-求教下jxl的问题,数据填充后如何读取

问题描述 求教下jxl的问题,数据填充后如何读取 wb = Workbook.getWorkbook(new File(pathString)); WritableWorkbook wwb = Workbook.createWorkbook(response.getOutputStream(), wb,settings); 使用上面的代码对excel文件进行数据填充之后,我要怎么才能读取到填充之后的文件? 我一开始在填充之后使用 WritableWorkbook rwb = Workbook.c

线程-AsynTask中怎么返回数据填充到ListView中

问题描述 AsynTask中怎么返回数据填充到ListView中 我调用新浪微博的SDK,其中调用官方的APT方法--userTimelineIds获取微博ID,官方方法如下: /** * 获取用户发布的微博的ID * * @param uid 需要查询的用户ID * @param since_id 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0 * @param max_id 若指定此参数,则返回ID小于或等于max_id的微博,默认为0 *

使用commandbuilder修改datagridview数据然后更新到mysql数据库中遇到问题

问题描述 使用commandbuilder修改datagridview数据然后更新到mysql数据库中遇到问题 网上说使用commandbuilder需要先设置表的主键?这个有关系? 解决方案 就是因为没有主键.没有主键,当你修改datagridview一条记录的时候,凭什么知道你修改的是数据库中的哪一条呢? 解决方案二: 用修改DataGridView数据并更新数据库

如何把dataGridView数据导入excel中?

问题描述 咋样把dataGridView数据导入execl中?那位提供源代码,在使用Microsoft.Office.Interop.Excel.Applicationexcel=newMicrosoft.Office.Interop.Excel.Application();时说未引用程序集?咋引用啊?==============版主提示,应该在标题扼要说明遇到的问题,而不要用无意义的单词,请及时结贴给分. 解决方案 本帖最后由 caozhy 于 2012-02-12 02:46:40 编辑解决

access数据库-如何同时更新窗体中datagridview数据

问题描述 如何同时更新窗体中datagridview数据 access2003,C#2008winfrom中在datagridview绑定access数据库后,在同一界面添加信息后,如何同时更新窗体中datagridview数据 解决方案 最简单的办法就是加个定时器 直接运行this.re那什么刷新的办法..要么就是在你改动的那里加一行这个.. 解决方案二: 在数据更改后更新DataGrid的DataSource即可