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


代码很丑只是测试功能用的。现在在页面加载中点击数据行的"删除"连接删除数据没有任何问题。
但是如果按姓名查找之后再点击"删除"按钮,就不一定会删除哪行数据了。
用response.write方法看了一下 int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value); 同一行数据 页面加载、查询后删除的行为后取得的id值是不一样的,但是查询后的页面数据显示的id号是正确的。
例如这个页面加载中id取得的是24,但是按姓名查询后取得就是21
前台.aspx代码
后台.cs代码
------解决思路----------------------
假设在你的页面上拖入一个 Button,产生Click事件回发。然后测试,在你的页面上先按照姓名查询,显示数据之后再点这个测试按钮产生页面刷新,之前的按照工号查询的列表还能保持仍然是按照这个姓名查询吗?如果不是,那么先把这个测试通过了,再说你的问题。先不要再考虑别的什么asp.net 编程了!
因为这种最基本的(一个Button回发,什么都不做)测试都通不过,你的数据自然就乱了,自然就有更多的数据bug。
实际上,要看看你的page_load等等代码。正常的asp.net程序在page_load中会去判断 if(!IsPostback) 条件,回发时并不会去读取数据库来重新绑定数据。在页面回发时重新绑定数据是极端错误的。
------解决思路----------------------
在页面page_load中,将方法load_girdview包在if(!IsPostback) 中
代码很丑只是测试功能用的。现在在页面加载中点击数据行的"删除"连接删除数据没有任何问题。
但是如果按姓名查找之后再点击"删除"按钮,就不一定会删除哪行数据了。
用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();
}
}