ASP.NET Page_Load没有触发

时间:2012-12-04 18:00:13

标签: c# asp.net events pageload page-init

我创建了一个2D数组Board,其中包含GameCell的对象。

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";
    }
}

控件是渲染的,并且在首次启动项目时可以单击,但在我单击其中一个之后,我的Holder(MyBoard)中没有添加任何控件。

为什么会这样?

修改

我找到了解决方案。将MyBoard作为参数传递给CreateControls。也许在page_load之后,引用不再可靠(我将它保存在对象中)。

1 个答案:

答案 0 :(得分:2)

每次调用Page_Load时,都会重新创建控件。它们存储在静态成员中,这意味着该网站的所有用户共享一个公共板。这真的是你想要的吗?将游戏存储在会话中会不会更好? (当然我不知道你的要求,但我总是试图避免在web应用程序中使用静态成员。)

在重新创建控件之前,可能的解决方案是检查它是否不是回发。

if (!IsPostback)
{

}