原帖在这里,(http://bbs.csdn.net/topics/390275032?page=1#post-392864180)不过可以不去看了,我在这贴里重复一遍吧:关于GridView删除、编辑功能的代码实现。
 页面上有GridView1和GridView2,都指向同一数据源中的Save表,表中有ID,Name,Time,Ex4列,其中ID列设置为不显示。
 GridView1在页面显示,Gridview2用作查询功能,最开始不显示,点击Button2后根据TextBox中的内容显示查询到的信息。GridView1一切功能正常,主要问题是GridView2上。以下是部分代码:
 
protected void Button2_Click(object sender, EventArgs e)
     {
         SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test.mdf;Integrated Security=True;User Instance=True");
         conn.Open();
         string sql1 = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";       //点击按钮后显示GridView2,列出查询的信息
         SqlCommand cmd1 = new SqlCommand(sql1, conn);
         SqlDataAdapter da = new SqlDataAdapter(cmd1);
         DataSet ds = new DataSet();
         da.Fill(ds);
         GridView2.DataSource = ds;
         GridView2.DataBind();
     }
 GridView2查询功能正常,现在我想在GridView2上增加编辑、删除功能按钮。GridView1是通过向导绑定的数据源,使用的是其自带的删除、编辑功能。GridView2用代码如何实现删除、编辑功能。查了下资料,自己改了改,如下:我是直接通过编辑列-》添加CommandField->添加删除、编辑按钮。然后添加了RowEditing、RowUpdating、RowCancelingEdit、RowDeleting四个事件,代码如下:
 
...
 SqlConnection sqlcon;
 SqlCommand sqlcom;
 string strCon=@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test.mdf;Integrated Security=True;User Instance=True";  //连接字符串
 ...
 protected void Page_Load(object sender, EventArgs e)
     {
         if(!IsPostBack)
         {
             bind();
         }
     }
 
protected void Button2_Click(object sender, EventArgs e) //点击按钮实现查询TextBox中的内容,显示到GridView2中
     {
         SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test.mdf;Integrated Security=True;User Instance=True");
         conn.Open();
         string sql1 = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";
         SqlCommand cmd1 = new SqlCommand(sql1, conn);
         SqlDataAdapter da = new SqlDataAdapter(cmd1);
         DataSet ds = new DataSet();
         da.Fill(ds);
         GridView2.DataSource = ds;
         GridView2.DataBind();
     }
 
protected void GridView2_RowDeleting(object sender, GridViewDeleteEventArgs e) //删除功能
     {
         string sqlstr="delete from [Save] where ID='" + GridView2.DataKeys[e.RowIndex].Value.ToString() + "'";
         sqlcon = new SqlConnection(strCon);
         sqlcom = new SqlCommand(sqlstr, sqlcon);
         sqlcon.Open();
         sqlcom.ExecuteNonQuery();
         sqlcon.Close();
         bind();
     }
 
protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
     {
         this.GridView2.EditIndex = e.NewEditIndex;
         bind();
     }
 protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
     {
         sqlcon = new SqlConnection(strCon);
         string sqlstr = "update [Save] set Names='"
             + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',Time='"
             + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',Ex='"
             + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where ID='"
             + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
         sqlcom = new SqlCommand(sqlstr, sqlcon);
         sqlcon.Open();
         sqlcom.ExecuteNonQuery();
         sqlcon.Close();
         GridView1.EditIndex = -1;
         bind();
     }
 
protected void GridView2_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
     {
         GridView2.EditIndex = -1;
         bind();
     }
public void bind()
     {
         string sqlstr = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";
         sqlcon = new SqlConnection(strCon);
         SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
         DataSet myds = new DataSet();
         sqlcon.Open();
         myda.Fill(myds, "Save");
         GridView2.DataSource = myds;
         GridView2.DataKeyNames = new string[] { "ID" };
     }   
 
现在运行有以下几个问题:
 1.本来Save表中有4列:ID,Name,Time,Ex。我只想显示后三列,且ID列设为主键。
 代码为:string sql1 = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";
 但是运行后,Button2_Click事件中的GridView2.DataBind()这句在点击查询按钮后提示这句有误:
 “DataBinding:“System.Data.DataRowView”不包含名为“ID”的属性”。
 
于是我把string sql1 = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";
 改为:
        string sql1 = "select ID as ID,Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'"; 加上了ID列,运行不报错了,但是出现了问题2;
 
问题2:
 点击编辑或者删除按钮后GridView2无反应,再次点击某一按钮后出现第一次点击的效果,感觉像是没有刷新一样。是否是数据绑定问题?但是我每个事件后面都添加了bind()函数。
问题3:同问题1,怎么修改下可以使ID列隐藏而不报错? 问题有点长,求教!

解决方案 »

  1.   

    编辑也有问题,点击编辑,修改之后点击更新,提示“指定的参数已超出有效值的范围。参数名: index ”
    出错行在 string sqlstr = "update [Save] set Names='"
                  + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',Time='"
                  + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',Ex='"
                  + ((TextBox)(GridView2.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where ID='"
                  + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
      

  2.   

    怎么修改下可以使ID列隐藏而不报错?
    设置ID列的只读属性为只读,可见visible属性为false。
      

  3.   

     bind()方法里面加个     GridView2.DataBind();试试
      

  4.   

    查询的时候肯定还是要查询出来的string sql1 = "select Name as 姓名,Time as 时间,Ex as 事由 from [Save] where Name='" + TextBox4.Text.Trim() + "'";这句加上id  ,然后gridview 显示的时候,atuogeneratecolumn 设置成false,通过asp:bindfield 来控制需要显示的列