Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к объекту другой формы, очень часто задаваемый вопрос 
V
    Опции темы
thomas
Дата 23.1.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Привет всем.
Перечитал всю тему и ответа на нужный вопрос не нашел. 

Имеем MDIконтейнер(главная) и ряд дочерних форм. 
Дочерние формы вызываются нажатием на кнопки или пункты меню в главной форме.
Для того что бы избежать повторного открытия уже открытого дочернего окна выставляю 
свойство кнопок или меню  Enable = false. Открылось дочернее окно и кнопочка болше не доступна.
Все вроде розово и пушисто. Да у нужных кнопок и пунктов меню свойство modofiers выставлено в public.

Но проблема в том что в событии FormClosed для дочерней формы я не могу обратиться к контролам главной формы, 
а только к свойствам и методам самой формы.

И как решить данную задачу?

ЗЫ там на первых страницах предлагаеться передавать ссылку на главную форму в конструктор дочерней, но и в этом случае до контролов главной формы не добраться.




Это сообщение отредактировал(а) thomas - 23.1.2009, 18:26


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Drabuna
Дата 23.1.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дивелоперчег
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 27.3.2008
Где: Киев

Репутация: 2
Всего: 3



МСДН помог.

В parent форме:
Код

private void button1_Click(object sender, System.EventArgs e)
        {
            objForm2 = new Form2(this);
            objForm2.MdiParent = this;
            objForm2.Show();
        }
public void button2_Click(object sender, EventArgs e)
        {
            
            textBox1.AppendText("OMFG");
        }



В child форме:

Код

private Form1 mdiForm;

public Form2(Form1 pMdiForm)
        {
            InitializeComponent();
            mdiForm = pMdiForm;
        }

private void button1_Click(object sender, System.EventArgs e)
        {
            mdiForm.button2_Click(sender, e);
        }


PM MAIL   Вверх
thomas
Дата 23.1.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Привет всем еще раз.

Решение вопроса (не создавать много эекземпляров дочернего окна в MDI) подсмотрел на CODEPROJECT


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
BestRoot
Дата 17.3.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Привет всем 
Есть задача обратится из одного приложения в другое как это сделать ?

PS мне говорили что надо через Дискрипторы но я понятия не имею как ими пользоватся
PM MAIL WWW ICQ   Вверх
Partizan
Дата 17.3.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



BestRoot, приложения левые или свои собственные?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BestRoot
Дата 17.3.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Цитата(Partizan @ 17.3.2009,  18:25)
BestRoot, приложения левые или свои собственные?

свои собственные
PM MAIL WWW ICQ   Вверх
Incvizitor
Дата 20.3.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 11.3.2009

Репутация: нет
Всего: нет



Приветствую всех!

Подскажите, как реализовать работу с основной формой из класса. Я работаю обычно так:

Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class1 c = new Class1();
            c._show(this);
        }
    }


И сам класс:

Код

    class Class1
    {
        public void _show(Form1 f)
        {
            f.progressBar1.Style = ProgressBarStyle.Marquee;
        }
    }


Так все работает как нужно, но столкнулся с проблемой, когда пришлось в классе описывать такое:

Код

    class Class1
    {
        private BackgroundWorker bw = new BackgroundWorker();

        public void _show()
        {
            bw.RunWorkerAsync();
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            // Нужно запустить progressBar1
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // Тут нужно завершить работу progressBar1
        }
    }


Все что написано прочитал, но, увы, ничего не подошло, либо не понятно как использовать. Если кто может, напишите подробный пример. Заранее спасибо!

 smile 

Это сообщение отредактировал(а) Incvizitor - 24.3.2009, 02:01
PM MAIL   Вверх
KelTron
Дата 2.4.2009, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



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

А вообще по BackgroundWorker смотри тут



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
dekroll
Дата 23.5.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Привет всем!

Совсем недавно начал писать на Visual C++ и возникла такая же проблема. Не могу обратиться из дочерней формы на родительскую. При попытке добавить на Form2 строку 
Код

#include "Form1.h"

компилятор на Form1 начинает ругаться на вызов второй формы 
Код

Form2 ^ asd = gcnew Form2();
-------------------------------------------------------------
1>d:\asdasasg\asdasasg\Form1.h(86) : error C2065: 'Form2' : undeclared identifier
1>d:\asdasasg\asdasasg\Form1.h(86) : error C2065: 'asd' : undeclared identifier
1>d:\asdasasg\asdasasg\Form1.h(86) : error C2061: syntax error : identifier 'Form2'


Подскажите, пожалуйста, в чем проблема и, если можно, приведите исходник.
Заранее благодарен.
PM MAIL   Вверх
TiMeTraSheR
Дата 7.6.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.6.2009

Репутация: нет
Всего: нет



