2016-10-24 13 views
0

私はASP.NETにはかなり新しく、助けが必要です。ASP.NETのコードビハインドから動的にボタンを作成

私は頻繁な問題を解決するのに役立つはずのアプリケーションでプログラミングしています。ユーザーは、問題が記述されている場合は、表示されたケースをクリックできます。アプリケーションは、より多くのケースを検索するか、または可能な解決法を表示します。

私がこれに必要なのは、ボタンを動的に作成するコードです。私はいくつかのアイディアを見つけていくつかのコードを作ったが、それを動作させることはできなかった。

Default_Loadメソッドでボタンの最初の選択を作成します。また、OnClickイベント(ButtonClick_System)はうまくいきます。つまり、次の選択肢が表示されます。 ここから始まります。 ButtonClick_Systemで作成されたダイナミックボタンには、動作するOnClickアクションがありません。

の代わりに(なぜならButtonClick_Systembtn_system.Command += ButtonClick_Question;の)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; 
     } 
    } 
} 
+1

'Page'の' PreInit'イベントでボタンを作成しようとしましたか? – Esen

+0

実際、私の経験では 'PreInit'だけが動的コントロールを安全に追加できる唯一の場所です。そうでなければ、' ViewState'は追加されたコントロールについて知りません。 –

+0

私はまだそれを試していない。これを行う方法の例がありますか? – mabu

答えて

3

を。

FAQレコードのコレクションをrepeaterまたは他のデータセット表示コントロールにバインドすることをお勧めします。リピーターには、どのレコードIDがクリックされたかを処理し、その値でポストバックし、そのデータのコレクションをリフレッシュするイベント(別のリピーターにあるかもしれません)を持つことができます。動的にボタンを作成したり、イベントをバインドしたりしないでください。さもなければ、混乱してしまいます。

これが役に立ちます。

+0

このポストをありがとう、私はそれを試し、いくつかのフィードバックを与えるでしょう。 – mabu

+0

このフィードバックは残念です。私はまだコードの背後から動的にボタンを作成しています。それがうまくいかなかった理由は簡単でした。 ASP.Netページのライフサイクルの後、以前のボタンはすべて失われました。 'OnClick' EventHandlerへのリンクもあります。 EventHandlerが呼び出されるのと同時にボタンがロードされていることを確認する必要があります。とにかくありがとう! – mabu

関連する問題