我有一个gridview,里面是一个项目状态的复选框, 复选框有checkchanged事件,但是当我试图检查或取消选中它时,checkchanged没有触发。
这里是gridview的代码,里面有复选框
<asp:GridView ID="dgvItems" runat="server" OnRowCreated="dgvItems_RowCreated" OnRowDataBound="dgvItems_RowDataBound" OnSelectedIndexChanged="dgvItems_SelectedIndexChanged" OnRowDeleting="dgvItems_RowDeleting">
<Columns>
<asp:TemplateField HeaderText ="Status">
<ItemTemplate>
<asp:CheckBox ID="chkStatus" runat="server" Checked = <%# (string)Eval("item_status") == "Active" ? true : false %> OnCheckedChanged="chkStatus_CheckedChanged" AutoPostBack="True" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
protected void chkStatus_CheckedChanged(object sender, EventArgs e)
{
GridViewRow row = dgvItems.SelectedRow;
string item_id = row.Cells[0].Text.ToString();
con.Open();
SqlCommand cmd = new SqlCommand("Update Items set item_status = 'Inactive' where item_id = @item_id ",con);
cmd.Parameters.AddWithValue("@item_id", cmd);
cmd.ExecuteNonQuery();
con.Close();
}
提前致谢!
答案 0 :(得分:1)
我想到了两件事:
Page_Load
不会处理IsPostBack
- 属性,因此您始终会对网格进行数据绑定,即使在回发时也是如此。这可以防止事件发生。GridViewRow row = dgvItems.SelectedRow;
是null
。 使用此代码从已检查的GridViewRow
CheckBox
CheckBox chkStatus = (CheckBox) sender;
GridViewRow row = (GridViewRow) chkStatus.NamingContainer;
答案 1 :(得分:0)
如果您的选中状态最初为false,则再次将其设置为false不会触发CheckedChanged
事件。
这是因为检查状态实际上没有改变
这是尝试设置CheckBox1.Checked
属性
public void set_Checked(bool value)
{
if (value != this.Checked)
{
this.CheckState = value ? CheckState.Checked : CheckState.Unchecked;
}
}