2

188ポイント

400 投稿

ドロップダウン リストを含む動的フォームビューはひどく失敗します。

6 時間 21 分前|LINK

実現しようとしているコンセプトが頭の中にありますが、うまくいきません。ユーザーがリストからアイテムを選択します。選択に基づいて、フォームビューが動的に構築されます。フォームビューは動的である必要があります。これは、クエリが次のような非 null 値の中に null 値を持つデータセットを返すためです。

4600、1、4、NULL、NULL、68 ....

「4600」はモデル番号で、それ以外はコンポーネントに対応する ID です。Null 値は、このフィールドが 4600 に属していないことを意味します。

これ以降、「4600」がラベルに供給されるようにフォームビューが構築されます。null 以外の値ごとに、ドロップダウン リストを作成する必要があります。それぞれに個別のデータソースがあり、ODS のものではなく、BLL クラスへの呼び出しがあります。次に、null 以外の値が ddl の選択された値プロパティに割り当てられます。

簡単ですよね?これがコードで、ひどく失敗しています。実際には無限ループでタイムアウトします。ddlTonerBlack_DataBinding メソッドでタイムアウトが発生します。誰かが私が間違っていることを教えてもらえますか? ありがとう。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 partial class Default2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!IsPostBack)  
        { 
            LoadData_PrinterModels();  
        } 

        FormView printerModelFormView = new FormView(); 

        dalConsumables_TonerBlack x = new dalConsumables_TonerBlack(); 

        printerModelFormView.ID = "fvPrinterModel"; 
        printerModelFormView.DataSourceID = "ODSTonerBlackByModel"; 

        printerModelFormView.PagerSettings.Mode = PagerButtons.NextPrevious; 
        printerModelFormView.HeaderText = "Printer Model"; 

        printerModelFormView.ItemTemplate = new FormViewTemplate(); 

        DetailsViewPlaceHolder.Controls.Add(printerModelFormView); 
    } 

    protected void LoadData_PrinterModels() 
    { 
        Printer_ModelsList x = new Printer_ModelsList(); 

        ddlPrinterModels.DataSource = x.GetPrinetr_Models(); 
        ddlPrinterModels.DataBind(); 
    } 

    protected void Page_Init(object sender, EventArgs e)  
    { 
        SqlDataSource sqlDS = new SqlDataSource(); 
        sqlDS.ConnectionString = ConfigurationManager.ConnectionStrings["CISF_Asset_Management"].ConnectionString; 
        sqlDS.SelectCommand = "SELECT dbo.cCartridge_Black.Ident_Black, dbo.cCartridge_Black.Model_Black, " + 
                               "dbo.cCartridge_Black.Desc_Black, dbo.cCartridge_Black.Qty_Black,  " + 
                               "dbo.cCartridge_Black.Black_Reorder_Limit, dbo.cCartridge_Black.Notes,  " + 
                               "dbo.cCartridge_Black.UpdatedBy, dbo.cPrinters_Toners.Hardware_Model " + 
                               "FROM   dbo.cCartridge_Black LEFT OUTER JOIN " + 
                               "dbo.cPrinters_Toners ON dbo.cCartridge_Black.Ident_Black  " + 
                               "= dbo.cPrinters_Toners.Ident_Black"; 
        form1.Controls.Add(sqlDS); 
        DropDownList ddl = new DropDownList(); 
        ddl.ID = "ddlTonerBlack"; 
        ddl.DataSource = sqlDS; 
        ddl.DataTextField = "Model_Black"; 
        ddl.DataValueField = "Ident_Black"; 
        form1.Controls.Add(ddl); 
    } 
}

そしてテンプレートクラス:

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

1 に答える 1

0

ddlTonerBlack_DataBinding メソッドで、データ バインド イベントを発生させたばかりのコントロールで DataBind メソッドを呼び出すため、無限ループが発生します。

同じコントロールのデータバインド イベント ハンドラでデータバインド イベントを発生させるだけで、無限ループが発生します。

于 2012-07-08T19:53:14.077 に答える