我有一个带有 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;
}
}
}