none
Область видимости оконных форм дизайнера в программе RRS feed

  • Вопрос

  • Доброго времени, не могу разобраться с областью видимости:

    есть обычная форма MainForm : Form, в ней дизайнером создана форма

    public System.Windows.Forms.TextBox textBoxSource; (с выставленным свойством Modifiers в public)

    пытаюсь достучаться до этого textBoxSource из метода созданного класса, но не пойму как, экземпляра-то класса MainForm нет

    поменял в Main():

    Application.Run(new MainForm());

    на:

    MainForm program = new MainForm();

    Application.Run(program);

    так объект program вообще не виден из метода класса =(

    Идея в том, что метод класса должен уметь менять свойства формочек...

     

    Благодарю за помощь!

Ответы

  • Менять значения textBoxSource лучше через свойства. В MainForm создайте свойство наподобие:

    public string Source { get { return textBoxSource.Text; } set { textBoxSource.Text = value; } }

    В каком методе что не видется? Main - это статический метод со всеми вытекающими. Если хотите что-то поменять в MainForm из какого-либо метода, передайте эту форму в нужный метод через параметры.

     

     

    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:12
    Отвечающий
  • Нужно запустить только
    Application.Run(new MainForm());
    и не запускать  
    Application.Run(new program()); 

    Кроме того, нужно объявить
    public static MainForm program;
    среди остальных переменных класса MainForm,
    а инициировать 
    program = this;
    при запуске программы, например, кнопкой button1,
    в методе button1_Click 


    • Помечено в качестве ответа Kenaut 16 мая 2011 г. 10:40
  • Вы создали новую форму класса MainForm и ее запускаете. У Вас сейчас две формы, поэтому и не видно одну из другой.
    Когда в тексте меняете Form1 на MainForm, то нужно пользоваться автоматическим доисправлением
    аналогичных текстовых экземпляров во всех остальных текстах проекта,
    т.е. исправили - снизу появляется красная черточка, не исправляя ничего больше, нажмите на нее, там будет вопрос, исправлять с просмотром
    или все автоматом, выберите, что лучше и исправьте.
    Затем, чтобы видеть MainForm из любого класса нужно в MainForm сделать следующее -
    public static MainForn program = this;
    После этого из любого класса можно обращаться к свойствам и методам MainForm в виде
    MainForn.program.textBoxSource.Text ...
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:10

Все ответы

  • Менять значения textBoxSource лучше через свойства. В MainForm создайте свойство наподобие:

    public string Source { get { return textBoxSource.Text; } set { textBoxSource.Text = value; } }

    В каком методе что не видется? Main - это статический метод со всеми вытекающими. Если хотите что-то поменять в MainForm из какого-либо метода, передайте эту форму в нужный метод через параметры.

     

     

    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:12
    Отвечающий
  • Менять значения textBoxSource лучше через свойства. В MainForm создайте свойство наподобие:

    public string Source { get { return textBoxSource.Text; } set { textBoxSource.Text = value; } }

    В каком методе что не видется? Main - это статический метод со всеми вытекающими. Если хотите что-то поменять в MainForm из какого-либо метода, передайте эту форму в нужный метод через параметры.

     

     

    Спасибо за ответ, у меня не получится передать через параметры... Хотя бы из-за того, что не одну форму надо изменить...

    Попробую объяснить: есть три класса с одним интерфейсом (с одним общим методом)

    В TreeView при выборе узла, его тэг приводится к интерфейсу и после вызывается этот самый общий метод, который, в зависимости от его реализации в каждом из трёх классов, меняет формочки основной формы. Как-то так =)

    Т.е. нужно в трёх классах написать три метода, которые обращаются, например, к textBoxSource.ReadOnly и другим формам и их свойствам.

    ммм... может ссылку на код лучше дать? =)  вот

  • >> Хотя бы из-за того, что не одну форму надо изменить...

    Не вижу в этом проблемы. По коду сложно что-то сказать. Опишите интерфейс, в котором будут определены свойства, которые должны эти классы менять. Унаследуйте форму от этого интерфейса, заимплеменьте и передавайте в методы. Что касается кода - попробуйте разделить представление и логику. Пока что у вас все в одной куче.

    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:11
    • Снята пометка об ответе Kenaut 10 мая 2011 г. 5:11
    Отвечающий
  • Вы создали новую форму класса MainForm и ее запускаете. У Вас сейчас две формы, поэтому и не видно одну из другой.
    Когда в тексте меняете Form1 на MainForm, то нужно пользоваться автоматическим доисправлением
    аналогичных текстовых экземпляров во всех остальных текстах проекта,
    т.е. исправили - снизу появляется красная черточка, не исправляя ничего больше, нажмите на нее, там будет вопрос, исправлять с просмотром
    или все автоматом, выберите, что лучше и исправьте.
    Затем, чтобы видеть MainForm из любого класса нужно в MainForm сделать следующее -
    public static MainForn program = this;
    После этого из любого класса можно обращаться к свойствам и методам MainForm в виде
    MainForn.program.textBoxSource.Text ...
    • Помечено в качестве ответа Kenaut 10 мая 2011 г. 5:10
  • QazRdx, спасибо, но ругается, что this невозможен в текущем контексте

    Решил проблему передачей текущего объекта в нужную функцию, собстно как Anton.Maksimov посоветовал, только сейчас понял что им имелось в виду =)

  • Нужно запустить только
    Application.Run(new MainForm());
    и не запускать  
    Application.Run(new program()); 

    Кроме того, нужно объявить
    public static MainForm program;
    среди остальных переменных класса MainForm,
    а инициировать 
    program = this;
    при запуске программы, например, кнопкой button1,
    в методе button1_Click 


    • Помечено в качестве ответа Kenaut 16 мая 2011 г. 10:40