0

1 から 4 項目のチェックボックスと、各行で「なし」を選択するチェックボックスを備えたグリッドビューがあります。

送信時に、「なし」と他のアイテムが行で選択されている場合、行にエラーを返そうとしています。最初の無効な行で機能するカスタムバリデーターを使用していますが、後続の無効な行はエラーになりません。最初の無効な行を修正して再送信すると、検証メソッドが再度実行され、無効な行が見つかりましたが、ページは有効として返されます。

バリデーターで無効な行をすべてエラーにする方法、または無効な行が見つかったときにページを無効に設定する方法を教えてください。

更新 - この問題は、最後の行が無効な場合にのみ発生することがわかりました。最後の行が無効な場合、Page.IsValid フラグは false に設定されません。また、検証、noneChecked が行ごとに 1 回実行されることもわかりました。したがって、4 つの行がある場合、各行を 4 回検証します。

<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

問題が見つかりました。OnServerValidation noneChecked が CustomValidator で呼び出され、グリッドの各行に対して呼び出されるたびに gridrows をループしていたので、グリッドに 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 に答える