С# не может получить доступ к общедоступному члену формы из родительского класса

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

Программа основана на приложении ApplicationContext форм. В пределах static void Main() в Program.cs

CustomApplicationContext applicationContext = new CustomApplicationContext();
Application.Run(applicationContext);

В пределах public class CustomApplicationContext

public class CustomApplicationContext : ApplicationContext
{
    //create the application form
    Form appForm;

    public CustomApplicationContext() 
    {
        InitializeContext();

        //create instance of appForm
        appForm = new AppForm();

        //subscribe event handler to form closing event
        appForm.FormClosing += form_FormClosing; //this works fine

        //subscribe event handler to form control click event
        appForm.someToolStripMenuItem.Click += form_Click; //doesn't compile

        //can't even find appForm.someToolStripmenuItem in code completion!
    }

    void form_FormClosing(object sender, FormClosingEventArgs e)
    {
        ...
    }

    void form_Click(object sender, EventArgs e)
    {
        ...
    }

    ...
}

И изнутри public partial class AppForm в AppForm.Designer.cs, сгенерированном дизайнером, где я сделал модификатор управления public и создал класс public

public partial class AppForm  //note that I made this public
{
    ...

    this.someToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();

    ...

    // 
    // someToolStripMenuItem
    // 
    this.someToolStripMenuItem.Name = "someToolStripMenuItem";
    this.someToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
    this.someToolStripMenuItem.Text = "Some Item";

    ...

    public System.Windows.Forms.ToolStripMenuItem someToolStripMenuItem;
}

Что я делаю не так? Когда я набираю appForm., someToolStripMenuItem даже не появляется в поле завершения кода, как будто оно недоступно в контексте, однако appForm доступно, а someToolStripMenuItem равно public.


person khargoosh    schedule 22.06.2015    source источник
comment
Итак, класс является общедоступным, но является ли его член общедоступным? Имена в нижнем регистре обычно указывают на закрытые переменные.   -  person Wormbo    schedule 22.06.2015
comment
Спасибо за совет, я обновлю это в своем коде.   -  person khargoosh    schedule 22.06.2015


Ответы (2)


Компилятор считает, что appForm является Form, а не AppForm из-за того, как вы его объявляете:

Form appForm;

Либо попробуйте изменить объявление на AppForm appForm;, либо введите его так:

((AppForm)appForm).someToolStripMenuItem.Click += form_Click;
person Juan    schedule 22.06.2015
comment
И Хуан, и @jmcilhinney совершенно правы, Хуан пришел примерно на 30 секунд раньше. - person khargoosh; 22.06.2015
comment
@khargoosh, на самом деле, я был примерно на 20 секунд раньше Хуана, но важно то, что ты дал правильный ответ. - person jmcilhinney; 22.06.2015

Проблема в том, что ваше поле appForm объявлено как тип Form. В классе Form нет члена с именем someToolStripMenuItem. Вам нужно объявить свое поле как тип AppForm, чтобы получить доступ к членам этого типа.

person jmcilhinney    schedule 22.06.2015