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

Поиск:

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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(IAmHell @  22.10.2009,  09:13 Найти цитируемый пост)
Partizan, вы имеете в виду так?

Думаю нет.

Код

        public Form2 F = null; 
        public Form1()
        {           
            InitializeComponent();
            F = new Form2();
        }
        public void Func1()
        {
            F.ComboBox1.SelectedIndex = 3;
            .....
        }
        public void Func2()
        {
            F.TextBox1.Text = "bla bla bla";
            ........
        }


Другое дело не понятно зачем нужна ссылка на родительский класс в конструкторе дочернего (при условии что конструктор дочерней формы перегружен). Чем вызван такой изврат?
PM MAIL   Вверх
IAmHell
Дата 22.10.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё затевалось для того чтобы из Form2 можно было обращаться к контролам и функциям, расположенным на Form1 и наоборот. Прочитав топик, я сделал вывод что такой вариант наиболее корректный с точки зрения ООП. Если есть другие варианты добиться такой функциональности, с удовольствием ознакомлюсь 
PM MAIL   Вверх
mrbrooks
Дата 22.10.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(IAmHell @  22.10.2009,  16:16 Найти цитируемый пост)
Прочитав топик, я сделал вывод что такой вариант наиболее корректный с точки зрения ООП. 

это да. правда из недостатков такого подхода стоит отметить не возможность использования конструктора по умолчанию. если это не критично - то все гуд. Инкапсуляция, как говорится наше все. 
Я к примеру использую собственные события в дочерних формах, которые обрабатываю в главной. 
PM MAIL   Вверх
LifeOfWorld
Дата 13.11.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос по WPF. Перенаправили сюда =) 

Допустим есть 2 xaml файла (file1.xaml, file2.xaml)

В file1.xaml объявляется элемент ComboBox: 
<ComboBox x:Name="cb"
                    Grid.Column="1"
                    VerticalAlignment="Center"
                    Width="50"
                    Height="25"
                    FontSize="15"/>

В file2.xaml.cs должен использоватся код вроде этого:
...
cb.Items.Add(i + 1); // Filling ComboBox
...

Но file2.xaml не знает что такое "cb"
Вопрос: Как правильно обратиться к cb в file2.xaml.cs? 

Решения вроде обратиться из любого места file2.xaml.cs не подходят.

Form frmMain = Application.OpenForms["frmMain"];
Button btn1 = (Button)frmMain.Controls["button1"];

[http://forum.codenet.ru/showthread.php?t=37091]




PM MAIL   Вверх
Partizan
Дата 14.11.2009, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



LifeOfWorld, что-то мне подсказывает, что для решения Вашей задачи, Вы избрали неверный подход...

что Вы хотите получить от такого взаимодействия?


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


Новичок



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

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



Товарищи! Помогите, пожалуйста, по указанной теме!

Есть две формы: основная и дочерняя.
Основная - это та, что создаётся по умолчанию:
Код

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
                {
                 ...............
                } 

         void ReDrawWin(void);
         .................

- на форме есть вьюпорт. При вызове метода ReDrawWin - вьюпорт перересовывается.
Так же на форме есть кнопка. При нажатии на ней открывается вторая форма:
Код

private: System::Void button_BR_UpDownAngle_Click(System::Object^  sender, System::EventArgs^  e) {
             //
             
                 UpDownAngleDialog = gcnew IVOGraph(CurrentGraph,1.0f,-1.0f);
                 UpDownAngleDialog->Visible = true;
             
         }

-На второй форме расположены некие объекты управления(ввод данных)
Мне необходимо, чтобы действии на второй форме - при работе с объектами управления, обновлялся вьюпорт основной формы. То есть, по сути, нужно вызвать метод ReDrawWin.
Как это сделать?
Я пытаюсь, как это описывали выше, передать ссылку главной формы, во вторую форму, через конструктор второй формы:
Код

    public ref class IVOGraph : public System::Windows::Forms::Form
    {
    public:
            //
        IVOGraph(Form1^ MainForm, IVOParamGraph^ InGraphParam,float yMaxLimit,float yMinLimit)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
                   ............................................
                }
        }
 
- однако компилятор видит ошибку в записи: Form1^ MainForm - и пишет error C2061: синтаксическая ошибка: идентификатор "Form1".
Не могу понять, в чём дело. Ведь Form1 - это имя класса, а не переменная, т.е. вроде должно быть всё нормально.....
Подскажите плиз - как правильно сделать!!

PM MAIL   Вверх
maxfox
Дата 7.4.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде бы я нашёл решение. воспользовавшись классом Delegate 
- при помощи него я создал ссылку на нужный метод в основной форме, и передал эту ссылку во вторую форму.
Теперь я могу использовать эту ссылку, где угодно во второй форме.
PM MAIL   Вверх
GX777
Дата 15.4.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



