Search code examples
c#asp.netgridviewrequiredfieldvalidator

Required Field Validator in Gridview depend on condition c#


I have a required field validator in a Gridview. I want fire the validater only if the ddlPartsStatus is "Ordered". I just can't get it to work.

At the moment required field validator fires for all the textboxes.

my code

<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" />

Any help is greatly appreciated. Thanks


Solution

  • For this you need a CustomValidator. Then the ClientValidationFunction should evaluate both the TextBox and the 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>