新手求详细解答~~关于获取GridView中数据存储到DataTable的问题

问题描述

各位大神别吐槽萌新不用三层设计~~先实现再分层~实现结果:本新用存储过程为GridView填充数据,然后根据checkbox把girdview中的数据导入到另外一个数据。思路:获取gridview中的行数据,然后通过datatable.newrow来循环储存,最后将datatable用datasetIO类的方法复制到目标数据库中。结果出现了“未将对象引用设置到对象的实例。”的报错信息。报错点如下:drNew=((DataRowView)this.GridView1.Rows[i].DataItem).Row;

请问要怎么解决~~~我不想用Insert语句啊,sqlbulkcopy方法这么好用,错一个就回滚~~~各位大神帮帮忙以下为主要代码部分。。按钮事件部分:protectedvoidbtnInsert_Click(objectsender,EventArgse){using(DataSetds=newDataSet()){ds.Tables.Add("tb_MainData");for(intj=3;j<GridView1.Columns.Count;j++){ds.Tables[0].Columns.Add(GridView1.Columns[j].SortExpression);}for(inti=0;i<=GridView1.Rows.Count-1;i++){CheckBoxcbox=(CheckBox)GridView1.Rows[i].FindControl("CheckBox1");if(cbox.Checked==true){DataRowdrNew=ds.Tables[0].NewRow();drNew=((DataRowView)this.GridView1.Rows[i].DataItem).Row;ds.Tables[0].Rows.Add(drNew);}}DataSetIOdio=newDataSetIO();dio.InputDataSet(ds);}}

DateSetIO类部分publicboolInputDataSet(DataSetds){stringsqlStr=ConfigurationManager.ConnectionStrings["XXXConnectionString"].ConnectionString;SqlConnectionconn=newSqlConnection(sqlStr);conn.Open();SqlBulkCopysbc=newSqlBulkCopy(conn);sbc.BulkCopyTimeout=30;sbc.BatchSize=500;sbc.DestinationTableName=ds.Tables[0].TableName;for(intq=0;q<ds.Tables[0].Columns.Count;q++){sbc.ColumnMappings.Add(ds.Tables[0].Columns[q].ColumnName,ds.Tables[0].Columns[q].ColumnName);}try{sbc.WriteToServer(ds.Tables[0]);returntrue;}catch(Exception){returnfalse;}finally{ds.Dispose();conn.Close();sbc.Close();}}

解决方案

解决方案二:
DataItem属性只在发生GridView控件的RowDataBound事件时及在发生后才可用
解决方案三:
引用1楼shingoscar的回复:

DataItem属性只在发生GridView控件的RowDataBound事件时及在发生后才可用

那我这个onclick事件要如何写呢,checkbox是postback属性。
解决方案四:
引用2楼ninonangel的回复:

Quote: 引用1楼shingoscar的回复:
DataItem属性只在发生GridView控件的RowDataBound事件时及在发生后才可用

那我这个onclick事件要如何写呢,checkbox是postback属性。

这和click事件有什么关系?你先保证了RowDataBound事件已经执行了再说
解决方案五:
引用3楼shingoscar的回复:

Quote: 引用2楼ninonangel的回复:
Quote: 引用1楼shingoscar的回复:
DataItem属性只在发生GridView控件的RowDataBound事件时及在发生后才可用

那我这个onclick事件要如何写呢,checkbox是postback属性。

这和click事件有什么关系?你先保证了RowDataBound事件已经执行了再说

研究了好半天也没有一点头绪。从onrowdatabound里获取datatable,那不是每postback一次就要重新获取一次?
解决方案六:
引用楼主ninonangel的回复:

各位大神别吐槽萌新不用三层设计~~先实现再分层~实现结果:本新用存储过程为GridView填充数据,然后根据checkbox把girdview中的数据导入到另外一个数据。思路:获取gridview中的行数据,然后通过datatable.newrow来循环储存,最后将datatable用datasetIO类的方法复制到目标数据库中。结果出现了“未将对象引用设置到对象的实例。”的报错信息。报错点如下:drNew=((DataRowView)this.GridView1.Rows[i].DataItem).Row;

请问要怎么解决~~~我不想用Insert语句啊,sqlbulkcopy方法这么好用,错一个就回滚~~~各位大神帮帮忙以下为主要代码部分。。按钮事件部分:protectedvoidbtnInsert_Click(objectsender,EventArgse){using(DataSetds=newDataSet()){ds.Tables.Add("tb_MainData");for(intj=3;j<GridView1.Columns.Count;j++){ds.Tables[0].Columns.Add(GridView1.Columns[j].SortExpression);}for(inti=0;i<=GridView1.Rows.Count-1;i++){CheckBoxcbox=(CheckBox)GridView1.Rows[i].FindControl("CheckBox1");if(cbox.Checked==true){DataRowdrNew=ds.Tables[0].NewRow();drNew=((DataRowView)this.GridView1.Rows[i].DataItem).Row;ds.Tables[0].Rows.Add(drNew);}}DataSetIOdio=newDataSetIO();dio.InputDataSet(ds);}}

DateSetIO类部分publicboolInputDataSet(DataSetds){stringsqlStr=ConfigurationManager.ConnectionStrings["XXXConnectionString"].ConnectionString;SqlConnectionconn=newSqlConnection(sqlStr);conn.Open();SqlBulkCopysbc=newSqlBulkCopy(conn);sbc.BulkCopyTimeout=30;sbc.BatchSize=500;sbc.DestinationTableName=ds.Tables[0].TableName;for(intq=0;q<ds.Tables[0].Columns.Count;q++){sbc.ColumnMappings.Add(ds.Tables[0].Columns[q].ColumnName,ds.Tables[0].Columns[q].ColumnName);}try{sbc.WriteToServer(ds.Tables[0]);returntrue;}catch(Exception){returnfalse;}finally{ds.Dispose();conn.Close();sbc.Close();}}

drNew=((DataRowView)this.GridView1.Rows[i].DataItem).Row;将这句的this去掉
解决方案七:
去掉this也没用,依旧报null错
解决方案八:
好了,自己解决了,有了点笨办法。。for(inti=0;i<=GridView1.Rows.Count-1;i++){CheckBoxcbox=(CheckBox)GridView1.Rows[i].FindControl("CheckBox1");if(cbox.Checked==true){DataRowdrNew=ds.Tables[0].NewRow();for(intm=3;m<GridView1.Columns.Count;m++){drNew[m-3]=GridView1.Rows[i].Cells[m].Text.ToString();}ds.Tables[0].Rows.Add(drNew.ItemArray);}}

数据是取出来了,而且不用rowdatabound,但是牺牲了效率,嵌套循环有木有啊。。后续改进,也请看到的大神帮忙想想办法。

时间: 2024-09-11 14:44:21

新手求详细解答~~关于获取GridView中数据存储到DataTable的问题的相关文章

新手-c++简单的学生成绩管理问题,求详细解答,谢谢!

问题描述 c++简单的学生成绩管理问题,求详细解答,谢谢! 因为在虚拟桌面写的代码,不能复制,只能截屏......非常感谢! 解决方案 你的问题是什么呢?代码运行不正确还是什么问题

内存表-求高手解答,ORACLE 12C 中新加功能InMemory疑问

问题描述 求高手解答,ORACLE 12C 中新加功能InMemory疑问 在SQLPLUS中设置完一些表为InMemory之后,后面进行维护时,有没有方法可以获取到哪些表为InMemory表 我测试重复设置InMemory和no InMemory,SQLPLUS中也不会有错误信息 SQL> alter table test no inmemory; Table altered. SQL> alter table test no inmemory; Table altered. SQL>

bean-新手Spring错误,求详细解答

问题描述 新手Spring错误,求详细解答 出现这个错误,新手求指教怎么修改 : Error creating bean with name 'leavePersonManageBS': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'leavePersonLi

不理解-各个选项是干嘛用的 求详细解答

问题描述 各个选项是干嘛用的 求详细解答 create new android Virtual Device 里面的各个选项怎么用呢? 解决方案 创建AVD有两种方法: 一种是直接在Eclipse平台中创建,一种是在命令行中创建 (两种方法都很简单) 首先在Eclispe中创建AVD 在Eclispe菜单栏中选择 'Window ' 选项,然后选择 'Android SDK and AVD Manager ' 然后点击New 来创建AVD 点击New 之后弹出 Create new Androi

ios的tabbar问题求详细解答,这个tabbar下面的图标突出一块怎么做的。谢谢各位大神。

问题描述 ios的tabbar问题求详细解答,这个tabbar下面的图标突出一块怎么做的.谢谢各位大神. 解决方案 自己自定义一个标签视图控制器吧: 自定义一个类继承自UITabBarController: 然后在该类的.m文件中自己写button和其点击事件间的切换 #import "MyTabBarController.h" #define WIDTH (myView.frame.size.width / 4) #define HEIGHT (myView.frame.size.h

图片-Java新人求解答:自己制作一个网站,出现问题,求详细解答。

问题描述 Java新人求解答:自己制作一个网站,出现问题,求详细解答. 我自己制作了一个网站,该网页上设定了插入图片这一选项,可是当我插入一张名为 Peter_Jackson.jpg 的图片后,网页上没有显示, 而且myeclipse的console还报出了如下错误: java.io.FileNotFoundException: C:mysoftwareapache-tomcat-7.0.37webappsfriend2uploadpic_3E:David_LiupicturePeter_Jac

javascript-用myeclipse做了一个网站,报了500错误,求详细解答。

问题描述 用myeclipse做了一个网站,报了500错误,求详细解答. 用myeclipse10做了一个交友网站,注册完登陆后显示500错误,我觉得应该是路径错误, 但我不知道具体错误在哪里,求详细解答. 以下是我myeclipse中console后的错误报告: 信息: Server startup in 17270 ms service... 三月 22, 2016 10:33:24 上午 org.apache.catalina.core.StandardWrapperValve invok

axis2生成客户端代码-通过axis2生成的客户端代码都是些什么类,求详细解答

问题描述 通过axis2生成的客户端代码都是些什么类,求详细解答 如图中的类,求解救 解决方案 自动生成的代理类,保证了服务的请求和响应的接口

用sender的Parent获取GridView中的当前行

 这篇文章主要介绍了利用sender的Parent获取GridView中的当前行的方法,大家参考使用吧     获取GridView当行有好几个方法:   1 加RowCommand事件中,判断请求的发出按钮控件名,根据传递的参数来获取当前行中我们需要的参数. 2 GridView设置datakeynames方式.   以上方法实现不再累赘.   今天给大家介绍一种最方便,也最满足日常思维的好办法: 采用控件事件的sender的Parent来获取cell对象,再取cell的上级对象,也就是row