Можно ли определить объект области видимости из метода? - PullRequest
0 голосов
/ 26 октября 2011

Это может показаться совершенно необоснованным, но я проектировал многопанельный симулятор реального устройства, который имеет много разных экранов, и мой текущий подход состоит в том, чтобы добавлять все экранные объекты только из кода и располагать их, когда я переключиться на другой экран.

У меня есть несколько фиксированных объектов, которые являются кнопками реального устройства, которые уже определены и на месте. Дело в том, что я разделяю каждую конструкцию панели методами, например: buildLogin(), buildMainScreen() и т. Д., И мне нужно отредактировать некоторые экранные объекты из этих методов, например, изменить цвет метки включенной функции на зеленый, если включен, или белый, если отключен.

Мой вопрос: возможно ли объявить объект из метода, который был бы доступен во всем классе, как если бы он был определен в разделе объявления переменных? Это было бы что-то вроде GLOBAL в PHP.

Я не могу объявить это поверх всего, как это было бы всегда, потому что, когда я располагаю объекты, я не могу «воссоздать» их из-за родительских функций или повторного использования удаленного объекта или чего-то еще. ..

[EDIT] Пример кода:

public partial class frmMain : Form
{
    //I could as well do this:
    //Button button1 = new Button();

    public frmMain()
    {
         buildLogin();
    }

    private void buildLogin()
    {
        Panel panel1 = new Panel();
        Controls.Add(panel1);

        //But then, there is no way to do this:
        // if (button1.IsDisposed == true) //because of the panel, or smthing
        Button button1 = new Button();
        panel1.Controls.Add(button1);

        button1.Click += (s, f) => { panel1.Dispose(); buildMainMenu(); };
    }

    private void buildMainMenu()
    {
        Panel panel2 = new Panel();
        Controls.Add(panel2);

        Button button2 = new Button();
        panel2.Controls.Add(button2);
    }

    //This was created from the Designer and is class-scoped
    private void btn_Frame_TSK1_Click(object sender, EventArgs e)
    {
        //Here, I have no access to the objets I've created programatically.
        //button1.Text = "Text changed!";
    }
}

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Определите ваш объект на уровне класса, как статический. Таким образом, он будет доступен из всех методов всех экземпляров класса (удаление экземпляра не повлияет на него).

0 голосов
/ 26 октября 2011

Если вы хотите убедиться, что все всегда полностью динамично и всегда выполняется в коде, вы можете посмотреть на поиск элементов управления, которые вы создали в коллекции Controls.

Например, убедитесь, что для button1 задано значение идентификатора (button1.ID = "textUpdatedButton"), которое будет уникально идентифицировать его из других созданных вами элементов управления. Затем используйте FindControl или выполните поиск в коллекции Controls, чтобы найти элемент управления с идентификатором, который вы хотите найти в обработчике событий.

//This was created from the Designer and is class-scoped
private void btn_Frame_TSK1_Click(object sender, EventArgs e)
{
    Control control = this.FindControl("textUpdatedButton");
    if(control != null && control is Button){
        Button button1 = (Button)control;
        button1.Text = "Text changed!";
    }
}

В качестве альтернативы, чтобы все выглядело как переменная, вы можете использовать свойство, чтобы скрыть контрольный результат (как упоминалось ранее):

private Button Button1 {
    get { return (Button)this.FindControl("textUpdatedButton"); }
}

//This was created from the Designer and is class-scoped
private void btn_Frame_TSK1_Click(object sender, EventArgs e)
{
    if(this.Button1 != null){
        this.Button1.Text = "Text changed!";
    }
}

Реальная реализация будет зависеть от того, как вы создаете свои элементы управления, но, по сути, этот подход может позволить вам динамически встраивать все в ваш код, если вам нужно сделать это таким образом. Просто не забудьте использовать идентификаторы, чтобы вы могли найти вещи позже.

...