繁体   English   中英

编辑行时无法在gridview中绑定多个dropdownlist

[英]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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM