C# 带有下拉列表的动态Formview失败

C# 带有下拉列表的动态Formview失败,c#,asp.net,C#,Asp.net,188分 400个职位 带有下拉列表的动态Formview失败得很厉害 6小时21分钟前|链接 我脑子里有一个想法,我试图实现它,但它不起作用。需要做的是:用户从列表中选择一个项目。根据选择动态构建formview。formview需要是动态的,因为查询将返回非空值中包含空值的数据集,例如: 4600,1,4,零,零,68 “4600”是型号,其他所有内容都是对应于组件的ID。空值表示此字段不属于4600 此后,formview的构建方式是将“4600”馈送到标签。对于每个非空值,我需要构建一个

188分

400个职位

带有下拉列表的动态Formview失败得很厉害

6小时21分钟前|链接

我脑子里有一个想法,我试图实现它,但它不起作用。需要做的是:用户从列表中选择一个项目。根据选择动态构建formview。formview需要是动态的,因为查询将返回非空值中包含空值的数据集,例如:

4600,1,4,零,零,68

“4600”是型号,其他所有内容都是对应于组件的ID。空值表示此字段不属于4600

此后,formview的构建方式是将“4600”馈送到标签。对于每个非空值,我需要构建一个下拉列表,每个下拉列表都有一个单独的datascource,不是ODS的东西,而是对BLL类的调用。然后将非空值分配给ddl的selected value属性

很简单,不是吗?下面是代码,它失败得很厉害。实际上只是在无限循环中超时。超时发生在ddlTonerBlack_数据绑定方法中。有人能告诉我我做错了什么吗?谢谢EJM

aspx标记:

<form id="form1" runat="server"> 
<div> 
    <asp:DropDownList runat="server" ID="ddlPrinterModels" AppendDataBoundItems="True" 
        DataTextField="Hardware_Model" DataValueField="Hardware_Model" 
        width="246px" CssClass="AssetMngnt-smallFont" AutoPostBack="true" > 
            <asp:ListItem Value="-1" Selected="True">-- Select Printer Model --</asp:ListItem> 
    </asp:DropDownList> 
    <hr /> 

    <asp:PlaceHolder id="DetailsViewPlaceHolder" runat="server"/> 

</div> 
<!-- NOT A COMPLETE QUERY --> 
<asp:sqldatasource id="ODSTonerBlackByModel" 
    selectcommand="SELECT [Hardware_Model], [Ident_Black], [Ident_Cyan], [Ident_Yellow] FROM [cPrinters_Toners] WHERE ([Hardware_Model] = @Hardware_Model)" 
    connectionstring="<%$ ConnectionStrings:CISF_Asset_Management %>" 
    runat="server"> 
    <SelectParameters> 
        <asp:ControlParameter ControlID="ddlPrinterModels" Name="Hardware_Model" 
            PropertyName="SelectedValue" Type="String" /> 
    </SelectParameters> 
</asp:SqlDataSource>  
</form>
和模板类:

public class FormViewTemplate : System.Web.UI.ITemplate 
{ 
    void System.Web.UI.ITemplate.InstantiateIn(System.Web.UI.Control container) 
    { 
        Label lblPrinterModel = new Label(); 
        lblPrinterModel.ID = "lblHardwareModel"; 
        lblPrinterModel.DataBinding += new EventHandler(PrinterModelLabel_DataBinding); 

        container.Controls.Add(lblPrinterModel); 

        DropDownList ddlTonerBlack = new DropDownList(); 
        ddlTonerBlack.ID = "ddlTonerBlack"; 
        ddlTonerBlack.DataBinding +=new EventHandler(ddlTonerBlack_DataBinding); 

        container.Controls.Add(ddlTonerBlack); 
    } 

    private void PrinterModelLabel_DataBinding(Object sender, EventArgs e) 
    { 
        Label lblPrinterModel = (Label)sender; 

        FormView formViewContainer = (FormView)lblPrinterModel.NamingContainer; 
        DataRowView rowView = (DataRowView)formViewContainer.DataItem; 

        lblPrinterModel.Text = rowView["Hardware_Model"].ToString(); 

    } 

    private void ddlTonerBlack_DataBinding(Object sender, EventArgs e) 
    { 
        DropDownList ddlTonerBlack = (DropDownList)sender; 
        FormView formViewContainer = (FormView)ddlTonerBlack.NamingContainer; 
        DataRowView rowView = (DataRowView)formViewContainer.DataItem; 

        dalConsumables_TonerBlack x = new dalConsumables_TonerBlack(); 
        ddlTonerBlack.DataSource = x.GetListTonersBlack(); 
        ddlTonerBlack.DataBind(); 

        ddlTonerBlack.SelectedValue = rowView["Ident_Black"].ToString(); 
    } 
}

得到一个无限循环是因为在ddlTonerBlack_数据绑定方法中,您在刚刚触发数据绑定事件的控件上调用了一个数据绑定方法


只需在同一控件的数据绑定事件处理程序中触发一个数据绑定事件,这就是为什么会得到一个无限循环。

之所以会得到一个无限循环,是因为在ddlTonerBlack\u数据绑定方法中,您在刚刚触发数据绑定事件的控件上调用了一个数据绑定方法

只需在同一控件的databind事件处理程序中触发databind事件,这就是为什么会得到一个无限循环

public class FormViewTemplate : System.Web.UI.ITemplate 
{ 
    void System.Web.UI.ITemplate.InstantiateIn(System.Web.UI.Control container) 
    { 
        Label lblPrinterModel = new Label(); 
        lblPrinterModel.ID = "lblHardwareModel"; 
        lblPrinterModel.DataBinding += new EventHandler(PrinterModelLabel_DataBinding); 

        container.Controls.Add(lblPrinterModel); 

        DropDownList ddlTonerBlack = new DropDownList(); 
        ddlTonerBlack.ID = "ddlTonerBlack"; 
        ddlTonerBlack.DataBinding +=new EventHandler(ddlTonerBlack_DataBinding); 

        container.Controls.Add(ddlTonerBlack); 
    } 

    private void PrinterModelLabel_DataBinding(Object sender, EventArgs e) 
    { 
        Label lblPrinterModel = (Label)sender; 

        FormView formViewContainer = (FormView)lblPrinterModel.NamingContainer; 
        DataRowView rowView = (DataRowView)formViewContainer.DataItem; 

        lblPrinterModel.Text = rowView["Hardware_Model"].ToString(); 

    } 

    private void ddlTonerBlack_DataBinding(Object sender, EventArgs e) 
    { 
        DropDownList ddlTonerBlack = (DropDownList)sender; 
        FormView formViewContainer = (FormView)ddlTonerBlack.NamingContainer; 
        DataRowView rowView = (DataRowView)formViewContainer.DataItem; 

        dalConsumables_TonerBlack x = new dalConsumables_TonerBlack(); 
        ddlTonerBlack.DataSource = x.GetListTonersBlack(); 
        ddlTonerBlack.DataBind(); 

        ddlTonerBlack.SelectedValue = rowView["Ident_Black"].ToString(); 
    } 
}