Невозможно получить доступ к массиву кнопок в одном классе - PullRequest
0 голосов
/ 27 апреля 2020

Итак, у меня есть ASPX-файл с 9 кнопками (работает над игрой 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() stati c метод, но затем он не может получить доступ к элементу board в ASPX, поэтому я не смог понять, какой из них.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Изменить это:

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();
}

Обратите внимание, что каждое из этих изменений приводит к меньшему коду , чем у вас было раньше.

Для этого последнего изменения помните, что каждое серверное событие (включая нажатие кнопок) представляет собой полный цикл между веб-сервером и браузером с совершенно другим экземпляром класса страницы. Вы должны перестраивать этот массив в каждый через жизненный цикл страницы, и если вы хотите, чтобы ViewState работал, вам нужно сделать это до Page_Load().

0 голосов
/ 27 апреля 2020

Что если вы измените это:

   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;

, но он будет нулевым или пустым, поскольку нигде не заполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...