gridview中复选框的自定义验证器仅标记一行无效

时间:2013-07-22 19:30:37

标签: c# asp.net validation checkbox

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

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

如何让验证程序错误所有无效行,或者如果找到无效行,如何将页面设置为无效?

更新 - 我发现只有在最后一行无效时才会出现此问题。如果最后一行无效,则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;
            }
        }
 }

1 个答案:

答案 0 :(得分: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;
    }
}