我有一个gridview,其中有一个模板字段,其中包含一个复选框作为字段之一
<asp:TemplateField HeaderText="Confirm Driver Details" FooterText="Confirm Driver Details">
<ItemTemplate>
<asp:CheckBox ID="chkConfirmDetails" runat="server" MaxLength="100" Width="50px" Enabled="false" Checked="true"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
最初选中此选项但未启用。
用户上传一个加载到对象中然后绑定到gridview的文件。在RowDataBound事件上,对数据执行了一些验证。在某些情况下,如果某些验证失败,我想启用该复选框并取消勾选。
CheckBox chkConfirmDetails = (CheckBox)e.Row.Cells[e.Row.Cells.Count - 2].FindControl("chkConfirmDetails");
//If this is enabled then we just need to check whether it is ticked or not
if (!chkConfirmDetails.Enabled)
{
if (!ValidateDriver(_uploadData.DriverData[e.Row.DataItemIndex], out driverValidationMessage))
{
Label label = new Label();
label.Text = "Details of this Driver cannot be found<br />Please double-check to see if the Driver Number, Date of Birth and PPSN are entered correctly<br />If you are sure you have the correct details entered tick this box to confirm";
e.Row.Cells[e.Row.Cells.Count - 2].Controls.Add(label);
e.Row.Cells[e.Row.Cells.Count - 2].BackColor = System.Drawing.Color.Yellow;
((TableRow)e.Row.Cells[e.Row.Cells.Count - 2].Parent).BackColor = System.Drawing.Color.Red;
chkConfirmDetails.Enabled = true;
chkConfirmDetails.Checked = false;
_numberOfInvalidCells++;
}
}
一切正常,复选框已启用且未被取消。
然后,用户可以选中此框以确认详细信息是否正确并重新验证该行。在datagrid的每一行上都有一个按钮,用户可以单击该按钮来执行此功能。因此,当用户单击验证行按钮时,将再次调用上面的代码。这次复选框已启用,可能会也可能不会勾选,具体取决于用户的操作。
然而,当我通过使用FindControl方法获得对该复选框的引用时,它仍显示为Not Enabled and Checked(即使它已在表单上启用且未选中)
有人可以解释为什么会发生这种情况以及获取复选框实际状态的方法吗?
修改
查看Request.Form.AllKeys数据,它包含gridview(textboxes和dropDownLists)中大多数其他模板项的键,但没有复选框或验证按钮
答案 0 :(得分:2)
RowDataBound
。
这意味着你之前已经打过它。但结果是覆盖了用户所做的所有更改。
所以问题是,为什么你需要打电话给GridView.DataBind()
进行重新验证?你不能在迭代所有GridViewRows的方法中做到这一点吗?
顺便问一下,您使用
的具体原因是什么? (CheckBox)e.Row.Cells[e.Row.Cells.Count - 2].FindControl("chkConfirmDetails")
而不是简单
(CheckBox)e.Row.FindControl("chkConfirmDetails")
?