代码隐藏未拾取回发时对Gridview上的复选框所做的更改

本文关键字:复选框 Gridview 隐藏 代码 | 更新日期: 2023-09-27 18:20:25

我有一个网格视图,它有一个模板字段,其中包含一个复选框作为字段之一

<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++;
    }
}

这一切都很好,复选框将被启用并取消选中。

然后,用户可以选择勾选该框以确认详细信息是否正确,并重新验证该行。在数据网格的每一行上都有一个按钮,用户可以单击该按钮来执行此功能。因此,当用户单击验证行按钮时,将再次调用上面的代码。这一次,复选框已启用,根据用户所做的操作,可以勾选也可以不勾选。

然而,当我使用FindControl方法获得对复选框的引用时,它仍然显示为未启用和已选中(即使它在表单上已启用和未选中)

有人能解释为什么会发生这种情况,以及获取复选框实际状态的方法吗?

编辑

查看Request.Form.AllKeys数据,它有网格视图中大多数其他模板项的键(文本框和下拉列表),但没有复选框或验证按钮

代码隐藏未拾取回发时对Gridview上的复选框所做的更改

只有当您将GridView数据绑定到它的DataSource时,才会调用

RowDataBound。这意味着你以前打过电话。但结果是,用户所做的所有更改都会被覆盖。

所以问题是,为什么需要调用GridView.DataBind()进行重新验证?难道你不能在一个迭代所有GridViewRows的方法中做到这一点吗?

顺便问一下,你使用的具体原因是什么

(CheckBox)e.Row.Cells[e.Row.Cells.Count - 2].FindControl("chkConfirmDetails")

而不是简单的

(CheckBox)e.Row.FindControl("chkConfirmDetails")