0

実行時にいっぱいになるパネルを含むasp.net Webページがあります

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

初めて正常に動作します

しかし、もう一度クリックすると、ページが読み込まれます。

4

3 に答える 3

0

私はあなたpage_loadが以下のようであるべきだと思います

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

}
于 2014-06-03T05:19:27.480 に答える
0

Microsoft は preint で動的コントロールを作成することを推奨しているため、このように preinit で同じコントロールを作成する必要があります。

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

protected override void OnPreInit(EventArgs e)
{


}
于 2014-06-03T07:58:16.243 に答える
0

ポストバックするときは、まったく同じコントロールを再作成する必要があります。ページが 1 つのコントロールだけで読み込まれる場合、存在しないコントロールのクリック イベントを発生させる方法を知ることができます。

編集:asp.netページのライフサイクルについて私が理解していることから、ポストバックデータが復元される前にコントロールを作成する必要があります。これがページコントロールイベントの発生方法です。そのため、ページ上で動的に作成された LinkBut​​tonA というコントロールがあり、それをクリックした場合、クリック イベントがポスト バック中にサーバーでトリガーされるようにするには、ポスト バック データが復元される前にコントロールを再作成する必要があります。 Page_Load の代わりに Page_Init で制御し、メソッド「buildStructure」への入力を同じに保つようにしてください。buildStructure("fifth_level") を使用してイベント ハンドラーから呼び出した場合、Page_Init が同じ buildStructure("fifth_level") を実行することを確認します。

于 2014-06-03T05:38:10.200 に答える