0

我有一个带有 1 到 4 个项目复选框的 gridview 以及一个用于在每一行中选择“无”的复选框。

在提交时,如果“无”并且连续选择了任何其他项目,我会尝试将错误返回到一行。我正在使用一个自定义验证器,它适用于第一个无效行,但不会错误后续的无效行。当我更正第一个无效行并重新提交时,验证方法再次运行并找到无效行,但页面返回为有效。

如何让验证器对所有无效行进行错误处理,或者如何在找到无效行时将页面设置为无效?

更新 - 我发现这个问题只发生在最后一行无效时。如果最后一行无效,则 Page.IsValid 标志不设置为 false。我还发现验证,noneChecked,每行运行一次;所以如果有四行,它会验证每一行四次。

<asp:TemplateField HeaderText="Items">
                <ItemTemplate>
                    <span class="qdsdata">
                        <asp:PlaceHolder ID="PlaceHolder12" runat="server" Visible='<%# !DBNull.Value.Equals(Eval("records"))%>'>
                            <asp:CheckBox ForeColor="#FF5050" runat="server" ID="cbr" />
                            Records<br />
                        </asp:PlaceHolder>
                        <asp:PlaceHolder ID="PlaceHolder7" runat="server" Visible='<%# !DBNull.Value.Equals(Eval("xray"))%>'>
                            <asp:CheckBox ForeColor="#FF5050" runat="server" ID="cbx" />
                            X-Rays<br />
                        </asp:PlaceHolder>
                        <asp:PlaceHolder ID="PlaceHolder8" runat="server" Visible='<%# !DBNull.Value.Equals(Eval("path"))%>'>
                            <asp:CheckBox ForeColor="#FF5050" runat="server" ID="cbp" />
                            Pathology<br />
                        </asp:PlaceHolder>
                        <asp:PlaceHolder ID="PlaceHolder9" runat="server" Visible='<%# !DBNull.Value.Equals(Eval("echo"))%>'>
                            <asp:CheckBox ForeColor="#FF5050" runat="server" ID="cbe" />
                            Echocardiogram<br />
                        </asp:PlaceHolder>
                        <hr style="width: 60%;" />
                        <asp:CheckBox ForeColor="#FF5050" runat="server" ID="cbnone" ValidationGroup="valgroup1" />
                        None<br />
                        <asp:CustomValidator ID="vcbnone" runat="server" SetFocusOnError="true" OnServerValidate="noneChecked"
                            ValidationGroup="valgroup1" CssClass="r" ErrorMessage="Uncheck None"></asp:CustomValidator>
                    </span>
                </ItemTemplate>
            </asp:TemplateField>

背后的代码

public void noneChecked(object source, ServerValidateEventArgs args)
{
        foreach (GridViewRow gvrow in Location.Rows)
        {
            bool cbnone = ((CheckBox)gvrow.FindControl("cbnone")).Checked;
            bool cbr = ((CheckBox)gvrow.FindControl("cbr")).Checked;
            bool cbx = ((CheckBox)gvrow.FindControl("cbx")).Checked;
            bool cbp = ((CheckBox)gvrow.FindControl("cbp")).Checked;
            bool cbe = ((CheckBox)gvrow.FindControl("cbe")).Checked;
            if ((cbr || cbx || cbp || cbe) && cbnone)
            {
                ((CustomValidator)gvrow.FindControl("vcbnone")).IsValid = false;
            }
        }
 }
4

1 回答 1

1

我发现了这个问题。每次在 CustomValidator 中调用 OnServerValidation noneChecked 并为网格中的每一行调用它时,我都在遍历网格,因此如果网格中有 4 行,它将循环 16 次。我纠正了这一点,验证现在完美无缺。

新的正确代码后面:

    public void noneChecked(object source, ServerValidateEventArgs args)
{
    GridViewRow gvrow = (GridViewRow)(source as Control).Parent.Parent;

    bool cbnone = ((CheckBox)gvrow.FindControl("cbnone")).Checked;
    bool cbr = ((CheckBox)gvrow.FindControl("cbr")).Checked;
    bool cbx = ((CheckBox)gvrow.FindControl("cbx")).Checked;
    bool cbp = ((CheckBox)gvrow.FindControl("cbp")).Checked;
    bool cbe = ((CheckBox)gvrow.FindControl("cbe")).Checked;
    if ((cbr || cbx || cbp || cbe) && cbnone)
    {
        ((CustomValidator)gvrow.FindControl("vcbnone")).IsValid = false;
        args.IsValid = false;
    }
}
于 2013-07-24T21:38:34.960 回答