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