使用girdview时一个很奇怪的有关问题

使用girdview时一个很奇怪的问题
本帖最后由 bulls5988 于 2015-10-04 13:57:44 编辑
使用girdview时一个很奇怪的有关问题

使用girdview时一个很奇怪的有关问题

代码很丑只是测试功能用的。现在在页面加载中点击数据行的"删除"连接删除数据没有任何问题。
但是如果按姓名查找之后再点击"删除"按钮,就不一定会删除哪行数据了。
用response.write方法看了一下 int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value); 同一行数据 页面加载、查询后删除的行为后取得的id值是不一样的,但是查询后的页面数据显示的id号是正确的。
例如这个页面加载中id取得的是24,但是按姓名查询后取得就是21

前台.aspx代码

       
            <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            PageSize="8" OnPageIndexChanging="GridView1_PageIndexChanged" 
            OnRowDeleting = "dels" DataKeyNames="user_id">

            <asp:TemplateField HeaderText="选择">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="box2"/>
                </ItemTemplate>
            </asp:TemplateField>
            
            <asp:TemplateField HeaderText ="序号">
                 <ItemTemplate>
                 <%#Eval("user_id")%>
                 </ItemTemplate>
            </asp:TemplateField>
            
            <asp:TemplateField HeaderText="工号">
                  <ItemTemplate>
                  <%#Eval("user_number")%>
                  </ItemTemplate>
             </asp:TemplateField>
             
             <asp:TemplateField HeaderText="姓名">
                  <ItemTemplate>
                  <%#Eval("user_names")%>
                  </ItemTemplate>
             </asp:TemplateField>
             
             <asp:TemplateField HeaderText="部门">
                  <ItemTemplate>
                  <%#Eval("user_part")%>
                  </ItemTemplate>
             </asp:TemplateField>
             
             <asp:TemplateField HeaderText="内容">
                <ItemTemplate>
                <a href ='personcontent.aspx?names=<%#Eval("user_names") %>'>
点击查看</a>
                </ItemTemplate>
             </asp:TemplateField> 
             
             <asp:TemplateField HeaderText ="编辑">
             <ItemTemplate>
             <asp:LinkButton ID="del" runat="server" CausesValidation 
             ="false" CommandName="Delete" Text ="删除" 
             OnClientClick='<%#"if (!confirm(\"你确定要删除" +
 Eval("user_names").ToString() + "吗?\"))
            return false;"%>'>
             </asp:LinkButton> 
             </ItemTemplate>
             </asp:TemplateField>
             
            </Columns>
        </asp:GridView>


 后台.cs代码  

//页面加载girdivew填充 
private void load_girdview()
     {
         string sql = "select * from Employee";
         SqlConnection conn = new SqlConnection(saraly.saraly());
         SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
         DataSet ds = new DataSet();
         conn.Open();
         sda.Fill(ds);
         GridView1.DataSource = ds;
         GridView1.DataBind();
         conn.Close();
     }

//girdview按姓名查询
string sql = string.Empty;
        if (TextBox1.Text != string.Empty)
        {
        sql = "select * from Employee where user_names = '" + TextBox1.Text + "'";
        }
        else
        {
            sql = "select * from Employee";
        }
        SqlConnection conn = new SqlConnection(saraly.saraly());
        SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        conn.Open();
        sda.Fill(ds);
        GridView1.DataSource = ds;
        GridView1.DataBind();
        conn.Close();

//girdview删除按钮
 protected void dels(object sender, GridViewDeleteEventArgs e)
     {
        string sql = string.Empty;
        int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value); 
        sql = "delete from Employee where user_id = '" + id + "'";
        Response.Write(id.ToString());
        SqlConnection conn = new SqlConnection(saraly.saraly());
        SqlCommand cmd = new SqlCommand(sql, conn);
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
     }

------解决思路----------------------
假设在你的页面上拖入一个 Button,产生Click事件回发。然后测试,在你的页面上先按照姓名查询,显示数据之后再点这个测试按钮产生页面刷新,之前的按照工号查询的列表还能保持仍然是按照这个姓名查询吗?如果不是,那么先把这个测试通过了,再说你的问题。先不要再考虑别的什么asp.net 编程了!

因为这种最基本的(一个Button回发,什么都不做)测试都通不过,你的数据自然就乱了,自然就有更多的数据bug。

实际上,要看看你的page_load等等代码。正常的asp.net程序在page_load中会去判断 if(!IsPostback) 条件,回发时并不会去读取数据库来重新绑定数据。在页面回发时重新绑定数据是极端错误的。
------解决思路----------------------
在页面page_load中,将方法load_girdview包在if(!IsPostback) 中

protected void Page_Load(object sender, EventArgs e)
{
load_girdview();
}
//改为
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
load_girdview();
}
}