簡體   English   中英

gridview中復選框的自定義驗證器僅將一行標記為無效

[英]custom validator of checkbox in gridview only mark one row invalid

我有一個帶有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;
            }
        }
 }

我發現了問題。 每次在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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM