首页 > 解决方案 > 无法访问同一类中的按钮数组

问题描述

所以,我有一个带有 9 个按钮的 ASPX 文件(在 TicTacToe 游戏上工作,所以每个按钮都有相同的 OnClick 方法),在 C# 上,我找到所有这些按钮并将其存储在一个数组中,如下所示:

public partial class Index : System.Web.UI.Page {
    protected static Button[] buttons;

    protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {
            initialConditions();
        }
    }

    private void initialConditions() {
        buttons = findButtons();

        // Can access and modify buttons here
        foreach (var btn in buttons) {
            btn.Text = "this does work";
        }

        // Cant modify buttons here
        accessButtons();
    }

    private Button[] findButtons() {
        List<Button> tmpButtons = new List<Button>();
        foreach (var item in board.Controls) {
            if (item is Button) {
                tmpButtons.Add((Button)item);
            }
        }
        return tmpButtons.ToArray();
    }

    private void accessButtons() {
        foreach (var button in buttons) {
            button.Text = "this wont work";
        }
    }
}

我可以在方法中初始化数组后修改按钮,initialCondition()accessButtons()方法无法访问那些完全相同的按钮。我想这与参考和实例有关,但我无法理解这一点。如何使用 for 循环等轻松访问和修改类中任何位置的按钮数组?

编辑:我尝试像初始化数组一样protected static Button[] buttons = findButtons();,但是当我这样做时,我必须创建accessbuttons()一个静态方法,但是它无法访问boardASPX 上的元素,所以我无法弄清楚那个。

标签: c#asp.net

解决方案


改变这个:

protected static Button[] buttons;

对此:

protected List<Button> buttons;

和这个:

private Button[] findButtons() {
    List<Button> tmpButtons = new List<Button>();
    foreach (var item in board.Controls) {
        if (item is Button) {
            tmpButtons.Add((Button)item);
        }
    }
    return tmpButtons.ToArray();
}

对此:

private List<Button> findButtons() {
    return board.Controls.OfType<Button>().ToList();
}

最后是这个:

protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        initialConditions();
    }
}

对此:

protected void Page_PreInit(object sender, EventArgs e) {
    initialConditions();
}

请注意,这些更改中的每一项都会导致比以前更少的代码。

对于最后一个更改,请记住每个服务器事件(包括按钮单击)都是 Web 服务器和浏览器之间的完整往返,具有完全不同的页面类实例。您必须在页面生命周期中的每次运行时重建该数组,如果您希望 ViewState 工作,您需要 Page_Load().


推荐阅读