Прочитав весь топик, вычерпал некоторые полезные советы, но проблему так и не решил =(
Визуально программа выглядит так: user posted image
В Program.cs создается экземпляр DataCenter, потом вызывается. 
В DataCenter.cs создается и вызывается экземпляр MainForm, а так же создаются экземпляры TelnetClient, Configuration и ServerManager в кол-ве одной штуки.
По задумке, все вычисления должны проводиться в DataCenter, а из MainForm должны вызываться методы из созданых в DataCenter экземпляров, ну и в самой MainForm должны выводиться некоторые переменные, хранящиеся в этих экземплярах.

Обращаться из MainForm в сам DataCenter и имеющиеся в нем экземпляры получается, используя следующий код
Код

...
    public partial class MainForm : Form
    {        
        private DataCenter dc = null;

        public MainForm(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }
...

Код

...
    public class DataCenter
    {

        public MainForm mf;
        public DataCenter()
        {        
            mf = new MainForm(this);
            mf.Show();
        }
...

А вот как это использовать с классами я не знаю, ибо во-первых писать в каждом методе "(DataCenter p)" не удобно, а во-вторых компилятор орет на "(this)", типо его нельзя исппользовать в этом контексте.

Обращаться из TelnetClient, Config и т.д. к MainForm не получается =(
Да и друг к другу собственно тоже.
Вот примеры:
Код

...
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            DataCenter dc = new DataCenter();
            Application.Run(dc.mf);
        }
...

Код

...
namespace Admin_Tools
{
    /// <summary>
    /// Description of DataCenter.
    /// </summary>
    public class DataCenter
    {

        public MainForm mf;
        public Network.ServerManager sm = new Network.ServerManager();
        public Configuration.Config conf = new Configuration.Config();
        public Network.TelnetClient tc = new Network.TelnetClient();
        
        public DataCenter()
        {        
            mf = new MainForm(this);
            mf.Show();
        }
...

Код

...
namespace Admin_Tools
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {        
        private DataCenter dc = null;

        public MainForm(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }
        
        void MainFormLoad(object sender, EventArgs e)
        {
            dc.conf.StartConfiguration();
        }

    void Ls_restartClick(object sender, EventArgs e)
    {
        if(dc.sm.ServerManage("Login", "Restart", "", ""))
            this.ls_unblock_text.Text = "Restarting...";
    }
...
Тут все нормально.


Код

...
namespace Admin_Tools.Network
{
    /// <summary>
    /// Description of ServerManage.
    /// </summary>
    public class ServerManager
    {
        private DataCenter dc = null;
        private bool error = false;
                    
        public void LoginServer(string action, string ip)
        {
            dc.tc.Set(dc.conf.ls_host, dc.conf.ls_port, 10);
            if (dc.tc.Connect())
            {
                   //некоторый код
            }
            else 
            {
                MessageBox.Show("Произошла ошибка при подключении.");
                error = true;
            }
        }
...

При таком раскладе программа компилится нормально, но когда вызываешь из метод из MainForm, то происходит вылет с ошибкой "...В экземпляре объекта не задана ссылка на объект..."
Дебагер указывает строчку "dc.tc.Set(dc.conf.ls_host, dc.conf.ls_port, 10);", которая в ServerManager.

Предварительно спасибо на ответы ^^

ПС: прочитал свой пост, какой-то он не очень читаемый, т.к. много я его редактировал и вышла полная белеберда, но думаю общий смысл ясен.

UPDATED:
 хм, кажется я понял свою ошибку. Я пытался обратиться не к экземпляру DataCenter, а к классу(чертежу).
А как тогда обратиться к экземпляру, если он cоздан в Program?


UPDATED:
 Проблема решена. 

Это сообщение отредактировал(а) TiMeTraSheR - 7.6.2009, 18:10
PM MAIL   Вверх
Miktor
Дата 1.8.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 1.8.2009

Репутация: нет
Всего: нет



Здравствуйте,у меня проблема.
Есть главная форма Form1.
В ней есть кнопка:
Код

 private void button_Click(object sender, EventArgs e)
        {            
            Conf conf=new Conf(str);
            conf.Show();
        }

Открывается новая форма с 4 полями для ввода(в них уже стоят значения переданные в массиве) и 1 кнопкой,при нажатие на которую
Код

private void button_Click(object sender, EventArgs e)
        {
            Form1.str[0] = textBox1.Text;
        }

должны передаваться в основную форму некие данные введенные в текстбоксы
но VS говорит :
Цитата

Conf.cs(32,19): error CS0122: 'TreeCreator.Form1.str' is inaccessible due to its protection level

Подскажите что я делаю нетак.
PM MAIL   Вверх
Enteropoly
Дата 1.8.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Изучай модификаторы доступа  smile 

http://msdn.microsoft.com/ru-ru/library/ms173121.aspx
PM MAIL   Вверх
IAmHell
Дата 19.10.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.10.2009

Репутация: нет
Всего: нет



Здравствуйте.
Имеется 2 формы : Form1 -  родительская, Form2 - дочерняя
Требуется чтобы объект класса Form2 был виден всем ункциям класса Form1 и была возможность передать в конструктор Form2 указатель на объект класса Form1, т.е. на родительскую форму
Сейчас это выглядит так:
Код

public partial class Form1 : Form
    {
        public Form2 F = new Form2(this);
        public Form1()
        {
            InitializeComponent();
        }

        public void Func1()
        {
            F.ComboBox1.SelectedIndex = 3;
            .....
        }

        public void Func2()
        {
            F.TextBox1.Text = "bla bla bla";
            ........
        }
    }

Так форма F видна из всех функциий класса Form1 (если убрать из списка параметров this), но компилятор ругается на this в качестве параметра при создании объекта класса Form2:
error CS0027: Keyword 'this' is not available in the current context
В конструкторе Form2 всё прописано как положено и он тут не при чём
Где (или как?) нужно объявить экземпляр класса Form2 чтобы он был виден из всех функций класса Form1 и можно было передать ему указатель на родительскую форму?

Это сообщение отредактировал(а) IAmHell - 19.10.2009, 22:31
PM MAIL   Вверх
Partizan
Дата 21.10.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



IAmHell, перенесите создание объекта в конструктор.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
IAmHell
Дата 22.10.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.10.2009

Репутация: нет
Всего: нет



Partizan, вы имеете в виду так?
Код

        public Form1()
        {
            InitializeComponent();
            public Form2 F = new Form2(this);
        }

Пробовал и так. Тогда форма F не доступна для функций Func1() и Func2()
PM MAIL   Вверх
Google
  Дата 12.12.2019, 11:27 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.