2016-10-24 4 views
0

Я довольно новичок в 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; 
     } 
    } 
} 
+1

Вы пытались создать кнопки в событии 'PreInit'' '' '? – Esen

+0

Действительно, по моему опыту «PreInit» - это единственное место, где вы можете безопасно добавлять динамические элементы управления, иначе «ViewState» не знает о добавленных элемента управления. –

+0

Я еще не пробовал. У вас есть пример, как это сделать? – mabu

ответ

3

Если я понял вопрос правильно, я думаю, что вы используете неправильные элементы управления для неправильных использований.

Что я предлагаю вам сделать, это связать коллекцию записей часто задаваемых вопросов с repeater или другим элементом управления отображением набора данных. Затем вы можете иметь событие на репитере, которое может обрабатывать, какой идентификатор записи был нажат, отправить назад с этим значением и обновить сбор данных из этого (возможно, в другом повторителе). Не динамически создавать кнопки и связывать события с ними, иначе вы окажетесь в беспорядке.

Надеюсь, это поможет.

+0

Спасибо за этот пост, я попробую и даю некоторую обратную связь. – mabu

+0

Извините за эту позднюю обратную связь. Я все еще динамически создаю свои кнопки из кода. Причина, по которой она не работала, была простой. После жизненного цикла страницы ASP.Net все мои предыдущие кнопки были потеряны. Также их ссылка на «OnClick» EventHandler. Я должен убедиться, что мои кнопки загружаются одновременно с вызовом EventHandler. Спасибо, в любом случае! – mabu