在编辑行时无法在 gridview 中绑定多个下拉列表

Unable to bind multiple dropdownlist in gridview on editing a row

我在 gridview 中有两列 Customer TypeFile Frequency。当网格处于正常模式时,我使用标签显示值。在编辑该行时,这两列变为下拉列表。我使用 OnRowDataBound="RowDataBound" 绑定下拉菜单。但是,只有 RowDataBound 方法中的第一个下拉列表(以方法中最先写入的那个为准)在编辑模式下绑定。

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

问题出在这一行,它抛出一个异常。这就是为什么只有最顶层的绑定才有效。

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

但您似乎希望 DropDownList 具有正确的 SelectedValue。这就是您可以做到的。

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
{
}
 <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>

在onRowEditing事件中

((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;