我做了一个gridview和detailview的绑定,当我第一次点击gridview的选择时,正常弹出detailview的编辑框,但更新后再点击gridview时,就直接弹出detailview编辑框的下一个框。为什么??
 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DetailsView1.Visible = true;
        SqlConnection sqlcon = new SqlConnection();
        sqlcon.ConnectionString = "data source=90D57B80B843459;database=Equipment;uid=sa;pwd=;";
        sqlcon.Open();
        string ID号 = GridView1.DataKeys[GridView1.SelectedIndex].Values[0].ToString();
        string sqlstr = "select ID号,设备名称,型号,编号,配属单位,运用区段,上线运用日期,设备厂家,状态 from [liewei1] where ID号=" + ID号;
        SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
        DataSet myds = new DataSet();        myda.Fill(myds);
        DetailsView1.DataSource = myds;
        DetailsView1.DataBind();
        //GridView1.DataBind();
        sqlcon.Close();
        this.Page_Load(sender, e);    }
  protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {        string 设备名称;
        string 型号;
        string 编号;
        string 运用区段;
        string SqlUpdate;        设备名称 = ((TextBox)DetailsView1.Rows[1].Cells[1].Controls[0]).Text.Trim();
        //tb = (TextBox)(DetailsView1.Rows[5].Cells[1].FindControl("TextBox5"));
        型号 = ((TextBox)DetailsView1.Rows[2].Cells[1].Controls[0]).Text;
        //tb = (TextBox)(DetailsView1.Rows[1].Cells[1].FindControl("TextBox1"));
        编号 = ((TextBox)DetailsView1.Rows[3].Cells[1].Controls[0]).Text;
        //tb = (TextBox)(DetailsView1.Rows[6].Cells[1].FindControl("TextBox6"));
        运用区段 = ((TextBox)DetailsView1.Rows[5].Cells[1].Controls[0]).Text.Trim();
        string 上线运用日期 = ((TextBox)DetailsView1.Rows[6].Cells[1].Controls[0]).Text.Trim();
        string 配属单位 = ((TextBox)DetailsView1.Rows[4].Cells[1].Controls[0]).Text.Trim();
        string 设备厂家 = ((TextBox)DetailsView1.Rows[7].Cells[1].Controls[0]).Text.Trim();
        string 状态 = ((TextBox)DetailsView1.Rows[8].Cells[1].Controls[0]).Text.Trim();        string ID号 = GridView1.DataKeys[GridView1.SelectedIndex].Values[0].ToString();
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "data source=90D57B80B843459;database=Equipment;uid=sa;pwd=;";
        SqlUpdate = "update [liewei1] set 设备名称 = '" + 设备名称.Trim() + "',型号 = '" + 型号 + "', 编号 = '" + 编号 + "',配属单位 = '" + 配属单位 + "',运用区段 = '" + 运用区段 + "',上线运用日期='" + 上线运用日期 + "',设备厂家 = '" + 设备厂家 + "',状态 = '" + 状态 + "'where ID号=" + ID号;        //con.Open();
        //SqlCommand cmd = new SqlCommand(SqlUpdate, con);
        //cmd.ExecuteNonQuery();        //con.Close();
        //try
        //{        if (conn.State.ToString() == "Closed")
            conn.Open();
        SqlCommand comm = new SqlCommand(SqlUpdate, conn);
        comm.ExecuteNonQuery();        if (conn.State.ToString() == "Open")
            conn.Close();
        Detailsbind();
        DetailsView1.DataBind();
        BindGridView();
        DetailsView1.Visible = false;
        //}
        //catch (Exception ex)
        //{
        //    Response.Write("数据库错误,错误原因:" + ex.Message);
        //    Response.End();
        //}    }

解决方案 »

  1.   

    没怎么看懂, 先挑些小毛病吧.
    1.
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
    {
    //sqlcon.Open(); 
    //sqlcon.Close();
    这两个都去掉吧. SqlDataAdapter会在必要时给你自动打开和关闭连接. 凡是DataAdapter在的地方, 不用显示的开关连接.}
    2. 
    GridView1_SelectedIndexChanged()里调用this.Page_Load(sender, e); 让人感觉莫名其妙. 我实在想不出有什么理由手动执行Page_Load(), 我从来没见过在一个方法里调用Page_Load()这种事情.
    如果你有什么理由的话,那我敢100%告诉你, 你肯定想错了!
    3.
    我个人反正是相当讨厌DetailsView1.Rows[5].Cells[1].FindControl类似这样从控件的"皮肤"上刮下数据的操作. 这应该有别的替代方法.
    4.
    最主要的,我觉得代码很乱, 到处绑定, 这个肯定也错了.呵呵, 别在意哦~
      

  2.   

    更新后detailview仍处于编辑模式,你要将的模式改变
      

  3.   

    gridview.editrow=-1
    GRIDVIEW编辑模式取消
      

  4.   

     protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {
             ...
             DetailsView1.CurrentMode = DetailsViewMode.ReadOnly;
    }
      

  5.   

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 

    this.DetailsView1.PageIndex = this.GridView1.SelectedRow.DataItemIndex; 
    this.DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); 
    BindDetails(); 

    protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) 

     //修改数据
    this.DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); 
    //重新绑定GridView和DetailsView数据 
    BindData(); 

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 

    this.GridView1.PageIndex = e.NewPageIndex; 
    BindGridView(); 

    protected void DetailsView1_ModeChanging(object sender, DetailsViewModeEventArgs e) 

    if (e.NewMode == DetailsViewMode.Edit) 

    DetailsView1.ChangeMode(DetailsViewMode.Edit); 

    if (e.NewMode == DetailsViewMode.Insert) 

    DetailsView1.ChangeMode(DetailsViewMode.Insert); 

    if (e.NewMode == DetailsViewMode.ReadOnly) 

    DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); 

    BindDetails();