Search code examples
c#asp.netgridviewdatagridviewrowdatabound

Unable to bind multiple dropdownlist in gridview on editing a row


I've two columns Customer Type and File Frequency in the gridview. When the grid is in normal mode I show the values using label. On editing the row, those two columns become dropdowns. I bind the dropdowns using OnRowDataBound="RowDataBound". But, Only first dropdown(whichever first written in the method) in the RowDataBound method getting bind on the edit mode.

.aspx

<asp:GridView ID="gvManageCustomers" DataKeyNames="Ship_To" runat="server" AutoGenerateColumns="False"
    OnRowEditing="EditCustomer" OnRowDataBound="RowDataBound" OnRowUpdating="UpdateCustomer"
    OnRowCancelingEdit="CancelEdit" CssClass="table table-bordered table-condensed">
    <Columns>
        <asp:TemplateField HeaderText="Customer Type">
            <ItemTemplate>
                <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>'></asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>' Visible="false">
                </asp:Label>
                <asp:DropDownList ID="ddlgvCustomerType" runat="server">
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="File Frequency">
            <ItemTemplate>
                <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>'></asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>' Visible="false"></asp:Label>
                <asp:DropDownList ID="ddlgvFileFreq" runat="server">
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowEditButton="True" />
    </Columns>
</asp:GridView>

.cs

public DataTable FetchCustomerType()
{
    string sql = "select distinct Customer_TypeID,Customer_Type from tbl_CustomerType";
    SqlDataAdapter da = new SqlDataAdapter(sql, constr);
    DataTable dt = new DataTable();
    da.Fill(dt);
    return dt;
}
public DataTable FetchFileFrequency()
{
    string sql = "SELECT distinct FileFrequency_ID,FileFrequency FROM [tbl_FileFrequency]";
    SqlDataAdapter da = new SqlDataAdapter(sql, constr);
    DataTable dt = new DataTable();
    da.Fill(dt);
    return dt;
}
protected void RowDataBound(object sender, GridViewRowEventArgs e)
{
    try
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                DropDownList ddlgvFileFreq = (DropDownList)e.Row.FindControl("ddlgvFileFreq"); //getting binded
                ddlgvFileFreq.DataSource = FetchFileFrequency();
                ddlgvFileFreq.DataTextField = "FileFrequency";
                ddlgvFileFreq.DataValueField = "FileFrequency_ID";
                ddlgvFileFreq.DataBind();
                ddlgvFileFreq.Items.FindByValue((e.Row.FindControl("lblFileFreq") as Label).Text).Selected = true;

                DropDownList ddlgvCustomerType = (DropDownList)e.Row.FindControl("ddlgvCustomerType");
                ddlgvCustomerType.DataSource = FetchCustomerType();
                ddlgvCustomerType.DataTextField = "Customer_Type";
                ddlgvCustomerType.DataValueField = "Customer_TypeID";
                ddlgvCustomerType.DataBind();
                ddlgvCustomerType.Items.FindByValue((e.Row.FindControl("lblCustType") as Label).Text).Selected = true;

            }
        }

    }
    catch (Exception ex)
    {
        //log error 
        errorlog.WriteErrorLog(ex.ToString());
    }
}

Solution

  • The problem is in this line, it trows an exeption. That's why only the topmost binding would work.

    ddlgvFileFreq.Items.FindByValue((e.Row.FindControl("lblFileFreq") as Label).Text).Selected = true;
    

    But it looks like you want the DropDownList to have the correct SelectedValue. This is how you can do that.

    DataRowView row = e.Row.DataItem as DataRowView;
    
    DropDownList ddlgvFileFreq = (DropDownList)e.Row.FindControl("ddlgvFileFreq");
    ddlgvFileFreq.DataSource = FetchFileFrequency();
    ddlgvFileFreq.DataTextField = "FileFrequency";
    ddlgvFileFreq.DataValueField = "FileFrequency_ID";
    ddlgvFileFreq.DataBind();
    try
    {
        ddlgvFileFreq.SelectedValue = row["FileFrequency_ID"].ToString();
    }
    catch
    {
    }
    
    DropDownList ddlgvCustomerType = (DropDownList)e.Row.FindControl("ddlgvCustomerType");
    ddlgvCustomerType.DataSource = FetchCustomerType();
    ddlgvCustomerType.DataTextField = "Customer_Type";
    ddlgvCustomerType.DataValueField = "Customer_TypeID";
    ddlgvCustomerType.DataBind();
    try
    {
        ddlgvCustomerType.SelectedValue = row["Customer_TypeID"].ToString();
    }
    catch
    {
    }