簡體   English   中英

asp.net c#事件處理程序第二次不起作用

[英]asp.net c# event handler not working second time

我有一個asp.net網頁,其中包含將在運行時填滿的面板

protected void Page_Load(object sender, EventArgs e)
{

    buildStructure(1);
}

這是方法

public void buildStructure(int level_id)
{

    pMain.Controls.Clear();
    //Response.Write(@"<script language='javascript'>alert('" + level_id + "');</script>");

    DataUtility DU = new DataUtility(@"****");
    DataTable dt = DU.GetDataTable("SELECT * FROM dbo.PRStructure_Main WHERE level_id = "+level_id);
    int curr_level = 1;
    int curr_child = 1;
    int totalchild = 0;
    if (dt.Rows.Count > 0)
    {
        Panel pLevel = new Panel();
        pLevel.CssClass = "level";

        Panel pItem = new Panel();
        pItem.CssClass = "item-ceo";

        Label lItem = new Label();
        lItem.Text = dt.Rows[0].ItemArray[2].ToString();

        pItem.Controls.Add(lItem);
        pLevel.Controls.Add(pItem);
        pMain.Controls.Add(pLevel);


        Panel pLevelLine = new Panel();
        pLevelLine.CssClass = "level";

        Panel pItemLine = new Panel();
        pItemLine.CssClass = "item-line-ceo";

        Panel pLine = new Panel();
        pLine.CssClass = "horizontal-line";

        pItemLine.Controls.Add(pLine);
        pLevelLine.Controls.Add(pItemLine);
        pMain.Controls.Add(pLevelLine);

        Panel pLevelLine2 = new Panel();
        pLevelLine2.CssClass = "level";

        Panel pLevel2 = new Panel();
        pLevel2.CssClass = "level";

        dt = DU.GetDataTable("SELECT * FROM dbo.PRStructure_Main WHERE level_parent = "+(Convert.ToInt32( dt.Rows[0].ItemArray[0].ToString())));
        lbItem2 = new LinkButton[dt.Rows.Count];
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            Panel pItemLine2 = new Panel();
            Panel pLine2 = new Panel();
            if (i == 0)
            {
                pItemLine2.CssClass = "item-line-level2-first";
                pLine2.CssClass = "horizontal-line2-first";
            }
            else if (i == dt.Rows.Count - 1)
            {
                pItemLine2.CssClass = "item-line-level2-last";
                pLine2.CssClass = "horizontal-line2-last";
            }
            else
            {
                pItemLine2.CssClass = "item-line-level2-middle";
                pLine2.CssClass = "horizontal-line2-middle";
            }
            pItemLine2.Controls.Add(pLine2);
            pLevelLine2.Controls.Add(pItemLine2);




            Panel pItem2 = new Panel();
            pItem2.CssClass = "item-level2";

            Panel pItemContent2 = new Panel();
            pItemContent2.CssClass = "item-level2-content";

            lbItem2[i] = new LinkButton();
            lbItem2[i].Text = dt.Rows[i].ItemArray[2].ToString();

            int current_level1 = (int)dt.Rows[i].ItemArray[0];
            //lbItem2.OnClientClick = "alert('" + current_level1 + "')";
            //lbItem2.Click += new EventHandler((s,e) => evHandler(s,e, current_level1));

            lbItem2[i].Click += new System.EventHandler(delegate(Object o, EventArgs a)
            {
                evHandler(o, a, current_level1);
            });
            pItemContent2.Controls.Add(lbItem2[i]);
            //pLevel.Controls.Add(lbItem);

            DataTable dt2 = DU.GetDataTable("SELECT * FROM dbo.PRStructure_Main WHERE level_parent = " + dt.Rows[i].ItemArray[0]);
            Panel pMenuLevel = new Panel();
            pMenuLevel.CssClass = "menu-level2";

            //<div class="menu-level2-items"><a href="#">Assets Integrity Management</a></div>


            for (int j = 0; j < dt2.Rows.Count; j++)
            {


                Panel pMenuLevelItems = new Panel();
                pMenuLevelItems.CssClass = "menu-level2-items";

                LinkButton lbMenuItem = new LinkButton();
                lbMenuItem.Text = dt2.Rows[j].ItemArray[2].ToString();
                int current_level2 = (int)dt2.Rows[j].ItemArray[0];

                //lbMenuItem.Click += new EventHandler(delegate (Object o, EventArgs ee) { evHandler(s, ee,current_level2)});

                lbMenuItem.Click += new EventHandler(delegate (Object o, EventArgs a) 
                    {
                        evHandler(o, a, current_level2);
                    });


                pMenuLevelItems.Controls.Add(lbMenuItem);
                DataTable dt3 = DU.GetDataTable("SELECT * FROM dbo.PRStructure_Main WHERE level_parent = " + dt2.Rows[j].ItemArray[0]);


                Panel pSubMenuLevel = new Panel();
                pSubMenuLevel.CssClass = "sub-menu-level2";

                //  <div class="sub-menu-level2-items"><a href="#"> Business Application Section </a></div>
                for (int k = 0; k < dt3.Rows.Count; k++)
                {
                    Panel pSubMenuLevelItems = new Panel();
                    pSubMenuLevelItems.CssClass = "menu-level2-items";

                    LinkButton lbSubMenuItem = new LinkButton();
                    lbSubMenuItem.Text = dt3.Rows[k].ItemArray[2].ToString();
                    int current_level3 = (int)dt3.Rows[k].ItemArray[0];

                    lbMenuItem.Click += new EventHandler((s, e) => evHandler(s, e, current_level3));
                    pSubMenuLevelItems.Controls.Add(lbSubMenuItem);

                    pSubMenuLevel.Controls.Add(pSubMenuLevelItems);
                }

                    pMenuLevelItems.Controls.Add(pSubMenuLevel);

                pMenuLevel.Controls.Add(pMenuLevelItems);

            }

            pItemContent2.Controls.Add(pMenuLevel);

            pItem2.Controls.Add(pItemContent2);
            pLevel2.Controls.Add(pItem2);

        }

        pMain.Controls.Add(pLevelLine2);
        pMain.Controls.Add(pLevel2);
    }

}

