Unable to bind multiple dropdownlist in gridview on editing a row

1.6k views Asked by At

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());
    }
}
2

There are 2 answers

5
VDWWD On BEST ANSWER

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
{
}
0
DJKM On
 <asp:TemplateField HeaderText="Customer Type">
                                    <ItemTemplate>
                                        <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>'></asp:Label>
                                        <asp:Label ID="lblCustTypeID" runat="server" Visible="false" Text='<%# (Eval("Customer_TypeID")) %>'  />
                                    </ItemTemplate>
                                    <EditItemTemplate>                                     
                                        <asp:DropDownList ID="ddlgvCustomerType" runat="server" DataSource="<%# FetchCustomerType() %>" DataValueField="Customer_TypeID" DataTextField="Customer_Type"  >
                                        </asp:DropDownList>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="File Frequency">
                                    <ItemTemplate>
                                        <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>'></asp:Label>
                                        <asp:Label ID="lblFileFreqID" runat="server" Visible="false" Text='<%# (Eval("FileFrequency_ID")) %>'  />
                                    </ItemTemplate>
                                    <EditItemTemplate>                                       
                                        <asp:DropDownList ID="ddlgvFileFreq" runat="server" DataSource="<%# FetchFileFrequency() %>" DataValueField="FileFrequency_ID" DataTextField="FileFrequency" >
                                        </asp:DropDownList>
                                    </EditItemTemplate>
                                </asp:TemplateField>

In onRowEditing Event

((DropDownList)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("ddlgvCustomerType")).SelectedValue = ((Label)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("lblCustTypeID")).Text;
                            ((DropDownList)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("ddlgvFileFreq")).SelectedValue = ((Label)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("lblFileFreqID")).Text;