【发布时间】:2014-12-23 21:41:55
【问题描述】:
当我将 gridview 中的复选框默认设置为 Checked = true 时,我遇到了一个奇怪的行为!
<asp:UpdatePanel ID="UpdatePanel3" runat="server">
<ContentTemplate>
<asp:Panel ID="pnl_lect" runat="server">
<asp:GridView ID="gv_lect" runat="server" AutoGenerateColumns="False" DataKeyNames="prog_ser,lect_code,lect_type"
CssClass="formTable cr_center" OnDataBound="gv_lect_DataBound" OnRowDataBound="gv_lect_RowDataBound">
<Columns>
<asp:BoundField HeaderText="lect_name" DataField="name" />
<asp:TemplateField HeaderText="1">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_1" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="2">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_2" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="3">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_3" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="4">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_4" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="5">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_5" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="6">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_6" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="7">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_7" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="8">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_8" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="9">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_9" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="10">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_10" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="11">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_11" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="12">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_12" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="13">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_13" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="14">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_14" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="15">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_15" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="16">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_16" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="17">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_17" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="18">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_18" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="19">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_19" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="20">
<ItemTemplate>
<asp:CheckBox ID="CheckBox_20" runat="server" Checked="false" AutoPostBack="true"
OnCheckedChanged="CheckBox1_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
bool res = true;
try
{
CheckBox chkbox = (CheckBox)sender;
GridViewRow r = (GridViewRow)chkbox.NamingContainer;
ProgAbsence abs = new ProgAbsence();
int progSer = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[0].ToString());
int lectCode = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[1].ToString());
int lectType = int.Parse(((GridView)(r.NamingContainer)).DataKeys[r.DataItemIndex].Values[2].ToString());
int sessionId = int.Parse(chkbox.ID.Split('_')[1]);
abs.LectCode = lectCode;
abs.LectType = lectType;
abs.ProgSer = progSer;
abs.SessionId = sessionId;
if (chkbox.Checked)
{
res = abs.Add();
}
else
{
res = abs.Delete();
}
BindAbsence();
}
catch (Exception ee)
{
res = false;
BindAbsence();
}
}
/* =========================================================================== */
protected void gv_lect_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex >= 0)
{
DataTable dt = ((DataTable)ViewState["abs"]);
if (dt != null && dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
if (((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[0].ToString().Trim() == dt.Rows[i]["prog_ser"].ToString()
&&
((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[1].ToString().Trim() == dt.Rows[i]["lect_code"].ToString()
&&
((GridView)(e.Row.NamingContainer)).DataKeys[e.Row.DataItemIndex].Values[2].ToString().Trim() == dt.Rows[i]["lect_type"].ToString())
{
((CheckBox)(e.Row.Cells[int.Parse(dt.Rows[i]["session_id"].ToString())].Controls[1])).Checked = true;
}
}
}
}
}
/* =========================================================================== */
此代码工作正常,但是当我将所有复选框选中属性默认值为 true 而不是 false 时,我得到错误的复选框(不是发件人)并且事件有时并非一直有效!
如何使复选框默认值为 true 并使其按预期工作?
【问题讨论】:
-
为什么会出现错误?您是否至少在
catch中设置了断点?你有例外吗? -
@TimSchmelter:我已经试过了。
CheckBox chkbox = (CheckBox)sender;复选框 id 不是我点击的那个,有时我觉得它卡住了,支票没有改变! -
你是在c#中还是在aspx页面中设置了默认值=true?
-
@Koen :在 aspx 页面中
-
并且只有 1 个(错误的)复选框发送回发吗?还是当您单击 1 时它们全部?
标签: c# asp.net ajax gridview checkbox