2012-02-24 5 views
1

私のチームのページを表す64個のボタンがNCAAブラケットタイプのものです。ページの読み込み中のボタンは、辞書にキーとして格納されます。チームは、チームに関する情報を格納するオブジェクトです。最初のページの読み込みでは、イベントハンドラが構築されますが、ボタンの1つをクリックしてサブミット後にページをリロードすると、ハンドラは表示されなくなります。私はそれをすべてのページの読み込み時に追加しようとしたとき、追加された後にハンドラをチェックしましたが、それ以上はまだありません。ASP.NET:DictionaryのButtonオブジェクトのEventHandlerの問題

これは辞書を介して元のオブジェクトにアクセスする際の問題ですか?

私はこのようにそれを使用しています:

foreach (KeyValuePair<Button, Team> tb in TeamButtons){ 
    tb.Key.Click += new EventHandler(Tournament_Click); 
} 

任意のアイデア?

ページのロード:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     List<Team> teamlist; 
     for (int i = 1; i < 5; i++) 
     { 
      using (Db db = new Db(ServerConnection.DEV)) 
      { 
       using (SqlDataReader dr = db.GetData("SELECT A.TeamId, A.Description 'TeamName', A.Seed, A.RegionId, B.Quadrant, B.Description 'RegionName' " + 
                "FROM Team A JOIN Region B on B.RegionId = A.RegionId WHERE B.Quadrant=" + i.ToString())) 
       { 
        teamlist = new List<Team>(); 
        while (dr.Read()) 
        { 
         teamlist.Add(new Team(
          dr["TeamId"].ToString(), 
          dr["TeamName"].ToString(), 
          Convert.ToInt16(dr["Seed"]), 
          dr["RegionId"].ToString(), 
          dr["RegionName"].ToString(), 
          Convert.ToInt16(dr["Quadrant"]) 
          )); 
        } 
        switch (i) 
        { 
         case 1: LoadButtons(Quad1, teamlist); break; 
         case 2: LoadButtons(Quad2, teamlist); break; 
         case 3: LoadButtons(Quad3, teamlist); break; 
         case 4: LoadButtons(Quad4, teamlist); break; 
        } 
       } 
      } 
     } 

     FFButtons = new Dictionary<Button, Team>(); 
     FTButtons = new Dictionary<Button, Team>(); 
     Winner = new Team(); 

     FFButtons.Add(btnQ1FFL, new Team()); 
     FFButtons.Add(btnQ2FFL, new Team()); 
     FFButtons.Add(btnQ3FFR, new Team()); 
     FFButtons.Add(btnQ4FFR, new Team()); 
     FTButtons.Add(btnLFT, new Team()); 
     FTButtons.Add(btnRFT, new Team()); 

     Session["TeamButtons"] = TeamButtons; 
     Session["FFButtons"] = FFButtons; 
     Session["FTButtons"] = FTButtons; 
     Session["Winner"] = Winner; 

     ResetWinners(64); 
    } 
    else 
    { 
     TeamButtons = (Dictionary<Button, Team>)Session["TeamButtons"]; 
     FFButtons = (Dictionary<Button, Team>)Session["FFButtons"]; 
     FTButtons = (Dictionary<Button, Team>)Session["FTButtons"]; 
     Winner = (Team)Session["Winner"]; 
    } 

    LoadTeams(); 

} 

読み込みボタン:

private void LoadButtons(System.Web.UI.HtmlControls.HtmlTable table, List<Team> teamlist) 
{ 
    int i = 0; 
    foreach (System.Web.UI.HtmlControls.HtmlTableRow c in table.Rows) 
    { 
     foreach (System.Web.UI.HtmlControls.HtmlTableCell d in c.Cells) 
     { 
      foreach (Control f in d.Controls) 
      { 
       if (f is Button) 
       { 
        TeamButtons.Add((Button)f, teamlist[i]); 
        i++; 
       } 
      } 
     } 
    } 
} 

LoadTeams:

private void LoadTeams() 
{ 
    foreach (KeyValuePair<Button, Team> tb in TeamButtons) 
    { 
     tb.Key.Text = TeamText(tb.Value); 
     switch (tb.Value.Quadrant) 
     { 
      case 1: 
       tb.Key.Click += new EventHandler(Tournament1_Click); 
       break; 
      case 2: 
       tb.Key.Click += new EventHandler(Tournament2_Click); 
       break; 
      case 3: 
       tb.Key.Click += new EventHandler(Tournament3_Click); 
       break; 
      case 4: 
       tb.Key.Click += new EventHandler(Tournament4_Click); 
       break; 
     } 
    } 
    foreach (KeyValuePair<Button, Team> tb in FFButtons) 
    { 
     tb.Key.Text = TeamText(tb.Value); 
     if (tb.Value.Quadrant <= 2) tb.Key.Click += new EventHandler(TournamentFourL_Click); 
     else tb.Key.Click += new EventHandler(TournamentFourR_Click); 
    } 
    foreach (KeyValuePair<Button, Team> tb in FTButtons) 
    { 
     tb.Key.Text = TeamText(tb.Value); 
     tb.Key.Click += new EventHandler(TournamentTwo_Click); 
    } 
} 
+0

なぜチームをグリッドにデータバインドしないのですか? – bleepzter

答えて

6

ハンドラはのOnInitメソッド内のすべてのページサイクルに追加する必要があります。それを試して、何が起こるかを見てください。それでも問題が解決しない場合は、より完全なページコードを投稿してみてください。また、それが動作しない場合は、ボタンの作成方法を指定することはできますか?彼らは単にaspxに存在するのですか、それとも動的に作成されていますか?それらが動的に作成されている場合は、作成時にそれぞれにIDを割り当ててください。

+0

OnLoadが起動する前に、コントロール自体が存在する必要があることも記述する必要があります。 – rossisdead

+0

コントロールはaspxにあります。興味深いことに、私は新しいASP.NET Webサイトでこれと同じような、しかしここでははるかに小さな規模のソリューションを試してみましたが、問題は存在しません。私は月曜日に戻ってきたときにOnInitメソッドを使ってみてみましょう。助けてくれてありがとう! – stringpoet

+0

@stringpoet:コントロールがすでにaspxにある場合は、aspx自体にイベントハンドラを割り当てて、oninitで設定する手間を省くことができます。 – swannee

2

ASP.NETのページは、要求が行われるたびに再作成されるため、動的に追加されたすべてのイベントハンドラは、新しい要求ごとに失われます。 Swanneeがすでに言ったように、ページが要求されるたびに、OnInitメソッド(OnLoad、Page_Loadも同様に)でそれらを追加する必要があります。 ASP.NETページのライフサイクルをよりよく理解したい場合は、this pageをチェックしてください。

関連する問題