簡體   English   中英

從ASP.NET中的后台代碼動態創建按鈕

[英]Create buttons dynamically from code behind in ASP.NET

我對ASP.NET還是很陌生,需要您的幫助。

我正在對應該有助於解決常見問題的應用程序進行編程。 如果描述了他們的問題,用戶可以單擊顯示的案例。 該應用程序搜索更多案例或顯示可能的解決方案。

現在,我需要一些代碼來動態創建按鈕。 我用谷歌搜索了一些想法並創建了一些代碼,但是我無法使其工作。

它可以使用Default_Load方法創建按鈕的第一個選擇。 另外, OnClick事件( ButtonClick_System )可以正常工作,這意味着我可以進行下一個選擇。 從這里開始混亂。 ButtonClick_System創建的動態按鈕沒有有效的OnClick操作。

而不是繼續進行ButtonClick_Question (由於btn_system.Command += ButtonClick_Question;ButtonClick_System ),似乎只是加載了主頁( Page_Load可能有問題嗎?)。

應用程序應該執行ButtonClick_Question直到數據庫中沒有更多可用的數據集為止。

我得到以下代碼:

using System;
using System.Configuration;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Data;
using Oracle.DataAccess.Client;

namespace Application
{
    public partial class _default : System.Web.UI.Page
    {
        // Variables
        private string app_name = "Application";

        // ----- Page_Load ----- //
        protected void Page_Load(object sender, EventArgs e)
        {
                Default_Load();
                Session["Application"] = app_name;
        }

        // ----- Methods ----- //
        // Load homepage
        public void Default_Load()
        {
            pnl_default.Visible = true;
            pnl_content.Visible = false;
            HtmlGenericControl html_default = new HtmlGenericControl();
            html_default.TagName = "div";

            string cmdString = "(...)";
            DataTable dtSystems = OraQueryData(cmdString);
            foreach (DataRow dtRow in dtSystems.Rows)
            {
                int system_id = Convert.ToInt32(dtRow["SYSTEM_ID"]);
                string system_name = Convert.ToString(dtRow["SYSTEM_NAME"]);
                var btn_system = new Button
                {
                    ID = "btn_" + system_name,
                    Text = system_name,
                    CssClass = "sys_buttons"
                };
                btn_system.Command += ButtonClick_System;
                btn_system.CommandArgument = Convert.ToString(system_id);
                html_default.Controls.Add(btn_system);
            }
            plh_default.Controls.Clear();
            plh_default.Controls.Add(html_default);
        }

        // Button OnClick Events
        protected void ButtonClick_System(object sender, CommandEventArgs e)
        {
            pnl_default.Visible = false;
            pnl_content.Visible = true;
            HtmlGenericControl html_questions = new HtmlGenericControl();
            html_questions.TagName = "div";

            int system_id = Convert.ToInt32(e.CommandArgument);
            string cmdString = "(...)";
            DataTable dtQuestions = OraQueryData(cmdString);

            foreach (DataRow dtRow in dtQuestions.Rows)
            {
                string question_id = Convert.ToString(dtRow["FRAGE_ID"]);
                string question_text = Convert.ToString(dtRow["FRAGE_TEXT"]);
                var btn_system = new Button
                    {
                        ID = "btn_question" + question_id,
                        Text = question_text,
                        CssClass = "quest_buttons"
                    };
            btn_system.Command += ButtonClick_Question;
            btn_system.CommandArgument = Convert.ToString(system_id);
            html_questions.Controls.Add(btn_system);
            }
            plh_content.Controls.Clear();
            plh_content.Controls.Add(html_questions);
        }

        protected void ButtonClick_Question(object sender, CommandEventArgs e)
        {
            pnl_default.Visible = false;
            pnl_content.Visible = true;
            HtmlGenericControl html_ChildQuestions = new HtmlGenericControl();
            html_ChildQuestions.TagName = "div";

            int parent_id = Convert.ToInt32(e.CommandArgument);
            string cmdString = "(...)";
            DataTable dtChildQuestions = OraQueryData(cmdString);

            foreach (DataRow dtRow in dtChildQuestions.Rows)
            {
                string question_id = Convert.ToString(dtRow["FRAGE_ID"]);
                string question_text = Convert.ToString(dtRow["FRAGE_TEXT"]);
                var btn_system = new Button
                {
                    ID = "btn_question" + question_id,
                    Text = question_text,
                    CssClass = "quest_buttons"
                };
                btn_system.Command += ButtonClick_Question;
                btn_system.CommandArgument = question_id;
                html_ChildQuestions.Controls.Add(btn_system);
            }
            plh_content.Controls.Clear();
            plh_content.Controls.Add(html_ChildQuestions);
        }

        // ----- Oracle Data Query Methods ----- //
        // Create and execute query on database
        public static DataTable OraQueryData(string cmdString)
        {
            string conString = ConfigurationManager.AppSettings["Connection"];
            OracleConnection oraCon = new OracleConnection(conString);
            OracleCommand oraCmd = new OracleCommand(cmdString, oraCon);
            OracleDataAdapter oraDtAd = new OracleDataAdapter(oraCmd.CommandText, oraCon);
            DataTable dt = new DataTable();
            oraCon.Open();
            oraDtAd.Fill(dt);
            oraCon.Close();
            return dt;
        }
    }
}

如果我正確理解了這個問題,我認為您使用的控件錯誤,用法錯誤。

我建議您需要做的是將FAQ記錄的集合綁定到轉發器或某些其他數據集顯示控件。 然后,您可以在轉發器上有一個事件,該事件可以處理單擊了哪個記錄ID,用該值回發並刷新來自該值的數據集合(也許在另一個轉發器中)。 不要動態創建按鈕並將事件綁定到它們,否則您將陷入混亂。

希望這可以幫助。

暫無
暫無

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

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