2012-12-04 73 views
0

我創建了一個二維數組Board,它保存着GameCell的對象。ASP.NET Page_Load沒有觸發

的Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <link rel="stylesheet" href="includes/css/style.css" /> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <h1>ארבע בשורה</h1> 
     <div id="Board"> 
      <asp:Label ID="Label1" runat="server"></asp:Label> 
      <asp:PlaceHolder ID="MyBoard" runat="server" /> 
     </div> 
    </div> 
    </form> 
</body> 
</html> 

Default.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Game.CreateControls(); 
} 

protected void Page_Init(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
     Game.Set(MyBoard, Label1); 
     Game.Reset(); 
    } 
} 

GameCell.cs:

public class GameCell : ImageButton 
{ 
    public Position Position; // Justs holds the properties of Row and Col 
    public CellType Type; 

    public GameCell(Position Pos) 
    { 
     this.Position = new Position(Pos); 
     this.Type = CellType.Empty; 
    } 
} 

個Game.cs:

public class Game 
{ 
    public const int R = 6; 
    public const int C = 9; 

    public static GameCell[,] Board; 
    public static PlaceHolder Holder; 
    public static Label Log; 

    public static CellType CurrentType; 

    public static string[] Images = new string[] { "red", "empty", "blue" }; 

    public static void Set(PlaceHolder Holder, Label Log) 
    { 
     Game.Reset(); 
     Game.Holder = Holder; 
     Game.Log = Log; 
    } 

    public static void CreateControls() 
    { 
     for (int i = 0; i < Game.R; i++) 
     { 
      for (int j = 0; j < Game.C; j++) 
      { 
       Game.Board[i, j].ImageUrl = Game.ImageUrlByType(Game.Board[i, j].Type); 
       Game.Board[i, j].ID = i + "_" + j; 
       Game.Board[i, j].Click += new ImageClickEventHandler(Image_Click); 

       Game.Holder.Controls.Add(Game.Board[i, j]); 
      } 
     } 
    } 

    public static void Image_Click(object sender, EventArgs e) 
    { 
     int row = 0; 
     int col = int.Parse(((GameCell)sender).ID[2].ToString()); 

     if (Game.Board[row, col].Type == CellType.Empty) 
     { 
      while (row < Game.R - 1 && Game.Board[row, col].Type == CellType.Empty) 
      { 
       row++; 
      } 

      Game.SetImage(row, col); 
      Game.CurrentType = (CellType)(-(int)Game.CurrentType); 
      Log.Text = col + " " + row + " " + Game.CurrentType; 

      Game.Board[row, col].Enabled = false; 
     } 
    } 

    public static void SetImage(int r, int c) 
    { 
     Game.Board[r, c].Type = Game.CurrentType; 
     Game.Board[r, c].ImageUrl = Game.ImageUrlByType(Game.CurrentType); 
    } 

    public static void Reset() 
    { 
     Game.Board = new GameCell[R, C]; 
     Game.CurrentType = CellType.Blue; 

     for (int i = 0; i < Game.R; i++) 
     { 
      for (int j = 0; j < Game.C; j++) 
      { 
       Game.Board[i, j] = new GameCell(new Position(i, j)); 
      } 
     } 
    } 

    public static string ImageUrlByType(CellType t) 
    { 
     return "includes/images/" + Game.Images[(int)t + 1] + ".png"; 
    } 
} 

呈現控件,並點擊時,首先啓動的項目,但在我做單擊其中之一,沒有控件被添加到我的持有人(MyBoard)。

這是怎麼發生的?

編輯:

我找到了解決辦法。通過MyBoard作爲參數CreateControls做到了。也許這個引用不再可靠(我把它保存在一個對象中)在page_load之後。

回答

2

每次調用Page_Load時,都會重新創建控件。它們存儲在靜態成員中,這意味着該網站的所有用戶都共享一個通用板。這真的是你想要的嗎?在會議中存儲遊戲會不會更好? (當然,我不知道你的要求,但我總是試圖避免在Web應用程序中的靜態成員)。

可能的解決方案可能是在重新創建控件之前檢查它是否不是回發。

if (!IsPostback) 
{ 

} 
+0

我的第一次嘗試是一個遊戲(與非靜態成員)的實例,但它失敗了,所以我認爲靜態成員會幫助。 – Novak

+0

同意。 Web應用程序中的靜態成員(字段和屬性)是一個壞主意。數據將在不可預知的結果的線程之間共享。 (靜態方法很好。) – andleer

+1

實例成員在請求之後會丟失,靜態成員在所有用戶之間共享並可能被多個線程同時訪問。您可以將遊戲存儲在Session變量中,然後每個用戶都擁有它自己的遊戲,並且您沒有多線程問題。 – slfan

相關問題