Gridview中必需的字段验证器取决于条件c#

时间:2018-03-21 16:01:37

标签: c# asp.net gridview requiredfieldvalidator

我在Gridview中有一个必需的字段验证器。我只想在ddlPartsStatus是" Ordered"时才开火验证器。我无法让它发挥作用。

此时所需的字段验证程序将触发所有文本框。

我的代码

<asp:GridView ID="gvPartsToOrderDetail" CssClass="gvPartsToOrderDetail" runat="server" AutoGenerateColumns="false" OnRowDataBound="gvPartsToOrderDetail_RowDataBound">
    <Columns>
        <asp:TemplateField HeaderText="Ticket Number">
            <ItemTemplate>
                <asp:TextBox ID="txtTicketNo" Text='<%# Eval("TicketNo") %>' runat="server"></asp:TextBox>
                <asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server" ForeColor="Red" Font-Bold="true" Font-Size="Medium" ErrorMessage="*" ControlToValidate="txtTicketNo" ValidationGroup="Submit"></asp:RequiredFieldValidator>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Parts Status">
            <ItemTemplate>
                <asp:DropDownList ID="ddlPartStatus" runat="server" AutoPostBack="true">
                    <asp:ListItem Value="0" Text="-Select-"></asp:ListItem>
                    <asp:ListItem Value="1" Text="Ordered"></asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<asp:Button ID="btnSubmit" CssClass="btnSubmit" runat="server" Text="Submit" ValidationGroup="Submit" OnClick="btnSubmit_Click" />

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

为此你需要一个CustomValidator。然后ClientValidationFunction应该同时评估TextBox和DropDownList。

<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" 
    ValidationGroup="Submit" ControlToValidate="txtTicketNo" 
    ClientValidationFunction="checkValuesInRow" ValidateEmptyText="true"></asp:CustomValidator>

<script type="text/javascript">
    function checkValuesInRow(sender, element) {
        var isValid = false;
        var ddlValue = $("#" + sender.controltovalidate).closest('tr').find('select').val();
        if (element.Value === "" && ddlValue === "0") {
            isValid = true;
        }
        element.IsValid = isValid;
    }
</script>

答案 1 :(得分:1)

  

注意:如果必须进行所有点击,进一步阅读旨在提供信息并且不实用。但是它显示了可以完成的事情,不一定是应该如何完成的事情,而且仅仅是因为OP要求更多信息......所以,我们走了

鉴于此GridView q = 0; while [ q < 9 ]; q ++; do echo q; done

<ItemTemplate>

根据您的行数,使用 x 数量的验证器呈现表格。您可以使用浏览器的开发人员工具检查 <asp:TextBox ID="tbxTicketNo" runat="server" Text='<%# Bind("TicketNo") %>'></asp:TextBox> <asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server" ErrorMessage="RequiredFieldValidator" Text="*" ControlToValidate="tbxTicketNo" InitialValue="0" ValidationGroup="vgSubmit"> </asp:RequiredFieldValidator> ,在那里您会找到与此类似的内容,请注意所有行上的gvPartsToOrderDetail属性:

data-val-validationgroup

您是否看到 <span data-val-controltovalidate="ContentPlaceHolder1_gvPartsToOrderDetail_tbxTicketNo_0" data-val-errormessage="RequiredFieldValidator" data-val-validationgroup="vgSubmit" id="ContentPlaceHolder1_gvPartsToOrderDetail_rfvTxtTicketNo_0" data-val="true" data-val-evaluationfunction="RequiredFieldValidatorEvaluateIsValid" data-val-initialvalue="0" style="visibility:hidden;">*</span> 不是唯一的? 因此,当您点击data-val-validationgroup="vgSubmit"并将btnSubmit设置为“vgSubmit”时,它们都会被触发。

现在给出@ VDWWD的回答你可能更喜欢这样保留它。这非常合法且合法,可能更符合您的需求。

但是为了解决验证组的非唯一性,您可以在标记中执行此操作:

ValidationGroup

然后呈现:

    <asp:RequiredFieldValidator ID="rfvTxtTicketNo" runat="server" 
        ...
        ValidationGroup='<%# string.Format("Submit_{0}", Container.DataItemIndex) %>'>
    </asp:RequiredFieldValidator>

但现在你有设计问题了。要隔离gridview中的验证组并将其与提交按钮绑定,您需要选择一行,这意味着要引入一个Select命令按钮。更多点击,不是很好,但可以做到。但这引入了另外几个问题:

<span ... data-val-validationgroup="Submit_0" ... </span>
<span ... data-val-validationgroup="Submit_1" ... </span>
<span ... data-val-validationgroup="Submit_2" ... </span>

两者都可以这样修复:

1. How do you tell the Submit button which validation group to validate?
2. Also the Submit button has a nasty habit of Posting back regardless of validation.

<asp:Button ID="btnSubmit" runat="server" Text="Button" OnClientClick="return Page_ClientValidate('vgSubmit_1')" /> 编程方式生成,如下所示:

btnSubmit_PreRender

以下是代码隐藏和用于审核的页面标记:

  

总结一下,这个解决方案,如果你可以这样称呼:

     
      
  1. 唯一的验证组名称PER ROW
  2.   
  3. 需要添加选定的行
  4.   
  5. 呈现“提交”按钮以防止回发并隔离相应的验证组
  6.   

我只能希望这至少可以提供信息,并且可能会给你一些关于服务器控件的多功能性的想法。

快乐编程......

代码背后:

    protected void btnSubmit_PreRender( object sender, EventArgs e )
    {
        btnSubmit.OnClientClick = string.Format( "return Page_ClientValidate('vgSubmit_{0}')", gvPartsToOrderDetail.SelectedIndex );
    }

标记:

namespace WebApplication3
{
    public partial class _Default : Page
    {
        protected void Page_Load( object sender, EventArgs e )
        {
            if ( !Page.IsPostBack )
            {
                List<Parts> ListOfParts = new List<Parts>( new Parts[ ] {
                            new Parts(0, 0),
                            new Parts(0, 0),            
                            new Parts(0, 0) } );

                gvPartsToOrderDetail.DataSource = ListOfParts;
                gvPartsToOrderDetail.DataBind();
            }
        }

        protected void Button1_PreRender( object sender, EventArgs e )
        {
            Button1.OnClientClick = string.Format( "return Page_ClientValidate('vgSubmit_{0}')", gvPartsToOrderDetail.SelectedIndex );
        }
    }

    //------------------------------------------------------------
    // Dummy data class
    //
    public class Parts {
        public Parts( int ticketNo, int status ) {
            TicketNo = ticketNo;
            Status = status;
        }

        public int TicketNo { get; set; }
        public int Status { get; set; }
    }
}