我在本節中有問題

                        lbMenuItem.Click += new EventHandler((s, e) => evHandler(s, e, current_level3));

這是處理程序方法

public void evHandler(Object s,EventArgs e, int someData){

    //Response.Write(@"<script language='javascript'>alert('" + someData + "');</script>");
    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(),"err_msg","alert('" + someData + "');",
     true);

    buildStructure(someData);
}

第一次正常工作

但是,當我再次單擊它時,它會使頁面加載。

我認為您的page_load應該如下所示

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack){
        buildStructure(1);
    }

}

回發時,您需要重新創建完全相同的控件。 如果頁面僅加載一個控件,它將如何引發不存在的控件的click事件。

編輯:根據我對asp.net頁面生命周期的了解,您必須先創建控件,然后再還原回發數據,這就是頁面控件事件觸發的方式。 因此,如果您有一個控件,例如LinkBut​​tonA,它是在頁面上動態創建的,然后單擊它,則要在發布回發期間在服務器上觸發click事件,必須在還原發布回發數據之前重新創建它,因此請嘗試重新創建動態Page_Init中的控件而不是Page_Load中的控件,並嘗試保持對方法“ buildStructure”的輸入相同。 假設您已使用buildStructure(“ fifth_level”)從事件處理程序中調用過它,請確保Page_Init執行相同的buildStructure(“ fifth_level”)。

Microsoft建議在preint上創建動態控件,因此您需要像這樣在preinit上創建相同的控件

http://msdn.microsoft.com/en-us/library/ms178472.aspx

protected override void OnPreInit(EventArgs e)
{


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM