问题描述
各位大神别吐槽萌新不用三层设计~~先实现再分层~实现结果:本新用存储过程为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,但是牺牲了效率,嵌套循环有木有啊。。后续改进,也请看到的大神帮忙想想办法。