[英]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.