从ASP.NET中的代码动态创建按钮

本文关键字:动态 创建 按钮 代码 ASP NET | 更新日期: 2023-09-27 18:14:48

我对ASP很陌生。. NET和我需要你的帮助。

我正在编程一个应用程序,应该有助于解决经常出现的问题。如果显示的案例描述了他们的问题,用户可以点击。应用程序搜索更多案例或显示一个可能的解决方案。

现在我需要的是一些动态创建按钮的代码。我在谷歌上搜索了一些想法并创建了一些代码,但是我无法让它工作。

使用Default_Load方法创建第一个按钮选择。此外,OnClick事件(ButtonClick_System)工作良好,这意味着我得到下一个选择。从这里开始,它开始乱转。在ButtonClick_System中创建的动态按钮没有工作的OnClick动作。

而不是继续ButtonClick_Question(因为ButtonClick_System中的btn_system.Command += ButtonClick_Question;),它似乎只是加载主页(可能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;
        }
    }
}

从ASP.NET中的代码动态创建按钮

如果我正确理解了这个问题,我认为你使用了错误的控件。

我建议您需要做的是将FAQ记录的集合绑定到中继器或其他一些数据集显示控件。然后,您可以在中继器上拥有一个事件,该事件可以处理哪个记录ID已被单击,返回该值并刷新来自该值的数据集合(可能在另一个中继器中)。不要动态地创建按钮并将事件绑定到它们,否则你最终会陷入混乱。