这是我的代码,我想实现 DATAGRID 带有分页功能并能多行编辑,多行删除的(编辑与删除可跨页进行) 但点击更新时报 :未将对象引用设置到对象的实例。行 174: DataRow dr = ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]);
protected System.Web.UI.WebControls.DataGrid dgContacts;
protected System.Data.SqlClient.SqlDataAdapter da;
protected System.Data.SqlClient.SqlCommand sqlSelectCommand1;
protected System.Data.SqlClient.SqlCommand sqlInsertCommand1;
protected System.Data.SqlClient.SqlCommand sqlUpdateCommand1;
protected System.Data.SqlClient.SqlCommand sqlDeleteCommand1;
protected System.Data.SqlClient.SqlConnection sqlCon;
protected System.Web.UI.WebControls.Button btnUpdate;
protected Wcbg1.DataSet1 ds1;
private string _sSort;
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack )
{ BindContacts();
_sSort = "id";
}
else
{
_sSort = (string)ViewState["Sort"];
} }private void BindContacts()
{
ViewState["Sort"] = _sSort;
da.Fill(ds1);
DataView dv = new DataView(ds1.Tables["Contact"]);
dv.Sort = _sSort;
dgContacts.DataSource = dv;
dgContacts.DataBind();
}
private void btnUpdate_Click(object sender, System.EventArgs e)
{
foreach (DataGridItem di in dgContacts.Items)
{
if (di.ItemType == ListItemType.Item || di.ItemType == ListItemType.AlternatingItem)
{
DataRow dr = ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]);
if (((CheckBox)di.FindControl("chkDelete")).Checked)
{
// ds1.Tables["Contact"].Rows.Remove(ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]));//删除指定行
}
else
{
dr["id"] =dgContacts.DataKeys[di.ItemIndex];
dr["Name"] = ((TextBox)di.FindControl("Name")).Text;
dr["pp"] = ((TextBox)di.FindControl("pp")).Text;
string strUpdate="";
strUpdate+="name='"+dr["Name"]+"'";
strUpdate+=",pp='"+dr["pp"]+"'";
string updateCmd="UPDATE pl set "+strUpdate+" where id='"+dr["id"] +"'";
SqlCommand myCommand=new SqlCommand(updateCmd,sqlCon);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
}
}
}
private void dgContacts_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{dgContacts.CurrentPageIndex=e.NewPageIndex;
BindContacts();
}
protected System.Web.UI.WebControls.DataGrid dgContacts;
protected System.Data.SqlClient.SqlDataAdapter da;
protected System.Data.SqlClient.SqlCommand sqlSelectCommand1;
protected System.Data.SqlClient.SqlCommand sqlInsertCommand1;
protected System.Data.SqlClient.SqlCommand sqlUpdateCommand1;
protected System.Data.SqlClient.SqlCommand sqlDeleteCommand1;
protected System.Data.SqlClient.SqlConnection sqlCon;
protected System.Web.UI.WebControls.Button btnUpdate;
protected Wcbg1.DataSet1 ds1;
private string _sSort;
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack )
{ BindContacts();
_sSort = "id";
}
else
{
_sSort = (string)ViewState["Sort"];
} }private void BindContacts()
{
ViewState["Sort"] = _sSort;
da.Fill(ds1);
DataView dv = new DataView(ds1.Tables["Contact"]);
dv.Sort = _sSort;
dgContacts.DataSource = dv;
dgContacts.DataBind();
}
private void btnUpdate_Click(object sender, System.EventArgs e)
{
foreach (DataGridItem di in dgContacts.Items)
{
if (di.ItemType == ListItemType.Item || di.ItemType == ListItemType.AlternatingItem)
{
DataRow dr = ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]);
if (((CheckBox)di.FindControl("chkDelete")).Checked)
{
// ds1.Tables["Contact"].Rows.Remove(ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]));//删除指定行
}
else
{
dr["id"] =dgContacts.DataKeys[di.ItemIndex];
dr["Name"] = ((TextBox)di.FindControl("Name")).Text;
dr["pp"] = ((TextBox)di.FindControl("pp")).Text;
string strUpdate="";
strUpdate+="name='"+dr["Name"]+"'";
strUpdate+=",pp='"+dr["pp"]+"'";
string updateCmd="UPDATE pl set "+strUpdate+" where id='"+dr["id"] +"'";
SqlCommand myCommand=new SqlCommand(updateCmd,sqlCon);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
}
}
}
private void dgContacts_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{dgContacts.CurrentPageIndex=e.NewPageIndex;
BindContacts();
}
除非你用某种方式来保存
我点击更新时出错:未将对象引用设置到对象的实例。行 174: DataRow dr = ds1.Tables["Contact"].Rows.Find(dgContacts.DataKeys[di.ItemIndex]);
是什么意思,
luckweb(冰川) ;用xml文件怎样实现啊,具体点
我是个初学者请帮忙谢谢?继续讨论: DATAGRID一个带有 分页功能并能多行编辑,多行删除的(编辑与删除可跨页进行)
http://community.csdn.net/Expert/topic/3612/3612125.xml?temp=.9827997
高手有时间帮个忙,谢谢
{
//重新显示所选择的项目
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
if(HdnSelectedValues.Value.IndexOf(((Literal)e.Item.Cells[1].FindControl("TitleShow")).Text) >= 0 )
{
HtmlInputCheckBox ChkSelected = (HtmlInputCheckBox)(e.Item.Cells[0].FindControl("ChkSelect"));
ChkSelected.Checked = true;
}
}
}
你必须提供一个持久化的机制来保存提交页面之前的数据,并设置一个提交点来批量提交所作的修改!
(我也就能想到这么些了!:-( 说实话我觉得没有这个必要)
--------
令你的问题描述不太清楚,请详细说明你的问题应用场景,问题描述等
test.aspx
===========================>
<%@ Page Language="C#" Debug="True"%>
<%@Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient" %><script language="C#" runat="server">
const string DataTableName="Employees";
SqlConnection conn;
SqlDataAdapter adapter;
void Page_Load(Object src, EventArgs e)
{
conn=new SqlConnection("server=(local);database=pubs;uid=sa;pwd=");
adapter=new SqlDataAdapter("select * from employees",conn);
if(!Page.IsPostBack){
BindData();
}
}//绑定数据
void BindData(){
//先从Session中获取DataTable
DataTable table=(DataTable)Session[DataTableName];
//若Session中的DataTable不存在,则从数据库获取数据
if(table==null){
table=new DataTable();
adapter.Fill(table);
//将DataTable保存到Session中
SaveTableToSession(table);
table.Columns["id"].AutoIncrement=true;
}
grid.DataSource=table;
grid.DataBind();
}void ChangePage(object src,DataGridPageChangedEventArgs e){
grid.CurrentPageIndex=e.NewPageIndex;
BindData();
}void UpdateDataTable(object src,EventArgs e){
try{
DataTable table=GetTableFromSession();
string name;
byte age;
string address;
CheckBox ckdel;
for(int i=0;i<grid.Items.Count;i++){
DataGridItem dgitem=grid.Items[i];
int empId=(int)grid.DataKeys[dgitem.ItemIndex];
ckdel=dgitem.FindControl("delckb") as CheckBox;
name=((TextBox)dgitem.Cells[0].Controls[1]).Text;
age=byte.Parse(((TextBox)dgitem.Cells[1].Controls[1]).Text);
address=((TextBox)dgitem.Cells[2].Controls[1]).Text;
UpdateEmployee(table,empId,name,age,address,ckdel.Checked);
}
SaveTableToSession(table);
cancelbtn.Enabled=true;
int rowcount=0;
foreach(DataRow row in table.Rows){
if(row.RowState!=DataRowState.Deleted)
rowcount++;
}
if(Math.Ceiling(rowcount/5.0)==grid.CurrentPageIndex&&grid.CurrentPageIndex>0)
grid.CurrentPageIndex-=1;
BindData();
msglbl.Text="更新数据表成功!";
}
catch(Exception ex){
msglbl.Text="更新数据表失败,出现意外错误:"+ex.Message;
}
}
void UpdateEmployee(DataTable table,int id,string name,byte age,string address,bool isDelete){
for(int i=0;i<table.Rows.Count;i++){
DataRow row=table.Rows[i];
//如果选中了删除复选框,就直接就该行数据删除,不用再更新,否则更新该行数据
if(row!=null&&row.RowState!=DataRowState.Deleted){
if((int)row["id"]==id){
if(!isDelete){
row["name"]=name;
row["age"]=age;
row["address"]=address;
}
else
row.Delete();
}
}
}
msglbl.Text="更新数据表成功!";
}void UpdateDataBase(object src,EventArgs e){
try{
DataTable table=GetTableFromSession();
SqlCommandBuilder cmdbd=new SqlCommandBuilder(adapter);
adapter.Update(table);
msglbl.Text="更新数据源成功!";
cancelbtn.Enabled=false;
}
catch(Exception ex){
msglbl.Text="更新数据源失败,出现意外错误:"+ex.Message;
}
BindData();
}void CancelUpdate(object src,EventArgs e){
DataTable table=GetTableFromSession();
table.RejectChanges();
grid.CurrentPageIndex=0;
BindData();
cancelbtn.Enabled=false;
}void AddNewEmployee(object src,DataGridCommandEventArgs e){
if(e.CommandName=="Add"){
try{
DataTable table=GetTableFromSession();
string name=((TextBox)e.Item.FindControl("newname")).Text;
byte age=byte.Parse(((TextBox)e.Item.FindControl("newage")).Text);
string address=((TextBox)e.Item.FindControl("newaddress")).Text;
DataRow row=table.NewRow();
row["name"]=name;
row["age"]=age;
row["address"]=address;
table.Rows.Add(row);
SaveTableToSession(table);
//重新绑定数据
BindData();
msglbl.Text="添加新记录成功!";
cancelbtn.Enabled=true;
}
catch(Exception ex){
msglbl.Text="未能添加新记录,出现意外错误:"+ex.Message;
}
}
}//将DataTable保存到session中
void SaveTableToSession(DataTable table){
Session[DataTableName]=table;
}//从Session中获取DataTable
DataTable GetTableFromSession(){
DataTable table=(DataTable)Session[DataTableName];
if(table!=null){
return table;
}
else{
msglbl.Text="未能从Session中获取数据,可能Session已超时,请刷新或重新打开当前页面!";
return null;
}
}
</script>
<html>
<head>
<title> Webdiyer制造:)</title>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="Webdiyer(http://www.webdiyer.com)">
</head>
<body><form runat="server">
<asp:DataGrid runat="server" id="grid" AutogenerateColumns=false DataKeyField="id" ShowFooter=true AllowPaging=true PageSize=5 OnPageIndexChanged="ChangePage" PagerStyle-Mode="numericpages" OnItemCommand="AddNewEmployee">
<Columns>
<asp:TemplateColumn HeaderText="姓名">
<ItemTemplate>
<asp:TextBox runat="server" id="name" Text='<%#DataBinder.Eval(Container.DataItem,"name")%>'/>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" id="newname"/>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="年龄">
<ItemTemplate>
<asp:TextBox runat="server" id="age" Text='<%#DataBinder.Eval(Container.DataItem,"age")%>'/>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" id="newage"/>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="住址">
<ItemTemplate>
<asp:TextBox runat="server" id="address" Text='<%#DataBinder.Eval(Container.DataItem,"address")%>'/>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" id="newaddress"/>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="删除">
<ItemTemplate>
<asp:CheckBox runat="server" id="delckb"/>
</ItemTemplate>
<FooterTemplate>
<asp:Button runat="server" Text="添加" CommandName="Add"/>
</FooterTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<asp:Label runat="server" EnableViewState="false" id="msglbl" ForeColor="red"/>
<div>
<asp:Button runat="server" id="updatebtn" Text="更新数据表" OnClick="UpdateDataTable"/>
<asp:Button runat="server" id="cancelbtn" Text="取消对数据表的更新" Enabled=false OnClick="CancelUpdate"/>
<asp:Button runat="server" id="updatedbtbn" Text="更新数据源" OnClick="UpdateDataBase"/>
</div>
<div>
说明:DataGrid中的数据类型都没有进行验证,如果输入错误的数据类型或空值可能会出错,实际应用中应该对用户输入的数据进行验证!
</div>
</form>
</body>
</html>
数据库中employees表结构:CREATE TABLE employees (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[age] [tinyint] NOT NULL ,
[address] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GOALTER TABLE employees ADD
CONSTRAINT [PK_employees] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO