繁体   English   中英

无法访问同一 class 中的按钮数组

[英]Cannot access array of buttons within the same class

所以,我有一个带有 9 个按钮的 ASPX 文件(在井字游戏上工作,所以每个按钮都有相同的 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 循环等轻松访问和修改 class 内任何位置的按钮阵列?

编辑:我尝试初始化数组,如protected static Button[] buttons = findButtons(); 但是当我这样做时,我必须使accessbuttons()成为 static 方法,但它无法访问 ASPX 上的board元素,所以我无法弄清楚那个。

改变这个:

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 服务器和浏览器之间的完整往返,具有完全不同的页面实例 class。 您必须在页面生命周期的每次运行时重建该数组,如果您希望 ViewState 工作,您需要Page_Load()之前完成。

如果你改变这个怎么办:

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

对此:

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

因为这;

protected static Button[] buttons;

protected static

所以你只能这样访问它;

var buttons = Index.buttons;

但它将是 null 或空的,因为它没有在任何地方填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM