【发布时间】:2013-06-28 14:36:55
【问题描述】:
我有一个包含 CheckBox 控件的列的 ASP GridView。这些复选框绑定到通过 SqlDataSource 访问的位字段。 GridView 是可编辑的,并且 CheckBoxes 在加载时被禁用。 我试图在编辑过程中将 enabled 属性更改为 true,因此可以更改正在编辑的行中的 CheckBox,并将此更改更新到数据库中的位字段。
ASP 代码
<asp:UpdatePanel ID="upGridView" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gvChecklist" runat="server"
AutoGenerateColumns="false" DataSourceID="dsChecklist"
AutoGenerateEditButton="true" onrowupdating="gvChecklist_RowUpdating"
onrowediting="gvChecklist_RowEditing">
<Columns>
<asp:TemplateField HeaderText="Finished">
<ItemTemplate><asp:CheckBox ID="cbFinished" runat="server" Enabled="false" Checked='<%# Eval("Finished") ?? false %>' /> </ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Division"
HeaderText="Division"
readonly="true" />
<asp:BoundField DataField="Application"
HeaderText="Application"
readonly="true" />
<asp:BoundField DataField="Task"
HeaderText="Task"
readonly="true" />
<asp:BoundField DataField="TestedBy" HeaderText="Tested By" readonly="true"/>
<asp:BoundField DataField="Notes" HeaderText="Notes" ReadOnly="false"/>
<asp:BoundField DataField="JiraTicket"
HeaderText="JIRA Ticket"
readonly="false" />
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
用于 RowEditing 事件的 C# 代码
protected void gvChecklist_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView gvChecklist = (GridView)LoginView1.FindControl("gvChecklist");
CheckBox cb = (CheckBox)gvChecklist.Rows[e.NewEditIndex].Cells[1].FindControl("cbFinished");
cb.Enabled = true;
gvChecklist.DataBind();
}
-edit:我觉得有必要在这里添加更多信息。将 CheckBox cb 设置为 GridView Row 的 CheckBox 的代码似乎工作正常,因为我可以通过调试器看到 enabled 属性 = true。我想知道在此事件运行后是否由于 PostBack 将其设置回 false。此页面的 Load 方法为空,但我认为在 ASP 页面中命中了 enabled=false 代码。
GridView 的 UI
【问题讨论】:
-
在标记中,您有复选框
Enabled="false"。你为什么要这样明确地设置它? -
因为我不希望在单击编辑按钮之前启用复选框。
-
如果加载方法为空,GV在哪里绑定?尝试设置复选框的可见性,看看它是否按预期消失/重新出现。
-
它通过每一列的DataField 属性绑定在ASP 代码中。此属性的字符串对应于从 SqlDataSource 的选择命令返回的字段。我已经试过了。当我单步调试调试器时,它看起来不错,但在事件退出后,没有任何更改持续存在。我认为这是 RowEdit 事件完成后回发的问题。