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之後。
我的第一次嘗試是一個遊戲(與非靜態成員)的實例,但它失敗了,所以我認爲靜態成員會幫助。 – Novak
同意。 Web應用程序中的靜態成員(字段和屬性)是一個壞主意。數據將在不可預知的結果的線程之間共享。 (靜態方法很好。) – andleer
實例成員在請求之後會丟失,靜態成員在所有用戶之間共享並可能被多個線程同時訪問。您可以將遊戲存儲在Session變量中,然後每個用戶都擁有它自己的遊戲,並且您沒有多線程問題。 – slfan