прочитал данную тему... Итак у меня есть 2 формы: MainForm и Form1.

у MainForm есть баттон1 и текстбокс 1. У Form1 есть только кнопка.

мне нужно из формы Form1 изменить текстбокс1 у MainForm при нажатии на кнопку. Пишу  на Form1:
Код

public partial class Form1 : Form
    {

        private MainForm mf;
        
        public Form1(MainForm link)
        {
        this.mf = link;
        InitializeComponent();
        }


обработчик события на кнопку в главной форме (MainForm):
Код

Form1 Dlg = new Form1(this);
            Dlg.ShowDialog();



но после всех манипуляций я могу изменять только текст шапки у MainForm. textbox1.text я по прежнему не могу менять. Что я делаю не так?
PM MAIL   Вверх
A5uKa
Дата 16.4.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Цитата(GX777 @ 15.4.2010,  18:35)
Код

манипуляций 

А что вы вообще пытались сделать ?

там в начале топика есть примеры , а тут была особая задумка я полагаю ?..
PM   Вверх
GX777
Дата 16.4.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



мне вообще всего лишь нужно из form1 изменить текст в текстбоксе на Mainform. Здесь гдето читал что так(написано выше) можно это сделать но у меня не работает.Никак не могу толком понять как правильно обращаться к обьекту другой формы   smile 
PM MAIL   Вверх
A5uKa
Дата 16.4.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Цитата(GX777 @ 16.4.2010,  20:22)
мне вообще всего лишь нужно из form1 изменить текст в текстбоксе на Mainform.

По нажатию кнопки делаешь

Mainform.textBox1.Text="ля-ля-ля";

Другое дело что такое Mainform.
Обычно когда создаётся проект MainForm у тебя уже есть ... ведь так ?

у меня в данный момент нету под рукой студии, но помойму она создаётся как-то так
Application.Run(MainForm());

можно конечно вытаскивать её и отсюда через Application.Forms или что-то такое, но лучше обозвать

MyForm = new MainForm();
Application.Run(MyForm);

соответственно у MyForm правильная видимость и доступность должна быть.

Ну может ещё как  smile   я не знаю, я пишу консольные приложения.  smile 
PM   Вверх
GX777
Дата 20.4.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

я пишу консольные приложения



с консолью и у меня проблем не было.

Цитата

Mainform.textBox1.Text="ля-ля-ля";


не катит у текстбокса модификатор private, я конечно могу поставить на public... 
а MainForm эьто просто я так обозвал первыую форму,а Form1 вторую.

в общем у меня вот такая фигня:

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Yebotnya.rar 31,89 Kb
PM MAIL   Вверх
GX777
Дата 20.4.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



плин,забыл поменять имя файла(((прошу не банить я случайно

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Yebotnya.rar 31,89 Kb
PM MAIL   Вверх
surfrider
Дата 11.8.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как сделать сабж на C++/CLI?

Нашел похожую тему http://forum.vingrad.ru/topic-199937.html , но его вариант меня совсем не устраивает.
 
В общем, есть главная форма Form1 и дочерняя форма, пусть Form2.
В классе главной (form1.h) есть такие строки:

Код

#include "form2.h"
...
Form2 ^childWindow = gcnew Form2();
childWindow->Show();


Задача, как и везде: обратиться к определенным переменным или объектам главной формы(form1) из дочерней формы (form2).

Я пытался решить, как тут описывали: передача указателя на родительскую форму в дочернюю (Form2 ^childWindow = gcnew Form2(this)).
Но проблема: в дочерней форме в таком случае не определен класс Form1 и как его определить, я не знаю. Ведь если в файле form2.h написать #include "Form1.h", то вылезет миллион ошибок.

Какие есть варианты, кроме того, чтобы создавать отдельный класс, реализующий это?
PM MAIL   Вверх
KelTron
Дата 11.8.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как вариант, но думаю запарит вручную выдирать обработчики из хедера и переность в цпп.

Form1.h
Код

#pragma once
#include "Form2.h"

namespace k {

    ...
    
    public ref class Form1 : public System::Windows::Forms::Form
    {
    
    ...

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Form2^ form = gcnew Form2(this);
                 form->Show();
             }
    };
}


Form2.h
Код

#pragma once

...

namespace k {

    ref class Form1;
    
    public ref class Form2 : public System::Windows::Forms::Form
    {
    private:
        Form1^ form1;
    public:
        Form2(Form1^ form1)
        {
            InitializeComponent();
            this->form1 = form1;
        }
    ...
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);
    };
}


Form2.cpp
Код

#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

namespace k {
    System::Void Form2::button1_Click(System::Object^  sender, System::EventArgs^  e) {
        this->form1->Text = "123";
    }
}



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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