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

Поиск:

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


Шустрый
*


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

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



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


 Как это на  Дельфи.

Имеем : 

Form1 (Unit1.pas)
Form2 (Unit2.pas)

Чтобы мне из Form1 "видеть" Form2 и все объекты на ней достаточно в Unit1.pas включить строку - 

uses Unit2; 

И теперь я могу, например, сделать так :

Form2.Edit1.Text:='ля-ля-ля';

Каков аналог в C# ?
 
PM MAIL   Вверх
AntonSaburov
Дата 20.5.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Еслиони в одном проекте - то вообще ничего не надо.
Если же в другом

using <Имя проекта>;
PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня один проект и в нем 2 формы.
Например пробую изменить Text у textBox1 перед показом 2й формы

Пишу

NewForm frm=new NewForm();
NewForm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();

и получаю
NewForm.textBox1' is inaccessible due to its protection level



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


Штурман
****


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

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



Так у тебя обявление формы NewForm содержит это поле как protected. Выведи его в public.
PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ты имеешь виду это? изменить привате на паблик у техтбокса ?

~~~~~~~~~~ вырезал из листинга второй формы

public class NewForm : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
.....


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


3D-маньяк
****


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

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



Цитата
ты имеешь виду это? изменить привате на паблик у техтбокса ?

Да.

А лучше - создать public-свойство только на чтение, в котором возвращать ссылку на textBox1.


--------------------
user posted image
PM MAIL WWW   Вверх
Анальгин
Дата 20.5.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



меняю на public и в ответ :

F:\.....\Form1.cs(304): An object reference is required for the nonstatic field, method, or property '.....NewForm.textBox1'

mr.DUDA
может конечно лучше, но это не сейчас (сейчас только на 62 странице "полное руководство Visual C#.Net)

Как все гиморно в C# по сравнению с Дельфи smile
PM MAIL   Вверх
AntonSaburov
Дата 20.5.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Цитата
NewForm frm=new NewForm();
NewForm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();


Так надо так:
Код

NewForm frm=new NewForm();
frm.textBox1.Text="ля-ля-ля";
frm.ShowDialog();

PM MAIL WWW ICQ   Вверх
Анальгин
Дата 20.5.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



AntonSaburov огромное спасибо ! все ок.
PM MAIL   Вверх
stab
Дата 21.5.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



Цитата
Как все гиморно в C# по сравнению с Дельфи


Через пару месяцев будешь наоборот думать ;) Всегда сложно учить новое, но как интересно smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Сергей Плоткин
Дата 13.8.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поднимаю. Надеюсь в эту тему кто-нибудь еще заглянет... smile

Начинаю мигрировать C#, тоже с Делфи. Может быть кто-нибудь подскажет решение вышеуказанной задачи (в первом сообщении темы) только с точностью до наоборот:
имеются 2 формы.
на 1-ой textBox1 и button1 (при нажатии создает экземпляр Form2 и показывает), на второй только button1.
Что нужно сделать, чтобы при клике на кнопку button1, находящуюся во 2-ой форме, менялось поле text у объекта textBox1, находящегося на 1-ой (главной) форме?

Буду очень благодарен за помощь.
PM MAIL   Вверх
mr.DUDA
Дата 13.8.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Передаём ссылку на Form1 в конструктор Form2, в обработчике кнопки на форме2 меняем текст в текстбоксе. Текстбокс по-простому можно либо сделать пабликом, либо доступным через открытое св-во.


--------------------
user posted image
PM MAIL WWW   Вверх
Сергей Плоткин
Дата 13.8.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mr.DUDA @  13.8.2006,  19:30 Найти цитируемый пост)
Передаём ссылку на Form1 в конструктор Form2, в обработчике кнопки на форме2 меняем текст в текстбоксе. Текстбокс по-простому можно либо сделать пабликом, либо доступным через открытое св-во. 

Спасибо огромное. Я наконец разобрался. smile

Хотелось бы заметить, что, на мой взгляд, один из главных подводных камней для людей, мигрирующих с дельфей, такой:
VS, в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм... + все объекты, переменные, которые мы привыкли создавать в делфи и расчитывать на то, что они будут доступны отовсюду, т.к. по-умолчанию публичны, в C# по-умолчанию защищенные (за точность перевода private не ручаюсь, т.е. доступные только изнутри класса). Может это, конечно, и круто, и отвечает правилам хорошего тона ООП (читал где-то, что общение между разными формами друг с другом напрямую - дурной тон), но мы то к этому настолько привыкли... smile В общем, все это нужно менять на public, чтобы получить-таки доступ к ним.

Это лирическое отступление от новичка для новичков, которые, возможно, набредут на эту тему. Совсем не удивлюсь, если я в чем-то здесь не прав и проявил непонимания основных принципов языка (только азы постигаю), поэтому, если это так, то прошу меня поправить.

mr.DUDA - еще раз большое спасибо!
PM MAIL   Вверх
ivashkanet
Дата 13.8.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
 прошу меня поправить.

Сам просил  smile : 
Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
VS

VS -- это всего лишь крутой "блокнот". Создает все и вся среда .Net (а именно: JTI-компилятор)
Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм

Не понял этой фразы smile 
Неужели после объявления класса формы в Дэлфи его экземпляр сразу же начинает существовать?
А как к нему обращаться? По имени класса? 
Тогда для каждой новой формы придется писать свой класс. Так?

Тут все по другому (если я конечно прав выше).
Код

public class form1 : Form
{
// что-нить еще можно написать, но не обязательно :)
}

Это "чертеж" нового "здания" (формы), а не само "здание".
Дальше можно на основании этого "чертежа" возводить сколько угодно новых "зданий".
Код

form1 f  = new form1();
form1 g = new form1();
form1 h = new form1();
form1 j  = new form1();
form1 k = new form1();
form1 l  = new form1();

f, g, k, l --- все РАЗНЫЕ экземпляры форм. Сделанные по общему "чертужу".
И чтобы с ними работать тебе всегда нужна ссылка на конкретный экземпляр. Именно поэтому нужно его передавать другой форме. Чтобы она могла работать с полями текущей формы smile 

Цитата(Сергей Плоткин @  13.8.2006,  21:12 Найти цитируемый пост)
+ все объекты, переменные, которые мы привыкли создавать в делфи и расчитывать на то, что они будут доступны отовсюду, т.к. по-умолчанию публичны, в C# по-умолчанию защищенные

Никто ничего не защищал smile 
Просто ты наверное пробовал обратиться к ним через имя класса?
Код

form1.Text = "новое название";


Но ведь form1 --- это чертеж! С ним нельзя работать как с реальным объектом.
Чтобы можно было работать с "чертежом" (самим классом, а не его экземпляром) его элемент(ы) должен быть объявлен как static (т.е. общий для всех экземпляров класса)

Фроде фисё smile  
P.S. В нашем полку прибыло?  smile Добро пожаловать smile  
P.P.S. Код писал по памяти, так что мог где-нить накосячить с синтаксисом  smile 
PM MAIL WWW ICQ   Вверх
Сергей Плоткин
Дата 13.8.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Цитата(ivashkanet @  13.8.2006,  21:46 Найти цитируемый пост)
VS -- это всего лишь крутой "блокнот". Создает все и вся среда .Net (а именно: JTI-компилятор)

Да это я знаю (что это крутой блокнот). smile Но, допустим, я разработчик крутого блокнота "Супер-блокнот". Разве при его разработке я не могу впихнуть в функцию "Создать новый документ" автоматическое вписывание различных строк в документ? Мне же никто не мешает... smile

Цитата(ivashkanet @  13.8.2006,  21:46 Найти цитируемый пост)
Цитата(Сергей Плоткин @  13.8.2006,  21:12)
в отличие от делфи, не создает автоматически при создании форм экземпляры классов этих форм


Не понял этой фразы  
Неужели после объявления класса формы в Дэлфи его экземпляр сразу же начинает существовать?
А как к нему обращаться? По имени класса? 
Тогда для каждой новой формы придется писать свой класс. Так?


В делфи все совсем по-другому. Когда моделируешь форму, ты моделируешь именно экземпляр формы. Т.е. даже свойство "Name" у формы (допустим Form1) в дизайн-тайм - это имя не класса, а именно экземпляра класса TForm1. А класс TForm1 (наследник TForm) создает автоматом. К такому-то принципу я и привык. А в VS (C#, .NET - я уже запутался smile )  надо моделировать именно класс формы и затем создавать ее экземпляр. Нет, это не утомляет и особого труда не занимает, просто ведь "дельфятнику" нужно "дойти" до этого. smile

Насчет чертежей и зданий - я понял. smile Это ж общий принцип.

Цитата
Никто ничего не защищал  
Просто ты наверное пробовал обратиться к ним через имя класса?


Нет, я обращался именно к экземпляру. Я понимаю, что могу свободно редактировать свойства самой формы (экземпляра), например ее заголовок. Зато без танцев с бубном (конечно, уверен со временем мне покажется, что это логично и никак по другому и быть не может) я не могу обратиться к свойствам объекта, лежащего на этой форме.

Цитата
P.S. В нашем полку прибыло?   Добро пожаловать

Спасибо большое за гостеприимство! smile

Это сообщение отредактировал(а) Сергей Плоткин - 13.8.2006, 22:14
PM MAIL   Вверх
mr.DUDA
Дата 14.8.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(Сергей Плоткин @  13.8.2006,  22:13 Найти цитируемый пост)
 Т.е. даже свойство "Name" у формы (допустим Form1) в дизайн-тайм - это имя не класса, а именно экземпляра класса TForm1. А класс TForm1 (наследник TForm) создает автоматом. К такому-то принципу я и привык.

Всё понятно. Класс называется TForm1, а экземпляр - Form1. Переменная экземпляра формы, наверно, даже где-то объявлена smile, поэтому можно к ней обращаться из кода. Всё, что заполняется в дизайнере и Properties-ах, автоматом кладётся в исходник и ресурсы, насколько мне помнится из общения с делфями.

В WinForms похожий подход, дизайнером тоже создаётся специальный метод InitializeComponent, в который кладётся всё, что мы дизайним и настраиваем в Properties. Вот только экземпляр типа Form1 не создаётся автоматически - мы должны позаботиться об этом сами, т.к. изначально есть возможность создать много экземпляров одного класса (TForm1). К примеру, главная форма приложения создаётся в методе Main():
Код
Application.Run(new Form1());


Конечно, дельфисту поначалу это может показаться непривычным, но со временем привычки изменятся, и всё станет на свои места smile.

З.Ы. можно в принципе замутить статик-переменную с экземпляром формы, заполнять её в конструкторе формы, и тогда вполне можно обратиться к формам так (при условии, что указанная форма существует в данный момент времени):
Код
Form1.Instance.textBox1.Text = "bla-bla-bla";

или так:
Код
((Form1)Application.OpenForms["Form1"]).textBox1.Text = "bla-bla-bla";


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


--------------------
user posted image
PM MAIL WWW   Вверх
3me1
Дата 14.8.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все предельно просто.
создаем в классе формы указатель на "родительскую" форму

public class ChildForm
{
        private ParentForm parentForm;
        ///ctor
         public child(ParentForm link)
        {
              this.parentForm=link;
        }
 .................
}

вот и все...
теперь создаем э.ф.

...
{
       ChildForm childForm=new ChildForm(this);
       childForm.Show();
}

и соответственно обращаемся к родителю просто 
parentForm. ....;
PM MAIL   Вверх
mr.DUDA
Дата 14.8.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



3me1, это то о чём неоднократно говорилось:  smile 
Цитата(mr.DUDA @  14.8.2006,  10:50 Найти цитируемый пост)
передача экземпляра одной формы в конструктор другой




--------------------
user posted image
PM MAIL WWW   Вверх
kobra
Дата 14.8.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

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



Цитата(mr.DUDA @  14.8.2006,  10:50 Найти цитируемый пост)
Всё понятно. Класс называется TForm1, а экземпляр - Form1. Переменная экземпляра формы, наверно, даже где-то объявлена , поэтому можно к ней обращаться из кода.
в принципе одно и тоже, просто в делфиях чуть упрощено, вот и все.
в этои теме несколько раз прозвучало что компоненти входящие в состав формы нужно осавлять приватними, а для работы с ними писать своии паблик методы. честно говоря я в первые такое слышу. может обясните почему так? если по мне, ето не совсем правилно, из однои формы часто управляю елементами на другои форме. и зачем писать при етом собственные методы, когда ети методы уже есть?

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


Кодю потиху
****


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

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



Цитата(kobra @  14.8.2006,  15:00 Найти цитируемый пост)
в этои теме несколько раз прозвучало что компоненти входящие в состав формы нужно осавлять приватними, а для работы с ними писать своии паблик методы. честно говоря я в первые такое слышу. может обясните почему так? если по мне, ето не совсем правилно, из однои формы часто управляю елементами на другои форме. и зачем писать при етом собственные методы, когда ети методы уже есть?

kobra, есть принцип ООП -- инкапсуляция называется. Звучит он примерно так: Никакие данные внутри класса изменять нельзя. Можно только попросить класс изменить что-то, и если эти изменения согласуются с внутренней политикой класса, то он их сделает.
Определение, конечно, бестолковое, но суть проясняет smile
Например тебе в классе формы хочется, чтобы в ее заголовке отображалось содержимое некоторого текстБокса. Если теперь напрямую поменять значение текстбокса, то не факт что форма его подхватит.
Конечно можно подписаться на событие смены текста в текстбоксе. Но это только пример  smile  
PM MAIL WWW ICQ   Вверх
kobra
Дата 14.8.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

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



Цитата(ivashkanet @  14.8.2006,  15:13 Найти цитируемый пост)
есть принцип ООП -- инкапсуляция называется
 на счет инкапсулации все понятно. и пример твои вполне коректен. так как загаловок формы это своиство класа формы. 
я спрашиваю про то что менять например текст текстбокса расположенного на форме. в подобнои теме недавно было, что законы ООП и инкапсулация требуют создать метод класса формы. 
но по моему текстбокс не входит в клас формы, он ползуится этим класом как контеинером. и исходя из этого нужно работать с ним напримую а не через клас формы (правда при этом приходится указывать какои егземпляр формы содержит этот текстбокс, но кажется эта другая песня). 

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


Кодю потиху
****


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

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



Цитата(kobra @  14.8.2006,  16:57 Найти цитируемый пост)
инкапсулация требуют создать метод класса формы

Вот именно (кстати свойство --- это тот же метод, только синтаксис другой).
Когда ты кидаешь на форму текстБокс. Ты получаешь новый класс -- твоя форма, а не отдельно класс и отдельно форму. И поэтому лучше обращаться ко всему классу. Хотя удобнее к его компоненту. 
Хорошо когда ты сам писал класс формы и знаешь его внутреннюю кухню. А если нет. Даже на простом примере (см. предыдущий пост) видно, что лучше такого не допускать.

Но с другой стороны. Принципы ООП, ИМХО, жестко относятся только к повторно используемому коду. Если ты точно знаешь, что твоим классом никто не воспользуется (например кому нужна форма с конретным положением конкретных элементов на ней), то на ООП можно забить  smile
PM MAIL WWW ICQ   Вверх
kobra
Дата 14.8.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

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



Цитата(ivashkanet @  14.8.2006,  17:14 Найти цитируемый пост)
Когда ты кидаешь на форму текстБокс. Ты получаешь новый класс -- твоя форма, а не отдельно класс и отдельно форму.
99% всех форм, которые я делаю, мне нужны не как клас, а как один егземпляр (ну не совсем правилно выразился но надеюс поимете), так что
Цитата(ivashkanet @  14.8.2006,  17:14 Найти цитируемый пост)
Если ты точно знаешь, что твоим классом никто не воспользуется (например кому нужна форма с конретным положением конкретных элементов на ней), то на ООП можно забить   smile 
я о том же smile  


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


Новичок



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

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



Цитата
 3me1, это то о чём неоднократно говорилось:    

сорри smile я завтыкал smile
PM MAIL   Вверх
mr.DUDA
Дата 15.8.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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




M
mr.DUDA
Тема закреплена.

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



--------------------
user posted image
PM MAIL WWW   Вверх
Colloseum
Дата 2.9.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При открытии понятно.
Код

        Form EP;
        EP = new ExtendedParams();
        EP.textBox1.Text = "111";
        EP.ShowDialog();


А наоборот..
При закрытии окна нужно передать данные(из textBox'a) в другую форму.

PM MAIL   Вверх
marcusmae
Дата 2.9.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата

При закрытии окна нужно передать данные(из textBox'a) в другую форму.


Colloseum,
классическое решение - то, что называется callback, обратный вызов, или делегат в C#.
Можно, например, создать класс

Код

public static class CallBack
{
    public delegate void callbackEvent(string textFromTextBox);
    public static callbackEvent callbackEventHandler;
}


Далее, в форме, которая должна получать текст из диалога, инициализировать слушателя события callbackEvent :

Код

...
public string textBoxText;
...
// инициализацию можно поместить, например, в конструктор
public Form1()
{
    ...
    CallBack.callbackEventHandler = new Callback.callbackEvent(this.getText);
    ...
}
...
// функция-обработчик
private void getText(string textReturnedFromDialog)
{
    // нужная функциональность, допустим, запись в поле класса
    this.textBoxText = textReturnedFromDialog;
}



А в диалоге при его закрытии создавать событие :

Код

...
Callback.callbackEventHandler(textBox.Text);
...


Таким образом, при закрытии диалога произойдёт событие, аргумент которого - текст из TextBox'a. Другая форма зарегестрировалась на прослушку этого события, поэтому вызовется обработчик getText, в параметре которого и будет долгожданый текст.

Показанная конструкция - наиболее общая : делегат и его тип находятся в отдельном классе. Конечно, всегда лучше, если они находятся в одном из использующих классов. Всё зависит от того, как ты хочешь организовать программу.

Это сообщение отредактировал(а) marcusmae - 2.9.2006, 20:36


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
reloni
Дата 2.9.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть, на мой взгляд, более простое решение.
Есть две формы: MainForm - главная форма, и Form1 - форма, из которой нужно вытащить данные.
Кидаем на вторую форму текст-бокс и кнопку. Пишем своиство:
Код

public string TextInTextBox
{
    get { return this.textBox1.Text; }
}

Обработчик нажатия на кнопку:
Код

private void button1_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
}

Ну и на главной форме кнопка, по нажатию на которую создается Form1:
Код

private void button1_Click(object sender, EventArgs e)
{
    Form1 frm = new Form1();
    if (frm.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show(frm.TextInTextBox);
    }
}

Смотрим, что за DialogResult нам вернули, и если это ОК, то в мессаджбоксе видим то, что было введено в текстбокс в дочерней форме.

Это сообщение отредактировал(а) reloni - 2.9.2006, 22:18
PM MAIL ICQ   Вверх
marcusmae
Дата 2.9.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Если уж на то пошло, DialogResult тут, по-моему, мало нужен. Достаточно будет создать public - поле/свойство с текстом в форме и отправлять туда текст при закрытии диалога.
Думаю, ничто не мешает вообще переопределить в наследуемом классе DialogResult, сделать его string и возвращать текст. Да вот только, всё это будет работать только когда возвращать нужно туда же, откуда диалог вызвали... 

В любом случае, речь идёт о степени корявости кода программы, которую разработчики могут увеличивать до тех пор, пока программа не начнёт казаться интеллектуальной по части разнообразия возникающих ошибок. Общепринятый подход к созданию корявости - это, всё-таки, делегаты  smile 


Это сообщение отредактировал(а) marcusmae - 3.9.2006, 01:13


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
reloni
Дата 2.9.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



marcusmae, это если нужно выполнять какие-то действия если результ ОК, а другие, если он Cancel допустим. А про делегаты спасибо, не зналsmile
PM MAIL ICQ   Вверх
reg24r
Дата 9.9.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понять что в этом топике описано и повторить что здесь написано  может только тот кто знает и без того как это все делать. 
Прочитал топик уже раз 50 в поисках истины. Попробовал что-то повторить. Увы... 
Уважаемые программисты !
Может кто-нибудь показать на примере как при закрытии кнопкой второй формы передать  значение label.Text формы2 в label.Text формы1
Извиняюсь за тупость.
(не отсылайте к теории и книгам, там о таком к сожалению ничего не написано, по крайней мере для тупых)

PM MAIL   Вверх
ivashkanet
Дата 9.9.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



reg24r, в твоем случае есть два варианта:
1) Показать вторую форму с помощью ShowDialog(), тогда первая форма будет ждать пока закроется вторая, а потом нужные данные "слизать" с закрытого, но еще живого экземпляра второй формы.

Код

Form2 f2 = new Form2();
f2.ShowDialog();
this.Label1.Text = f2.SuperPuperVazhnajaInfa // Все равно откуда мы ее берем :)


2) Либо 
Цитата(mr.DUDA @  13.8.2006,  19:30 Найти цитируемый пост)
Передаём ссылку на Form1 в конструктор Form2, в обработчике кнопки на форме2 меняем текст в текстбоксе. Текстбокс по-простому можно либо сделать пабликом, либо доступным через открытое св-во.


Код

Form2 f2 = new Form2(this); 
f2.Show(); // дальше вторая форма живет своей жизнью в отдельном потоке,
                 // а не в том же, как при ShowDialog()


Код

class Form2 : Form
{
 private Form1 parentForm;

 public Form2(Form1 parentForm)
 {
          this.parentForm = parentForm;
 }

 private void Form2_OnClose(object sender, e EventArgs)
 {
    parentForm.Label1.Text = this.SuperPuperVazhnajaInfa 
 }
}


P.S. Модераторы: предлагаю очистить эту тему от всего ненужного мусора  smile 
P.P.S. Весь код был написан тут же, так что его скорее всего придеться "доработать напильником" на предмет синтаксических ошибок
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 9.9.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



ivashkanet, "мусор" останется, мало ли он кому понадобится smile... А пример твой имхо более чем понятен. Или если что, спрашивайте, reg24r, мы ответим !


--------------------
user posted image
PM MAIL WWW   Вверх
reg24r
Дата 10.9.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Оба примера слава богу работают.
Огромное спасибо за помощь.
Преодолена еще одна ступень в ООП.


Вопрос по этому коду

Цитата

class Form2 : Form
{
 private Form1 parentForm;    

 public Form2(Form1 parentForm)
 {
          this.parentForm = parentForm;
 }

 private void Form2_OnClose(object sender, e EventArgs)
 {
    parentForm.Label1.Text = this.SuperPuperVazhnajaInfa 
 }
}



Чем отличается 
Form1 parentForm; 

от

Form1 parentForm = new Form1(); 

Это сообщение отредактировал(а) reg24r - 10.9.2006, 16:48
PM MAIL   Вверх
Exception
Дата 10.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Первый вариант - ты объявляешь переменную. Второй - ты её объявляешь и сразу создаёшь экземпляр, с которым можно работать. В первом варианте в переменной будет хранится null, а во втором - экземпляр класса Form1.
PM   Вверх
ivashkanet
Дата 10.9.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Добавлю еще, что Form1 parentForm = new Form1(); создает совершенно новый экземпляр класса Form1 (читать выше про чертежи и здания). И это будет совсем другая новая форма (брат-близнец главной формы).
Поэтому приходиться передавать ссылку на форму явно Form2 f2 = new Form2(this)
PM MAIL WWW ICQ   Вверх
Lеstat
Дата 16.9.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно тоже вопросик на эту тему...
прочитал и тему, и форум полистал не нашел ответа 

У меня есть главная форма Form1 и еще один класс в отдельном файле
в классе Form1 пишу такую штуку
Код

public void InstallintoDB(String name)
        {
            Log.AppendText("Установка будет произведена в базу " + name + "\n");
        }
Log - это текстовое поле на Form1... 
эта функция вызывается после нескольких других функций, в которых я подключался к БД, настраивал ее и тд
эту функцию мне необходимо выззвать из другого класса...
когда я пишу в другом классе 
Код

            Form1 frm = new Form1();
            frm.InstallintoDB("новая бд");
но как уже заметил ivashkanet создается совершенно новый экземпляр класса Form1 (с Form2 f2 = new Form2(this) не прокатило)
и у меня получается бред...
мне нужно чтобы функция выполнилась так, как-будто я ее в самом же Form1 и вызвал!
раньше я выкручивался через 
Код

internal static void InstallintoDB()
        {
              // но тут нельзя использовать не static объекты!!! а у меня они все не статик
        }
вобщем такая конструкция очень не удобна из-за того что если та не статик объект ошибка получается, а все статиками делать уже сил нет  smile 

Хочу вот узнать как умные люди пишут такие процедуры...

Это сообщение отредактировал(а) Lеstat - 16.9.2006, 18:06
PM MAIL ICQ   Вверх
ivashkanet
Дата 16.9.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Lеstat, надобыло внимательнее читать топик smile
В твоем случае подходит пункт 2 (передача ссылки через конструктор)
Цитата(Lеstat @  16.9.2006,  18:01 Найти цитируемый пост)
но как уже заметил ivashkanet создается совершенно новый экземпляр класса Form1 (с Form2 f2 = new Form2(this) не прокатило)

Интересно почему так не покатило?
Если ты хочешь из Form2 вызвать метод  InstallintoDB первой формы, то пишешь
Код

// Form1
Form2 f2 = new Form2(this) // В этом месте ссылка на первую форму сохраняется в во второй форме

// Form2 
this.ParentForm. InstallintoDB("новая бд")

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


Новичок



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

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



Немного вернусь к первонанальной теме. На форуме были только советы, как обратиться к форме-родителю (поправьте, если что-то пропустил). А что, если в проекте форм эдак 10-15 ? Я предлагаю следующий метод, который, возможно, будет легко понять:

Итак, сначала сделаем static класс, в котором будем хранить список всех форм проекта. Примерно так:
Код

public static class ApplicationFormList
    {
        public static TAdminForm                AdminForm;
        public static TAuthenticationForm   AuthenticationForm;
        public static TBossForm                  BossForm;
        public static TUserForm                  UserForm;
       
        // и так далее
    }
 

Обратите внимание, что мы просто объявляем объекты, не выделяя память, т.е. по сути мы объявляем указатели на формы, которые в момент запуска равны null

Сейчас внесём небольшие изменения в конструкторы каждой из форм, и вместо
Код

public TAdminForm()
        {
            InitializeComponent();
        }


напишем

Код

public TAdminForm()
        {
            InitializeComponent();
            ApplicationFormList.AdminForm = this;
        }


И так для каждой. Иными словами, после создания формы мы из любой другой можем к ней обратиться:

ApplicationFormList .AdminForm.Show();

Можно немного улучшить и проверять, создана ли форма, если вы не делаете этого при старте приложения:

Код

private void button1_Click(object sender, EventArgs e)
        {
            if (ApplicationFormList.AdminForm != null) 
                     ApplicationFormList.AdminForm.Show(); 
            else
                    new TAdminForm().Show();
        }



Как видим, обращение к формам стало очень похоже на Delphi, только перед именем формы пишем имя того static - класса, в котором у нас храниться список форм.

За сим дозвольте откланяться

P.S. Буду только рад замечаниям.


Это сообщение отредактировал(а) vitovt - 3.10.2006, 22:42
PM MAIL   Вверх
ivashkanet
Дата 3.10.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(vitovt @  3.10.2006,  11:41 Найти цитируемый пост)
P.S. Буду только рад замечаниям.

А их вроде как и нету smile Кроме как использования вместо поля --- пропетя, у которого на чтение public, а на запись internal smile

либо 
Цитата(vitovt @  3.10.2006,  11:41 Найти цитируемый пост)
private void button1_Click(object sender, EventArgs e)        
{            
if (ApplicationFormList.AdminForm != null)                      
ApplicationFormList.AdminForm.Show();            
 else                    
new TAdminForm().Show();        
}


А это лучше всего обернуть в пропертю:
Код

    public static class FormStorage
    {
        private static Form _form1;

        public static Form Form
        {
            get
            {
                if (_form1 == null) _form1 = new Form1();
                return _form1;
            }
            internal set { _form1 = value; }
        }
    }


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


Шустрый
*


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

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



А если объект наследуется  (у меня ArrayList, например), то у меня не получается так лихо напрямую к нему обратиться:

Код

ApplicationFormList.ClassForm10.SignalList ......


Т.е. у объекта формы должен стоять public?  А protected  - не пойдет? 
PM MAIL   Вверх
mr.DUDA
Дата 12.10.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(lioness @  12.10.2006,  18:02 Найти цитируемый пост)
Т.е. у объекта формы должен стоять public?  А protected  - не пойдет? 

protected пойдёт, если обращаемся к полю из наследника


--------------------
user posted image
PM MAIL WWW   Вверх
xsb3
Дата 2.12.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Люди а http://xsb3.ifolder.ru/544137 данный проект переделать можете и выложить переделанный чтоб все на практике видели как что к чему.
PM MAIL   Вверх
ivashkanet
Дата 3.12.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(xsb3 @  2.12.2006,  21:50 Найти цитируемый пост)
все на практике видели как что к чему.

чтоб все на практике видели как что к чему.  Чтобы ты его забрал результат, а больше ведь тебе ничего не надо  smile
Примеров, некоторые очень даже хороши, здесь было достаточно  smile 
PM MAIL WWW ICQ   Вверх
VisualProgrammerNET
Дата 6.12.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Достало просто уже писать диздок... Решил хоть чё-нить спрограммить.
xsb3, вот те коды обеих форм.

Форма 1:
Код

public partial class Form1 : Form
    {
        Form2 f2;

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

        private void button1_Click(object sender, EventArgs e)
        {            
            f2.Show();
        }

        internal void FillUpTheListView(ListViewItem lvi)
        {
            this.listView1.Items.Add(lvi);
        }
    }


Форма 2:
Код

public partial class Form2 : Form
    {
        Form1 f1;
        public Form2(Form1 form)
        {
            InitializeComponent();
            this.f1 = form;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ListViewItem LVI = new ListViewItem(new string[] { textBox1.Text, textBox2.Text, textBox3.Text });
            f1.FillUpTheListView(LVI);
            this.Hide();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }
    }


Да, и обработчик не забудь убрать с listView1_SelectedIndexChanged

Это сообщение отредактировал(а) VisualProgrammerNET - 6.12.2006, 20:24


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Ламо
Дата 27.12.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
NewForm frm=new NewForm();
frm.ShowDialog();
frm.Controls["textBox1"].Text = "ляляля";


100%!!!!

Это сообщение отредактировал(а) Дрон - 27.12.2006, 16:37
PM MAIL   Вверх
ivashkanet
Дата 27.12.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Ламо, это ты к чему?

Одноразовые способы у нас не в ходу   smile   smile 

А все потому, что в твоем коде frm это локальная переменная, которая пропадет при выходе из метода. 
Следовательно ссылка на форму пропадет тоже.
А без ссылки на форму с ней уже ничего сделать не получиться  smile 

Это сообщение отредактировал(а) ivashkanet - 27.12.2006, 17:54
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 29.12.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Ламо, ShowDialog работает до тех пор пока форма не закрыта. То есть, твой
Код
frm.Controls["textBox1"].Text = "ляляля";

выполнится уже после закрытия формы !!!


--------------------
user posted image
PM MAIL WWW   Вверх
McSlash
  Дата 8.1.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Описал формы как показал VisualProgrammerNET, но не могу придумать
как добраться до текст бокса на второй форме.
Сразу попробовал так
Код
f2.textBox1.Text="";

в результате ошибка (390): 'WinApp.Form2.textBox1' is inaccessible due to its protection level
Перевести могу smile но, как тогда правильно обратиться к наполнению второй формы?
В смысле не к textBox'у а вообще к любому элементу?

Код

public class Form1 : System.Windows.Forms.Form
{
    private System.Windows.Forms.MainMenu mainMenu1;
    private System.Windows.Forms.MenuItem menuItem7;
    Form2 f2;

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

    private void menuItem7_Click(object sender, System.EventArgs e)
    {
        f2.textBox1.Text=""; //ошибка
        f2.ShowDialog();
    }
}



Код

public class Form2 : System.Windows.Forms.Form
{
    private System.Windows.Forms.TextBox textBox1;
    Form1 f1;

    public Form2(Form1 form)
    {
        InitializeComponent();
        this.f1=form;
    }
}

На обеих формах стер все, что посчитал лишним. Может переусердствовал?
PM MAIL ICQ   Вверх
reloni
Дата 8.1.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это сообщение означает, что текстбокс на второй форме объявлен как protected или private, поэтому ты и не можешь но него добраться (инкапсуляцияsmile). Есть два пути: 
Или поставить текстбоксу public и тогда можно с ним делать все что душе угодно (в том числе и будет работать код выше).
Или в форме номер два сделать специальное свойство:
Код

        public string TextInTextBox
        {
            set { this.textBox1.Text = value; }
            get { return this.textBox1.Text; }
        }


И тогда можно будет устанавливать значение уже через него:
Код

    private void menuItem7_Click(object sender, System.EventArgs e)
    {
        f2.TextInTextBox=""; //теперь ошибки нет
        f2.ShowDialog();
    }

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


Новичок



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

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



Спасибо!  smile Сам думал работать через процедуру, но пока не успел, да и решение вырисовывалось кривенькое...
А public - это, по моему, не серьезно. Не зря же private автоматом прописывается. Вроде как для защиты программы от внешнего управления в скомпилированной программе... Это только предположение естесвенно smile
PM MAIL ICQ   Вверх
Berserk
Дата 18.1.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть вторая форма на которой расположен прогрессбар. Есть бекгроундворкер. Для второй формы я создаю
Код
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 

Как мне вызывать его из первой формы в 
Код
private void buttonOK_Click(object sender, EventArgs e)




 
--------------------
  
PM MAIL ICQ   Вверх
mr.DUDA
Дата 18.1.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



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


--------------------
user posted image
PM MAIL WWW   Вверх
Evgenik
Дата 27.2.2007, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Профи С#.NET помогите реализовать простую задачу. Необходимо, чтоб при закрытии формы выдавалсь сообщении, подтверждающее выход. Тобишь сообщении с двумя кнопками (ОК,Cancel). Соответственно при нажатии ОК- выход, Cancel - всё возвратилось на круги своя...
 Извините если не туда запостил.
PM MAIL   Вверх
mr.DUDA
Дата 27.2.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Evgenik, вынеси в отдельную тему в раздел "Разработка Windows Forms", там и отвечу  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 27.2.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(Evgenik @  27.2.2007,  04:58 Найти цитируемый пост)
 Извините если не туда запостил. 

Не туда  smile 

Сходи сюда
Что будет непонятно, там и отписывайся smile
PM MAIL WWW ICQ   Вверх
Evgenik
Дата 28.2.2007, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



     Спасибо, разобрался... smile 

P.S. Спасибо, что просто не послали восвояси smile 
PM MAIL   Вверх
Legolas
Дата 23.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Скажите, плз. Как заставить при активация одной формы предыдущую закрываться? 
PM MAIL   Вверх
ivashkanet
Дата 23.4.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Legolas, ИМХО, тут без внешнего менеджера форм не обойтись.
PM MAIL WWW ICQ   Вверх
Legolas
Дата 23.4.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Кодю потиху
****


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

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



Цитата(ivashkanet @  23.4.2007,  09:03 Найти цитируемый пост)
Legolas, ИМХО, тут без внешнего менеджера форм не обойтись. 

Не, я глюканул  smile Можно:
Код

this.Hide();
new SecondForm.Show();
// если текущая форма главная в проекте, то ее закрывать нельзя, ибо закроется все приложение.
// поэтому следующую строчку придется убрать
this.Close(); 

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


Бывалый
*


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

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



Вроде работает, но...

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

Как избежать этого?

Добавлено через 14 минут и 48 секунд
Всё, разобрался, спасибо!)
PM MAIL   Вверх
Legolas
Дата 30.5.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пытаюсь передать значение строки из одной формы в другую. 

Код

Form1 f1 = new Form1();
this.str = f1.fio;


Компилятор выдает ошибку, что str == null;

Ставлю breakpoint и вижу, что при работе в первой форме, значение fio="Фамилия", но при открытии второй формы это значение обнуляется (?) и str присваивается null. Подскажите как этого избежать.

Спасибо.

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


Эксперт
****


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

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



Полностью код покажи.
Ты, наверное, создаёшь первую форму заново, а тебе надо считывать значение из уже существующего экземпляра smile .
PM   Вверх
Legolas
Дата 31.5.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня две формы: Form1 и Form2. В Form1 есть richtextbox1. Я заношу инфу в richtextbox1, а затем эту инфу мне нужно передать в Form2 строку.

Form1:
Код

public void button1_Click(object sender, EventArgs e)
        {
               string fio = richtextbox1.Text;
               Form2 frm2 = new Form2();
               frm2.ShowDialog();
        }

Form2:
Код

public void button1_Click(object sender, EventArgs e)
       {
                string str;

                Form1 f1 = new Form1();
                this.str = f1.fio;
       }


При breakpoints в первой форме видно, что string fio = "Иванов", но при Debug'е второй формы strinf fio == null (?)





Это сообщение отредактировал(а) Legolas - 1.6.2007, 19:20
PM MAIL   Вверх
Exception
Дата 31.5.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А ты в принципе осознаёшь то, что делаешь?

Цитата(Legolas @  31.5.2007,  21:30 Найти цитируемый пост)
Form1 f1 = new Form1();


заново создаёт экземпляр формы (можешь бедиться, вызвав f1.Show()). Естественно, fio пусто.
Во-вторых, тебе нужно сохранить текст в поле, а ты сохраняешь его в переменной:

Цитата(Legolas @  31.5.2007,  21:30 Найти цитируемый пост)
string str = richtextbox1.Text;


(надо this.str)

Правильно передать в конструкторе при создании Form2 ссылку на экземпляр Form1 и обращаться к нему.
PM   Вверх
Legolas
Дата 31.5.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Правильно передать в конструкторе при создании Form2 ссылку на экземпляр Form1 и обращаться к нему. 


НЕ очень понимаю как это сделать...
PM MAIL   Вверх
Vasja_Pupkin
Дата 1.6.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, такой вопрос по си шарпу: как обратиться к переменной из другого класса, т.е. мы имеем 2 формы на первой текст бох и кнопка, на второй текст бокс, при нажатии на кнопку на первой форме надо чтоб текст в текст боксе на 1 форме появлялся в текст боксе на 2 форме.
PM MAIL   Вверх
W1zArD
Дата 20.6.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



>как обратиться к переменной из другого класса
поставить перед переменной ключ. слово public
PM   Вверх
WinNet
Дата 15.7.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К стати в mdi эти примеры не катят?! или я что то не так делаю...
Вот код:

Form3 

Код

    public void Audit()
        {
            if (textBox1.Text != "")
            {
                MessageBox.Show("Yes");
            }
        }


Form1 // MDI контейнер!
Код

        private void toolStripButton7_Click(object sender, EventArgs e)
        {
            // Здесь нужно вызвать метод Audit()
            //Подскажите пожалуйста как это сделать???
        }

PM ICQ   Вверх
QryStaL
Дата 16.7.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Код

((Form3)this.MDIChildren[0]).Audit()



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
WinNet
Дата 17.7.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



СПАСИБО!  smile 
Все заработало с малениькой поправочкой:
Код

((Form3)this.ActiveMdiChild).Audit();

PM ICQ   Вверх
ToMaloi
Дата 28.8.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Простите за повторения.Есть главная форма Form1.Считываем с нее textbox и открываем Form2, в Form2 обрабатываем textbox, а главную закрываем....закрывается и Form2???


Это в главной форме:

Form2 f2 = new Form2();
      f2.Show();
......
Close();


Что же мне написать во второй чтобы она не закрылась и достать во второй textbox из главной


Башкой подумал... smile 
все хорошо!!!

Это сообщение отредактировал(а) ToMaloi - 31.8.2007, 16:05
PM MAIL   Вверх
klet2007
Дата 10.9.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Имеются  2 формы. В них button1,button2  и textBox1,textBox2 соответственно. По клику на кнопку button1 рткрывается форма2. 
Как быть, если нужно чтоба текст из textBox2 второй формы попадал в открытую уже форму1?
PM MAIL   Вверх
ivashkanet
Дата 10.9.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



klet2007, перечитай тему
PM MAIL WWW ICQ   Вверх
Dark_Falcon
Дата 10.9.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Имеются  2 формы. В них button1,button2  и textBox1,textBox2 соответственно. По клику на кнопку button1 рткрывается форма2. 
Как быть, если нужно чтоба текст из textBox2 второй формы попадал в открытую уже форму1?

В Form2 пишем

Код

public string TextInTextBox
{
    get { return this.textBox2.Text; }
}


Обработчик нажатия на кнопку 2 в Form2

Код

private void button2_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
}



Обработчик нажатия на кнопку 1 в Form1

Код

private void button1_Click(object sender, EventArgs e)
{
Form2 Form1 = new Form2();
if (Form1.ShowDialog() == DialogResult.OK)
 {
textBox1.Text = Form1.TextInTextBox;
 }
}

PM MAIL   Вверх
Sergey_P
Дата 11.9.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dark_Falcon @  10.9.2007,  09:19 Найти цитируемый пост)
Цитата

Имеются  2 формы. В них button1,button2  и textBox1,textBox2 соответственно. По клику на кнопку 

button1 рткрывается форма2. 
Как быть, если нужно чтоба текст из textBox2 второй формы попадал в открытую уже форму1?

В Form2 пишем


А как сделать, чтобы при нажатии кнопки во второй форме, данные передавались бы в первую, но при 

этом не закрывалась вторая форма?


Я попробовал так:

Цитата(3me1 @  14.8.2006,  12:36 Найти цитируемый пост)
Все предельно просто.
создаем в классе формы указатель на "родительскую" форму

public class ChildForm
{
        private ParentForm parentForm;
        ///ctor
         public child(ParentForm link)
        {
              this.parentForm=link;
        }
 .................
}


но при компиляции в строке "public child(ParentForm link)" выдается ошибка
Class, struct or integface method must have a return type


Дальше я посмотрел пример 

Цитата(ivashkanet @  9.9.2006,  22:49 Найти цитируемый пост)


код C#
Form2 f2 = new Form2(this); 
f2.Show(); // дальше вторая форма живет своей жизнью в отдельном потоке,
                 // а не в том же, как при ShowDialog()

код C#

class Form2 : Form
{
 private Form1 parentForm;

 public Form2(Form1 parentForm)
 {
          this.parentForm = parentForm;
 }

 private void Form2_OnClose(object sender, e EventArgs)
 {
    parentForm.Label1.Text = this.SuperPuperVazhnajaInfa 
 }
}



И изменил таким образом

В форме 1 текст такой

Код

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();         
        }
    }




а в форме 2 такой

Код

    public partial class Form2 : Form
    {
        private Form1 parentForm;
        public Form2(Form1 parentForm)
        {
            this.parentForm = parentForm;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            parentForm.textBox1.Text = this.textBox1.Text; 
        }
    }



Но при компиляции выдается ошибка  
parentForm.textBox1.Text = this.textBox1.Text;
.... .Form1.textBox1.Text is inaccessible due to its protection level

Добавлено через 6 минут и 51 секунду
кстати, а если надо перемещать большой объем данных из потомка в родителя, как сделать, чтобы такая операция не тормозила?
PM MAIL   Вверх
ivashkanet
Дата 11.9.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(Sergey_P @  11.9.2007,  16:01 Найти цитируемый пост)
но при компиляции в строке "public child(ParentForm link)" выдается ошибка
Class, struct or integface method must have a return type

Если это конструктор, то он должен называться ChildForm, а если нет, то должен быть тип (void например)
Цитата(Sergey_P @  11.9.2007,  16:01 Найти цитируемый пост)
.... .Form1.textBox1.Text is inaccessible due to its protection level 

Перевод: .... .Form1.textBox1.Text недоступен ввиду его "уровня доступа"
Пояснение: Скорее всего textBox1 имеет модификатор private.
PM MAIL WWW ICQ   Вверх
Sergey_P
Дата 11.9.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



таак, понятно  smile 
исправил на public у кнопки, заработало ...но   
вторая форма появляется вообще пустой   smile 


вот код в первой форме (там в дизайнере добавил текстовое поле и кнопку)

Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();
        }
    }



на вторую форму тоже добавил кнопку 2, и текстовое поле 2

Код

    public partial class Form2 : Form
    {
        private Form1 parentForm;
        public Form2(Form1 parentForm)
        {
            this.parentForm = parentForm;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            parentForm.textBox1.Text = this.textBox2.Text; 
        }
    }



неделю назад программил на дельфи и в глаза не видел C#, а сейчас срочно надо C#  !!!!! помогите   smile

Добавлено через 4 минуты и 34 секунды
гыыыыы, понял  smile 

я забыл InitializeComponent();
PM MAIL   Вверх
Sergey_P
Дата 12.9.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



к спецам есть еще вопрос - а можно родительской форме передать событие? 
если да, как это правильнее всего сделать?
PM MAIL   Вверх
Deja_Vu
Дата 28.9.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Лично я думаю, что форма, этопржде всего инструмент ввода/ввывода информации, а саму информацию нужно хранить в другом месте.
Поэтому использую родительский класс(свой - DataCenter), который и работает со всеми формами и т.д.

DataCenter.cs
Код

namespace FromDataTransport
{
    public class DataCenter
    {
        public Form f1, f2;
        public string testData;
        
        public void Update()
        {
            (f1 as Form1).updateInfo();
        }

        public DataCenter()
            {
                f1 = new Form1(this);
                f2 = new AboutBox1(this);

                f1.Show();
            }
    }
}


Program.cs
Код

namespace FromDataTransport
{
    static class Program
    {
        static public DataCenter dc;
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            dc = new DataCenter();
            Application.Run(dc.f1);
        }
    }
}


Form1.cs
Код

namespace FromDataTransport
{
    public partial class Form1 : Form
    {
        public DataCenter dc;
        public Form1(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }
        public void updateInfo()
        {
            button1.Text = dc.testData;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dc.f2.Show();   
        }
    }
}


AboutBox1.cs
Код

namespace FromDataTransport
{
    partial class AboutBox1 : Form
    {
        public DataCenter dc;
        public AboutBox1(DataCenter p)
        {
            InitializeComponent();
            this.dc = p;
        }

         private void okButton_Click(object sender, EventArgs e)
        {
            dc.testData = this.textBoxDescription.Text;
            dc.Update();
            this.Hide();
        }
    }
}


Конечно, я не профи в C#.NET поэтому буду рад обсуждению такого подхода.

Добавлено через 2 минуты и 20 секунд
to Sergey_P
имхо - мой подход может тебе очень помочь, т.к. с помощью него можно получать доступ к чему угодно...
PM Skype   Вверх
ivashkanet
Дата 28.9.2007, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Deja_Vu, нормуль ;-)
Концепция хороша, реализация тоже неплоха. 
Я что-то в этом духе использую сам.
P.S. Только вот это все сложно для тех, кто не знает как "Как обратиться к объекту другой формы"....
PM MAIL WWW ICQ   Вверх
alver
Дата 20.11.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм, очень грустно конечно. Но перечитав топик 4 раза, так и не допонял, какой способ мне нужно использовать. Тут большинство пишут про возвращение значения из формы2 в форму1. А если просто надо передать значение из формы1 в форму2. Т.е. у меня есть форма1 с textBox и кнопка "Далее". При нажатии на кнопку "далее" форма1 закрывается(или скрывается), а значение textBoxa передаётся в форму2, где с ним(со значением) происходят необходимые вычисления.
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 20.11.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(alver @  20.11.2007,  19:23 Найти цитируемый пост)
При нажатии на кнопку "далее" форма1 закрывается(или скрывается), а значение textBoxa передаётся в форму2, где с ним(со значением) происходят необходимые вычисления. 


Код

// Собираем нужные данные на первой форме
from1.Close();

From2 form2 = new Form2();
form2.Initialize(value1, value2, value3, ..., value 45643);

form2.Show();

PM MAIL WWW ICQ   Вверх
alver
Дата 20.11.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё, спасибо разобрался.
А ещё такой вопрос. Т.к. первая форма у меня главная, то при открытии второй, ественно, закрыть первую форму я не могу, приходится её скрывать методом ".Hide()". А при закрытии второй, первая остаётся висеть в памяти. Как же мне при закрытии второй закрыть и первую?

Это сообщение отредактировал(а) alver - 21.11.2007, 01:08
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(alver @  20.11.2007,  20:45 Найти цитируемый пост)
А при закрытии второй, первая остаётся висеть в памяти. Как же мне при закрытии второй закрыть и первую

Из наиболее простых решений я бы предложил следующее:
Код

// Собираем нужные данные на первой форме
from1.Hide();

From2 form2 = new Form2();
form2.Initialize(value1, value2, value3, ..., value45643);

form2.ShowDialog(); // Передаст управление во вторую форму, а когда она закроется вернется сюда

from1.Close();

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


Шустрый
*


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

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



Спасибо. Этот способ я понял. Но уж какой то он больно элементарный. Проти кончено за напористость). Просто хочу ПОНЯТЬ, как именно закрыть первую форму непосредтвенно из второй. Т.е. нужно видеть поля первой формы из второй. Прочитав топик, подозреваю, что нужно передать через конструктор втрой ссылку на первую?? И уже так с ней работать. Но чего то не выходит(

Это сообщение отредактировал(а) alver - 21.11.2007, 11:10
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Но уж какой то он больно элементарный

Не думаю, что это недостаток ;-)
Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Прочитав топик, подозреваю, что нужно передать через конструктор втрой ссылку на первую?? И уже так с ней работать.

Да, но раз у тебя есть метод инициалайз, то лучше через него (Я вообще сторонник того, чтобы конструктор делал как можно меньше --- только создавал нужный объект и все).

А имея ссылку на первую форму можно делать с ней все что угодно, в частности закрыть ее:
Код
refToForm1.Close();


Цитата(alver @  21.11.2007,  11:08 Найти цитируемый пост)
Но чего то не выходит

Надеюсь первая форма не главная форма приложения? В этом случае ее нельзя закрыть не закрыв при этом приложения...
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Щас объясню, собственно, в чём загвоздка. Представь себе любой пошаговый мастер, т.е. есть первая форма, нажимаешь на кнопку "далее", появляется вторая форма, и т.д. У меня таких формы подряд четыре. Первая информационная, вторая для ввода данных, третья для вывода формул, четвёртая для вычислений. Т.е. это и есть пошаговый мастер. Собственно хотелось бы, чтобы как в настоящим мастере можно было по кнопке "назад" откатываться на одну форму назад. Ну и передача значений между формами, в чём собственно ты мне уже помог.
PM MAIL GTalk Jabber   Вверх
1stain
Дата 21.11.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



alver, одна форма визарда, на ней несколько панелей, каждая для своего шага. В каждый момент Visible = true только та панель, которая соответствует текущему шагу.  Вся информация аккумулируется в форме визарда.


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
ivashkanet
Дата 21.11.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



В случае пошаговых менеджеров я бы предложил набор панелей (представляющих собой шаги), которые скрываются и показываются по мере надобности на одной и той же форме (это просто идея, я сам такого не делал, но если бы делал, то делал бы именно так).
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(1stain @ 21.11.2007,  11:46)
alver, одна форма визарда, на ней несколько панелей, каждая для своего шага. В каждый момент Visible = true только та панель, которая соответствует текущему шагу.  Вся информация аккумулируется в форме визарда.

Я думал так, но как то некрасиво получилось. Элементов много, и всё в кучу. А как вообще правильно делать?
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(alver @  21.11.2007,  11:50 Найти цитируемый пост)
Я думал так, но как то некрасиво получилось. Элементов много, и всё в кучу.

Ну тогда вместо панелей можно использовать набор ЮзерКонтролов, тогда все элементы будут скрыты внутри контролов.
Цитата(alver @  21.11.2007,  11:50 Найти цитируемый пост)
А как вообще правильно делать?

А хз. Я никогда многостраничные диалоги не делал.
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ivashkanet @ 21.11.2007,  11:57)
Ну тогда вместо панелей можно использовать набор ЮзерКонтролов, тогда все элементы будут скрыты внутри контролов.

Юзер контрол - а это чего? Точнее как?)

Это сообщение отредактировал(а) alver - 21.11.2007, 12:11
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 12:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



System.Windows.Forms.UserControl


P.S. Погуглил немножко. Многие советуют делать многостраничный диалог именно панелями.
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм, ладно. Спасибо, будем программить через одну форму)
PM MAIL GTalk Jabber   Вверх
ivashkanet
Дата 21.11.2007, 12:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



alver, не нужно кидаться в омут с головой. Лучше сначала немножко подумать.

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

Например что-то подобное:
Код

public class DialogManager
{
    public void ShowDialog()
    {
            Form1 form1 = new Form1();
            form1.Initialize(...);

            form1.ShowDialog();

            Form2 form2 = new Form2();
            form2.Initialize(..., form1.Value1, form1.Value2, form1.Value3, form1.Value4, ...);

            form2.ShowDialog();

            // ...

            form1.Close();
            form2.Close();
            form3.Close();
    }
}




P.S. Просьба модераторам вынести это обсуждение в отдельную тему. Название "Создание многостраничного диалога".

Добавлено через 5 минут и 40 секунд
Товарищ, кот отметил мой первый пост на странице минусом --- не хотите ли пояснить свою позицию?

Это сообщение отредактировал(а) ivashkanet - 21.11.2007, 12:41
PM MAIL WWW ICQ   Вверх
alver
Дата 21.11.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ivashkanet @ 21.11.2007,  12:38)
У тебя уже есть вариант с четырьмя формами?
Если да, то можно обойтись малой кровью создав небольшой класс который будет управлять формами диалога.

Да, четыре формы уже есть. Я в принципе уже и без класса сделал вроде, но время есть, поэтому щас попытаюь через класс ещё сделать, дабы чему то научиться)
PM MAIL GTalk Jabber   Вверх
QryStaL
Дата 21.11.2007, 15:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Я бы использовал для пошагового визарда TabControl со скрытыми закладками, тогда между ними просто перемещаться программно, и вся логика внутри одной формы.

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


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
ivashkanet
Дата 21.11.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(QryStaL @  21.11.2007,  15:06 Найти цитируемый пост)
использовал для пошагового визарда TabControl со скрытыми закладками, тогда между ними просто перемещаться программно, и вся логика внутри одной формы.

ИМХО, разница небольшая smile Панели, юзерконтролы, табконтрол.... суть примерно одна.

Цитата(QryStaL @  21.11.2007,  15:06 Найти цитируемый пост)
ivashkanet, посыпаю голову пеплом, просто случайно мышь съехала. Если бы знал как, удалил бы... 

Да фигня, это я так ;-)


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


Шустрый
*


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

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



QryStaL: пасиба, учту)
Тока, чего то я не нашёл visible для вкладок. Там другое свойство за это отвечает?

Это сообщение отредактировал(а) alver - 21.11.2007, 18:01
PM MAIL GTalk Jabber   Вверх
VisualProgrammerNET
Дата 23.11.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Да, кстати с табами получается очень грамотный GUI. Согласен на все 100%. А чтобы скрыть вкладки я обычно сверху табконтрола поверх этих вкладок леплю label, в который можно например засунуть название текущего табпэйджа =)))) 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
QryStaL
Дата 23.11.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



VisualProgrammerNET, я тоже так делал  smile Более изящного решения не нашел, но оно работает =)


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
AET
Дата 2.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



подскажите как можн чтобы веденое слово в textBox1 из формы1 вышел в загаловке формы2 зарание блогодарен
PM MAIL   Вверх
thomas
Дата 2.12.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



AET
 присвой значению свойства text второй формы(Form2.Text) значение свойства text текстбокса(TextBox1.Text) первой формы.
И будет тебе счастье.


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


Бывалый
*


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

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



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


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


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

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



AET
Код в студию.


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


Бывалый
*


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

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



вот форма3
Код
    namespace WindowsApplication1
{
    public partial class Form3 : Form
    {  public Form3()

        {
            InitializeComponent();
            
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы хотите выйти из модуля?", "Выход из модуля",
          MessageBoxButtons.YesNo, MessageBoxIcon.Question)
          == DialogResult.Yes)
            {
                Close();
            }

        }

        private void оПрограммеToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form4 f = new Form4();
            f.Show();
        }

        private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void видеоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5();
            f.Show();
        }

        private void программыToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5();
            f.Show();
        }

        private void заданиеToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5();
            f.Show();
        }

        private void тестToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form5 f = new Form5();
            f.Show();
        }

        private void officeWordToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            this Text = "TextBox1.Text";
        }
       
      }
    }  

а вот форма 2
[code] public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            this.TopMost = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
           {
                Form3 f = new Form3();
                f.Show(); this.Close();
                
            }
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
       } [\code]
PM MAIL   Вверх
Real
Дата 5.12.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: -1



 Чем отличаеться?
Код

Form EP = new ExtendedParams();
 EP.ShowDialog();

Код

Form EP = new ExtendedParams();
 EP.Show();

Код

Form EP = new Form();
 EP.Show();

Код

Form EP = new Form ();
 EP.ShowDialog();

PM   Вверх
mr.DUDA
Дата 19.12.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Real, ShowDialog отличается от Show тем что в первом случае форма показывается модально, т.е. блокирует другие формы приложения до тех пор пока эту форму не закроют. Остальные случаи - создание либо экземпляра своей формы (ExtendedParams) либо формы-"болванки" (Form), на которой ничего нет.


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 20.12.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Частично ответы по теме даны тут: http://forum.vingrad.ru/index.php?show_typ...howtopic=188004


--------------------
user posted image
PM MAIL WWW   Вверх
tht
Дата 23.12.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



отвечу сразу на первый вопрос темы.
есть Form1.cs, у нее есть Form1.Designer.cs в этом файле в конце есть список компонентов и контролов которые вставлены в форму. типа так 
Код

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;


если добавляете к проекту новую форму Form2, то у нее тоже есть Form2.Designer.cs
в конце которой тоже есть список объявлений типа 
Код

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;


что бы был доступ к переменным(контролам) второй формы(Form2)
нужно в этой второй форме (Form2.Designer.cs)обьявить переменные след. образом
Код

public System.Windows.Forms.TextBox textBox1;
public System.Windows.Forms.TextBox textBox2;
public System.Windows.Forms.TextBox textBox3;


а из первой формы вызывать их след. образом:
в форме Form1.cs допустим при нажатии на кнопку в этой форме
Код

    private void button1_Click(object sender,EventArgs e) {
      FormLoadData fr2 = new FormLoadData();
      fr2.textBox1.Text = "Hello !";
      fr2.ShowDialog();
    }

тоже самое ответил mr.DUDA только в сокращенном варианте. а я разъяснил более подробно.

Это сообщение отредактировал(а) tht - 23.12.2007, 11:15
PM MAIL   Вверх
kirillga
Дата 9.1.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться 
У меня есть например 1 форма
Form1
в ней объявлена переменная
Код

public int prov;

из неё вызываю Form2
Код

private void button1_Click(object sender, EventArgs e)
{
                    this.Hide();
                    Form1.ShowDialog();
}

Как теперь открыть Form1 не создовая новой форы тобишь чтобы все осталось как вводил во всех полях и передать в него значение prov????

можно конечно через Form1.Show(); но если форм 5 например то все значения таскать за собой надо будет.
PM   Вверх
mr.DUDA
Дата 9.1.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(kirillga @  9.1.2008,  13:06 Найти цитируемый пост)
Form1.ShowDialog();

совсем это не похоже на:

Цитата(kirillga @  9.1.2008,  13:06 Найти цитируемый пост)
из неё вызываю Form2




--------------------
user posted image
PM MAIL WWW   Вверх
Real
Дата 9.1.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: -1



2kirillga

Код

Form1 fm=new Form1();
this.Hide();
fm.Show();

PM   Вверх
cASSAndra
Дата 21.1.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



слушайте, тут делфисту без бутылки не обойтись  smile.   smile у меня есть форма, а в ней MDI окна. мне грубо говоря надо, чтобы на главной форме в ComboBox отражалось, в каком MDI окне я нахожусь.
  
Цитата

public System.Windows.Forms.ToolStripComboBox toolStripCmbBoxMode;

не помогает. пишет 
Цитата

An object reference is required for the nonstatic field, method, or property 'KMB_ExportData.MainForm.toolStripCmbBoxMode'

что делать то? Хелп, плиз smile 

PM MAIL   Вверх
Qhermit
Дата 30.3.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите ! У  меня такая проблема: в методе класса ImageProcClass.cs делаются преобзарования матрицы изображения ну эт неважно, мне нужно что бы из этого метода одна временая переменая записывалась на form1 в  textbox1 как это сделать?
PM MAIL   Вверх
mr.DUDA
Дата 31.3.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(Qhermit @  30.3.2008,  22:25 Найти цитируемый пост)
Помогите ! У  меня такая проблема: в методе класса ImageProcClass.cs делаются преобзарования матрицы изображения ну эт неважно, мне нужно что бы из этого метода одна временая переменая записывалась на form1 в  textbox1 как это сделать?

Проще всего так:
Код
            foreach (Form form in Application.OpenForms)
            {
                if (form is Form1)
                    ((Form1)form).textBox1.Text = "123";
            }

У текстбокса в свойствах выставить "Modifiers = Public".


--------------------
user posted image
PM MAIL WWW   Вверх
Qhermit
Дата 31.3.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA, спасибо большое  smile 
PM MAIL   Вверх
Qhermit
Дата 31.3.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA, а не подскажешь как сделать что бы при открытии главной формы ISO (запуска программы) данные грузились в textBox-ы неактивной формы form2

вот код где пишется в textBox-ы главной формы ISO при загрузки
Цитата

public ISO()
        {
            InitializeComponent();
            try
            {
                using (StreamReader sr = new StreamReader(@"H:\text.txt", Encoding.Default))
                {
                    string sFileText;
                    FileStream filestream = new FileStream(openFileDialog2.FileName, FileMode.OpenOrCreate, FileAccess.Read);
                    StreamReader streamreader = new StreamReader(filestream);
                    char[] chBuf = new char[filestream.Length];
                    streamreader.ReadBlock(chBuf, 0, (int)filestream.Length);
                    
                    textBox1.Text = sr.ReadLine();
                    textBox2.Text = sr.ReadLine();

                                     filestream.Close();
                    streamreader.Close();
                }
            }

            catch (Exception)
            {
                // обработка исключения  
            }
            
            
        }


Пробывал писать вместо
textBox1.Text = sr.ReadLine();
textBox1.Text = sr.ReadLine();

так 
Цитата

form2 f2 = new form2();
f2.textBox1.Text = sr.ReadLine(); 
f2.textBox2.Text = sr.ReadLine(); 


PM MAIL   Вверх
mr.DUDA
Дата 1.4.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(Qhermit @  31.3.2008,  21:42 Найти цитируемый пост)
Пробывал писать вместо

textBox1.Text = sr.ReadLine();
textBox1.Text = sr.ReadLine();
так

form2 f2 = new form2();
f2.textBox1.Text = sr.ReadLine(); 
f2.textBox2.Text = sr.ReadLine();
 


Это создаст новую форму form2. Если хочется создать и показать новую форму, нужно после "new" вызвать form2.Show()


--------------------
user posted image
PM MAIL WWW   Вверх
Qhermit
Дата 1.4.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mr.DUDA @  1.4.2008,  08:49 Найти цитируемый пост)
Это создаст новую форму form2. Если хочется создать и показать новую форму, нужно после "new" вызвать form2.Show() 

мне нужно что бы в форму form2 из файла записывались значения в textbox-ы которые потом в других классах я использую

а если так я делаю и потом просматриваю form2 то в ней значения которые я изначально выставил а не те которые в файле
поэтому вот это ничего не делает или хз
 
Цитата

form2 f2 = new form2();
f2.textBox1.Text = sr.ReadLine(); 
f2.textBox2.Text = sr.ReadLine();


PM MAIL   Вверх
PaZ1T1V
Дата 9.4.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Народ, я правильно пишу или нет ??? по4ему то ни4его не пашет ((( 

Код


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

        private void findToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            findForm findFrm = new findForm(this);
            findFrm.Show();
            if (findFrm.padding)
                label1.Text = findFrm.findBoxValue;           
        }
    }




и

Код


        public partial class findForm : Form
    {
        mainForm form1;

        public findForm(mainForm form)
        {
            InitializeComponent();
            this.form1 = form;               
        }

         private void findForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }

        public string findBoxValue = "";
        public bool padding = false;
                
        private void findBtn_Click(object sender, EventArgs e)
        {
            padding = true;
            findBoxValue = findBox.Text;
        }



по4ему при  нажатии кнопки зна4ения переменных меняются а в родительскую форму не передаются ??

поправил так, пришлось открыть richTextBox, все передается, то 4то мне надо дажже работает, но работает после того как я закрою форм2, мне етого не надо помогите плиз 


Код


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

        public string findBoxValue = "";   

        private void findToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            findForm findFrm = new findForm(this);
            findFrm.Show();                     
        }
    }

public partial class findForm : Form
    {
        mainForm form1;

        public findForm(mainForm form)
        {
            InitializeComponent();
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.FormClosing += new FormClosingEventHandler(findForm_FormClosing);
            this.form1 = form;               
        }

        private void findForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }
        
        public bool padding = false;      

        private void findBtn_Click(object sender, EventArgs e)
        {
            padding = true;
            form1.findBoxValue = findBox.Text;
            
            if (form1.findBoxValue.Length == 0)
                return;
            form1.richTextBox1.SelectionBackColor = Color.Transparent;
            int searchStart = 0;

            searchStart = form1.richTextBox1.Find(form1.findBoxValue, searchStart, RichTextBoxFinds.MatchCase);

            if (searchStart >= 0)
            {
                form1.richTextBox1.Select(searchStart, form1.findBoxValue.Length);
                form1.richTextBox1.SelectionBackColor = Color.Transparent;
            }
            else
                MessageBox.Show("По вашему запросу ничего не найдено!");
            ++searchStart;
        }         
    }



Это сообщение отредактировал(а) PaZ1T1V - 9.4.2008, 15:05
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ProgrammingLife
Дата 12.4.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 19.1.2008
Где: ЧИРЧИКАГО (UZ)

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



Всем Салют! Люди не мучайтесь делайте smile  Форму статик и все ништяк вот кодик smile 
Код

static class Program
    {
      [U]  [color=crimson]public static Form1 f1 = new Form1(); [/color][/U]
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
          //  Application.SetCompatibleTextRenderingDefault(false);//это Я незнаю что это выдвала ошибку 
//удалите или включите comentary т,е //
            Application.Run (f1);
      
        }



ФОРМЕ 2
Код

 private void button1_Click(object sender, EventArgs e)
        {
            Program.F1.label1.Text = textBox1.Text;
            Close();
        }

 smile 
КОМУ  ПОМОГ ? ПРИШЛИТЕ ПИСЬМА МНЕ ИНТЕРЕСНО Я СО СТАТИКОМ НЕ ПОЛЬЗОВАЛСЯ ОБЪЯСНИТЕ СКИНТЕ КОДИК С СОУЧАСТИЕМ КЛЮЧЕВОГО СЛОВА static 
PM MAIL ICQ   Вверх
Solely
Дата 16.4.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA - thanks!!
PM MAIL   Вверх
ivashkanet
Дата 16.4.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



ProgrammingLife, лучше научится правлиьно решать вопросы, а не просто решать.

Если уж хочешь статик, то лучше использовать Синглтон
PM MAIL WWW ICQ   Вверх
botusai
Дата 18.4.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 Paz1t1v
Попробуй так: напиши на главной форме метод (DoWork), который делает то, что у тебя сейчас делает твоя кнопка findBtn на findForm, а на событии Click этой кнопки вызывай этот новый метод (form1.DoWork())
PM MAIL   Вверх
ProgrammingLife
Дата 18.4.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 19.1.2008
Где: ЧИРЧИКАГО (UZ)

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



 smile  на словах не "флейвумуют" давай ка кодик Заранее сапсибо!!
PM MAIL ICQ   Вверх
botusai
Дата 19.4.2008, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот код
Код
public partial class mainForm : Form
    {
          public mainForm()
        {
            InitializeComponent();
        }
        public string findBoxValue = "";   
        private void findToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            findForm findFrm = new findForm(this);
            findFrm.Show();                     
        }

        public void DoWork(string text)
       {
            findBoxValue = text;
            
            if (findBoxValue.Length == 0)
                return;
            richTextBox1.SelectionBackColor = Color.Transparent;
            int searchStart = 0;
            searchStart = richTextBox1.Find(findBoxValue, searchStart, RichTextBoxFinds.MatchCase);
            if (searchStart >= 0)
            {
                richTextBox1.Select(searchStart, findBoxValue.Length);
                richTextBox1.SelectionBackColor = Color.Transparent;
            }
            else
                MessageBox.Show("По вашему запросу ничего не найдено!");
            ++searchStart;
            Refresh();
       }
    }
public partial class findForm : Form
    {
        mainForm form1;
        public findForm(mainForm form)
        {
            InitializeComponent();
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.FormClosing += new FormClosingEventHandler(findForm_FormClosing);
            this.form1 = form;               
        }
        private void findForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }
        
        public bool padding = false;      
        private void findBtn_Click(object sender, EventArgs e)
        {
            padding = true;
            form1.DoWork(findBox.Text)
        }         
    }


Это сообщение отредактировал(а) botusai - 19.4.2008, 07:28
PM MAIL   Вверх
CheFF
Дата 10.5.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тоже вопрос про доступ к форме и контролам.

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

Как же работать из класса с контролами на форме?
PM MAIL   Вверх
-Mikle-
Дата 10.5.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(CheFF @  11.5.2008,  01:52 Найти цитируемый пост)
Пробовал добавить через конструктор форму... но в классе через форму не удалось выйти на контролы на ней...


потому что контролы на форме private
задай internal или public (в зидайнере форм) свойству Modifiers тех контролов, доступ к которым ты хочешь получить из-вне. А на счет "поэлегантнее" - разных подходов сотни. Все зависит от задачи. Лично мне вообще на приходится прибегать к таким способам, типа "доступ к контролам формы из какого-то класса". Может у тебя и уникальная задача, но уверен, что решить ее можно правильно.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
CheFF
Дата 10.5.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



-Mikle-, хм... это я пробовал, вот только не знаю, как работать то в классе.
Создаю поле для указателя на форму:
Код

private Form F = new Form();

Через конструктор его туда пихаю. 

Теперь, допустим, я могу сменить заголовок через 
Код

F.Text = "";
 А вот как к контролам на форме работать не знаю. 
Код

F.TextBox1.Text = "";
 не работает(

Насчет "элегантности" - пишу подобие броузера. На главной форме лежит таб контрол, в который я добавляю вместо TabPage вкладок, вкладки моего класса, наследованные от табпейджа, который содержит в себе компонент WebBrowser. Так вот, у этого броузера есть несколько событий, которые описываются в этом классе.
Например, что бы он урл писал в заголовке, отображал процесс загрузки страницы в статус баре etc. Другого способа, как передавать через конструктор ему все эти контролы, а внутри уже менять их, я не нашел.


PM MAIL   Вверх
-Mikle-
Дата 11.5.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(CheFF @  11.5.2008,  02:49 Найти цитируемый пост)
Создаю поле для указателя на форму:

код C#
1:

private Form F = new Form();


А зачем ты:
1. вообще создаешь экземпляр вместо того, чтоб передавать this?
2. создаешь экземпляр базового класса для форм(в котором конечно же нет твоих контролов), вместо того чтоб создавать экземпляр твоей главной формы?

На заметку: метод FindForm() контрола (в том числе табпейджа) возвращает ссылку на форму, в которой находится контрол.

Элегантность:
Один из принципов, которого надо придерживаться создавая архитектуру своего приложения, это разделение задач по иерархии. То есть каждый класс занимается своими задачами со своими данными(свойствами). Каждый класс имеет право (но не обязан) знать все о тех классах, которые он использует, но не должен ничего знать о классах которые используют его. Если класс Х хочет взаимодействовать с классами, которые его используют, то класс Х должен взаимодействовать на максимально абстракном уровне, без необходимости знать что-либо о классах, которые используют его. К счастью, для решения таких задач, в .NET есть механизм событий и делегаты.

Итак, следуя этому принципу думаем: у нас есть форма, у формы есть ПрогресБар, ТабКонтрол и т.д., у ТабКонтрол есть ТабПейдж (ну или порожденный от него), а у ТабПейджа есть ВебБроузер. Таким образом форма стоит здесь в верху иерархии и это значит, что она имеет право знать обо всех классах, которые она использует, в том числе о твоем ТабПейдж и ВэбБроузер не нем. Мы не можем себе позволить того, чтобы что-либо самостоятельно меняло свойство класса, стоящего выше по иерархии, иначе был бы бардак: кнопка вдруг захотела поменять цвет фона у формы на красный, а ПрогрессБар - на синий, а сама форма при этом осталась бы в "шоке" от такого безобразия...

Исходя из этих убеждений, приходим к некоторым решениям:
1) Первый, самый простой вариант - это предоставить ссылку на WebBrowser в твоем порожденном пэйдже.
2) Второй - объявить нужные тебе события и свойства в твоем порожденном пейдже.

Форма должна сама подписываться на события броузера или пэйджа и отписываться от них когда выбирают другой пейдж. Также она сама должна устанавливать текст своего заголовка и менять значения СтатусБара и ПрогресБара, считывая значения свойств выбранного пейджа.
Иначе будет неизбежна ситуация, когда два твоих открытых ТабПейджа начнут на перебив менять значения свойств того же, например, ПрогресБара, что не есть гуд во всех смыслах.

Все, устал...  smile  Надеюсь тебе стал понятен этот подход... если что не ясно, пиши... бум объяснять дальше...  smile   


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
CheFF
Дата 11.5.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



-Mikle-, хех... ты первый, "кому не пофиг", который реально что-то объяснил... остальные все шлют в ртфм =)

Как у меня устроена программа - сложно объяснить на пальцах, я вот лучше кину ее код. Он ужасен, просто отвратителен, но все-таки я бы хотел сначала разобраться с тем, что есть, а потом уже переписывать по нормальному.

Про правильную архитектуру:
Саму концепцию правильного подхода я понял, вот только как ее реализовать не совсем понял, я такой человек, который без примеров очень сложно понимает. Можете подкинуть ссылочек по теме или подсказать, по каким темам искать? А то я в терминологии профан, потому и с поиском затруднения вечные =/



Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  WebNavigate.rar 107,31 Kb
PM MAIL   Вверх
-Mikle-
Дата 11.5.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Ну вот так, например, будет правильнее. Замечу что не идеально, но для понимания достаточно. Я подправил код и привел его в порядок.

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  WebNavigate.rar 457,93 Kb


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
CheFF
Дата 12.5.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Тут мне придется очень долго разбираться... Чувствую, что пока не перепишу - не вникну в саму суть, слишком много всего неопределенного.
PM MAIL   Вверх
ProgrammingLife
Дата 12.5.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 19.1.2008
Где: ЧИРЧИКАГО (UZ)

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



Надо стремиться! все получится  smile = smile 
PM MAIL ICQ   Вверх
CheFF
Дата 12.5.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ProgrammingLife @ 12.5.2008,  20:48)
Надо стремиться! все получится  smile = smile

Чувствуется мне нужно еще тучу кода прелопатить и своего понаписать, что бы быть  smile 

А практиковаться то особо и неначем. Все эти абстрактные задачи, вроде "переставить две переменные, без использования третьей" или "написать телефонную книгу с..." и тому подоное, очень угнетает :/
PM MAIL   Вверх
-Mikle-
Дата 12.5.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



 smile 

Цитата(CheFF @  13.5.2008,  02:10 Найти цитируемый пост)
А практиковаться то особо и неначем. Все эти абстрактные задачи, вроде "переставить две переменные, без использования третьей" или "написать телефонную книгу с..." и тому подоное, очень угнетает 


нет идей? продолжим:
1) написать подобие Vista Media Center
2) WinAmp с поддержкой сторонних скинов, плагинов, в том числе и визуальных
3) или хотя бы Tetris, у которого при помощи плагинов можно выбрать внешний вид, анимацию, правила перехода к новому уровню игры и вознаграждение за проход уровня, которое сможет быть почти любым

последнее сам когда-то делал, давно уже... и не доделал до конца... терпения не хватило...
 smile 


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DnV
Дата 9.6.2008, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По поводу темы обсуждения... Вообще говоря, для "дельфиста" ответ на самый первый пост темы (про аналог "uses ...") будет звучать как "partial class ..."  smile
Он просто смотрит на program.cs и думает, как из этого "модуля" увидеть другой smile Нужно время, чтобы понять, что мы говорим не о модулях, а о классах ;)

Это сообщение отредактировал(а) DnV - 9.6.2008, 10:09
PM MAIL   Вверх
xStorm
Дата 17.6.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Учусь писать на C# в VS08.
Просмотрел прошлые посты, помогли мне больше разобраться.
У меня следующая проблема:
Программа считывает данные с реестра, в зависимости от данных, программа на этапе старта должна немного изменить "чертежи" форм, а доступ к ним я получить никак не могу.
Как мне например с MainForm изменить данные "чертежа" других форм.
через класс я так понял можно обращаться, но нужно задать тип static у класа той формы,  данные на которой я хочу изменить. Но что-то оно не работает у меня. Сразу начинает ругаться на кучу других вещей внутри класса, типо везде static ставить надо, везде ставишь не работает тоже.

Помогите, как получить доступ к элементам "чертежей" всех моих других форм.

Может вопрос такой и рассматривался, но видимо его изложение мне не было понятно, спасибо
PM MAIL ICQ   Вверх
ProgrammingLife
Дата 21.6.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 19.1.2008
Где: ЧИРЧИКАГО (UZ)

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



Здарово ! xStorm ты работаешь над чертежами под компас что ли пишешь ??? Я НЕ СТАЛКИВАЛСЯ С ПРОБЛЕМОЙ С ЭТОЙ НО СОВЕТАЮ ТЕБЕ НАПИСАТЬ КОДИК ДА КТО НИ БУДЬ ОКЛИНКИТСЯ!
PM MAIL ICQ   Вверх
xStorm
Дата 27.6.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну коли не сталкивался, зачем писать-то  smile 
Термин "чертежи" до этого употребляли в теме.
Это, насколько я знаю, Те формы которые ещё не были созданы программой в процессе её выполнения, но хранятся в ней. Любая форма которую делаешь в редакторе является "чертежом" на основе которого строится форма при необходимости её показа.
Код

            Registration frmReg = new Registration();
            frmReg.StartPosition = FormStartPosition.CenterScreen;
            frmReg.ShowDialog();

Вот пример создания формы по четрежу.
Какой-то другой ког писать не вижу смысла, так как мне нужно знать не только в конкретном случае, но и во всех остальных я тоже должен понимать все это дело.
Вопрос остался преждний
Как мне с, допустим, начальной формы программы, обращаться и редактировать "чертежи" всех других форм?
PM MAIL ICQ   Вверх
ivashkanet
Дата 27.6.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(xStorm @  17.6.2008,  23:18 Найти цитируемый пост)
Как мне например с MainForm изменить данные "чертежа" других форм.

Так, чертеж это код и только он. Изменять его можно только во время написания кода. Т.е. до компиляции.

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

Поэтому сразу нужно приучить себя не обращаться к чертежу (классу) когда нам нужен конкретный экземпляр. Если нам нужно обратиться к конкретной форме ты должен иметь ссылку на нее и обращаться через нее (как эту ссылку передавать говорилось не раз в этой теме).
Единственное исключение -- это паттерн Одиночка
Суть такая: есть только один экземпляр созданный по чертежу, так как он один, то его можно вывести в "данные чертежа".
Получиться что-то типа:
Код

    public partial class Form1 : Form
    {
        private static Form1 _singleSnstance;
        /// <exception cref="InvalidOperationException">Обращение к объекту когда он еще не создан</exception>
        public static Form1 SingleInstance
        {
            get
            {
                if (_singleSnstance == null)
                    throw new InvalidOperationException("Сначало нужно создать экземпляр формы Form1");

                return _singleSnstance;
            }
        }

        /// <exception cref="InvalidOperationException">Попытка создания второго экземпляра формы</exception>
        public Form1()
        {
            InitializeComponent();

            if (_singleSnstance != null) // проверяем создавался ли экземпляр этой формы ранее
                throw new InvalidOperationException("Может быть создан только один экземпляр класса Form1");

            _singleSnstance = this; // регистрируем себя в данных чертежа
        }
    }




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


Эксперт
***


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

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



xStorm, "чертеж формы", который ты создаешь в дизайнере, превращается в последовательность строк в функции InitializeComponent. Отредактировать "на лету" код без хорошего знания языка не получится. Подойди к проблеме с другой стороны. Из главной формы уже после создания дочерней "по чертежу" описывай как именно та должна быть отображена. Вот твой же пример:
Код
            // создали новый экземляр формы "Registration". При создании выполнился код InitializeComponent - применился "чертеж из дизайнера"
            Registration frmReg = new Registration();
            // указали особенности поведения этого конкретного экземпляра - появиться в центре экрана
            frmReg.StartPosition = FormStartPosition.CenterScreen;
            // показали его пользователю
            frmReg.ShowDialog();
Т.е. явно раздели общее поведение и поведение, характерное для конкретного экземпляра.
З.Ы. Предлагаю запретить слово "чертеж" как неоднозначное и вводящее в заблуждение.
ivashkanet, за такой синглтон надо расстреливать :(


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


Опытный
**


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

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



Все по томуже вопросу, прочитал, прочитал но чтото не оч понял.
К примеру есть проект (1 форма + 1 доп. класс)
как можно в дополнительном классе написать напримерно вот так ?:
Код

Form1.richTextBox1.Text = "asdasd" + (a + b).ToString());


вот коды ост юнитов:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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


Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


воть... спасибо. Знаю что вопрос заезженный, но всеже.


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
wotker
Дата 5.7.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

 ...Form1.richTextBox1...

А так и нельзя писать
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Exai1e
Дата 5.7.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



wotker, я понимаю что тут так нельзя, но как сделать так чтобы можно было в дополнительном модуле обращаться к элементам формы ?
например в Delphi можно написать так:
Код

Form2.Edit1.Text := '';
//или
Название_модуля.Form2.Edit1.Text := '';



--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
wotker
Дата 5.7.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть класс
Код

class Form1
{
  ...
}


есть экземпляр - form1_.
обращаться к полю richTextBox1 можно только при помощи экземпляра (т.к. не помечено как static). 
Также richTextBox1 должно быть помечено атрибутом public

если эти 2 условия выполняются - пишешь:
Код

form1_.richTextBox1.text = "11";




--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Exai1e
Дата 5.7.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



wotker, Если обращаться в том же модуле где и описание класса, то все нормально. А если создать новый класс, и попробывать достучаться до формы, то нечего не получается.


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
wotker
Дата 5.7.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что ты понимаешь под модулем? В .net-е  это сборка в которой компилируется класс. 
Приведи пример где неработает.
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Exai1e
Дата 5.7.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



модуль - новый фаил класса (когда нажимаеш на проект правой кн мыши, add - class), вот если из него обращатся к форме Form1.RichEdti1.Text... то это не работает.


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
wotker
Дата 5.7.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

class Form1
{
    public RichTextBox richTextBox1;
    .... 
    private void Method1()
    {
        this.richTextBox1.Text = "11"; // или
        richTextBox1.Text = "11";
    }
}

class Class2
{
    public Method2(Form1 form_)
    {
        form_.richTextBox1.Text = "11";
    }
}

при этом  не важно в каких файлах определены классы 

Это сообщение отредактировал(а) wotker - 5.7.2008, 21:42
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Exai1e
Дата 5.7.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



например вот
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(frmMain = new Form1());
        }
    }
}


Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            //вот так можно
            richTextBox1.Text = "aaa";
        }
    }
}


Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    class Sum
    {
        public void SumCh(int a, int b)
        {
            //нельзя, а хотелось бы
            Form1.richTextBox1.Text = "dddd";
        }

    }
}


Добавлено через 2 минуты и 49 секунд
wotker, все вроде понял, спасибо.


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
wotker
Дата 5.7.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так не пойдет.
Если у тебя статическое (т-е класса) св-во/поле, то да.
В данном случае ты хочешь получить доступ к полю экзампляра класса.
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Jade
Дата 27.8.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



приветствую.
вопрос скорее всего неновый, но ответы на похожие или аналогичные совершенно непонятны для меня.
 
есть форма. на форме есть панель. на панели пикчербокс.
есть класс "картинка". в нем сама картинка типа bitmap, куча ее параметров и функций для работы с ними.
есть опен_файл_диалог, который открывает картинки.
у него на file_ok прописано создание объекта класса "картинка".

Код

public void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {   
            cImage myImage = new cImage(openFileDialog1.FileName);
         }


в конструкторе класса "картинка" мне необходимо в пикчербоксе (тот который на панеле формы) отобразить мой битмап.
---
я сделал в классе формы функцию

Код

public void loadface(string path)
        {
            pictureBox1.Load(path);
        }



но ее вызвать в конструкторе класса "картинка" нельзя.
расскажите пожалуйста как мне нужно поступить.
заранее спасибо.

Это сообщение отредактировал(а) Jade - 27.8.2008, 15:58
PM MAIL ICQ   Вверх
Moid
Дата 23.10.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема следующая:

Есть форма, на разных табах которой лежит 2 UserControl'а. Нужно при переходе на 2-ю вкладку заполнить данными конторолы этой вкладки. Сделать это нужно так, чтобы небыло завязанности на форму.

Решил сделать так:

Вызываю при переходе на квладку метод из класса Presenter'a метод, в который передаю свой "объект":
Код

public static void FillValue(IPlay play)
        {
            ParamEditor pe = new ParamEditor();
            pe.FillValues(play); //В юзерКонтроле заполняю контролы
        }


Код

В юзерКонтроле заполняю контролы:

Код

public void FillValues(IPlay play)
        {
            numericUpDownVolume.Value = play.Volume;
            checkBoxIsOn.Checked = play.IsOn;
        }  



В результате контролы пустые... Значения в них почемуто не зхаписываются, почему?


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Partizan
Дата 23.10.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Moid

Код

 ParamEditor pe = new ParamEditor();


Создавать новый объект наверно не стоит. Надо просто найти объект на вкладке и вызвать у него FillValues


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


Опытный
**


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

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



Partizan, каким образом его можно найти? Можно пример.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Partizan
Дата 23.10.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Moid, пробежаться по коллекции дочерних контролов на вкладке

TabPage.Controls


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


Опытный
**


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

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



Проблему решил так:

Передаю с формы ссылку на сонтрол:
Код

ParamEditorPresenter.FillValue(paramEditor1 ,new Play.Play(20, true));


В презентере:
Код

public static void FillValue(ParamEditor controlOwner, Play.IPlay play)
        {
            controlOwner.FillValues(play);
        }



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
v_enom
Дата 9.11.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я решил вот как:
требовалось: из формы MainForm вызвать форму ConnectForm через кнопку "Connect" в меню, а потом из формы ConnectForm  сделать видимой еще одну кнопку "File" меню в MainFrom (ранее была невидема)

делаем так: в файле главной формы mainForm (в которй потом будем что-то изменять из 2ой формы ConnectForm. Я делал Enabled кнопку "File" в menuStrip) делаем открытый метод public void FileToolStripEnabledChange(bool val)  
и "финт ушами" ввиде передачи во 2ую форму this (объекта первой формы mainForm)
Код


namespace USB_Locker
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            
        }       

        private void connectPartitioToolStripMenuItem_Click(object sender, EventArgs e)   // функция по клику на кнопку в меню вызывающая 2ую форму.
        {
            ConnectForm connectForm = new ConnectForm();
            connectForm.Show(this);                                                   // финт ушками, с передачей во 2ую форму  объекта формы первой, т.е. MainForm.
        }

        public void FileToolStripEnabledChange(bool val)    // вот тот самый метод, который будет вносить изменения через 2ую форму.
        {
            this.fileToolStripMenuItem.Enabled = val;           // this -  это текущая форма MainForm, а  fileToolStripMenuItem - нужный мне компонент.
        }

}


 а во второй форме, которая будет что-то менять по нажатию кнопки делаем следующее:
Код


namespace USB_Locker 
{
     partial class ConnectForm : Form   // вторая форма. она вносит изменения в первую.
    {
        public ConnectForm()
        {
            InitializeComponent();
        }

private void ConnectBtn_Click(object sender, EventArgs e)                         // функция по клику на кнопку  делает  FileToolStripEnabled = true  (то что надо)
        {
            
            MainForm mainForm2 = this.Owner as MainForm;     // вот эта штука позволяет использовать mainForm2 как тот самый this (MainForm) и изменять нужную форму
            mainForm2.FileToolStripEnabledChange(true);       // тут просто вызываем паблик метод.
            Close();
        }


по-другому у меня не получилось. просто сделать public - все равно выдает ошибку доступа.

Добавлено @ 01:10
P.S. Для тех, кто переходит с Delphi или, как я, с Builder - реально непонятно и неинтуитивно.

Это сообщение отредактировал(а) v_enom - 9.11.2008, 01:12
PM MAIL   Вверх
Rififi
Дата 9.11.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



v_enom
делай взаимодействие между формами через эвенты

Код

private void connectPartitioToolStripMenuItem_Click(object sender, EventArgs e)   // функция по клику на кнопку в меню вызывающая 2ую форму.
{
    ConnectForm connectForm = new ConnectForm();
    connectForm.Action += ActionHandler;
    connectForm.Show();
}

void ActionHandler(object sender, EventArgs e)
{
    // Включаешь кнопку
}



В форме ConnectForm

Код

...
// Объявление эвента
public event EventHandler<EventArgs> Action;
...
// Инициализация
Action += delegate {};
...
// Использование
private void ConnectBtn_Click(object sender, EventArgs e)                         // функция по клику на кнопку  делает  FileToolStripEnabled = true  (то что надо)
{
    Action(this, EventArgs.Empty);
    Close();
}

PM MAIL   Вверх
DarkASU
Дата 16.11.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А такой вопросик в дочерней форме есть строка коннекта к серверу как передать в основную что коннект прошел успешно. И работать далее из основной формы под зарегистрированым юзером.
PM MAIL   Вверх
EgoBrain
Дата 17.11.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DarkASU @ 16.11.2008,  10:50)
А такой вопросик в дочерней форме есть строка коннекта к серверу как передать в основную что коннект прошел успешно. И работать далее из основной формы под зарегистрированым юзером.

Код

namespace ConnectionProgramm
{
class partial Form1 : Form
{
   ...
   public static bool Con = false;
   public static Connection ConnectionVairable = new Connection(xxx);
   ...
}

class partial Form2 : Form
{
   ...
   try
   {
      Form1.ConnectionVairable.Open();
      Form1.Con = true;
   }
   catch
   {
      Form1.Con = false;
   }
}
}


PM MAIL ICQ Skype   Вверх
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   Вверх
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   Вверх
surfrider
Дата 11.8.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



KelTron, спасибо, довольно хитро, но есть ли еще какие-нибудь варианты?
PM MAIL   Вверх
Georgich
Дата 4.11.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приветствую.

А я все никак не могу понять, как обратиться из второй формы к dataGridView1 на первой. Мне необходимо по нажатию на кнопке на второй форме добавить данные из textBox и comboBox в dataGridView1 на первой форме.

Вторую форму я вызываю так:
Код

        private void добавитьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Add2DB add2db = new Add2DB();
            add2db.ShowDialog();
        }

Собственно, а что надо сделать во второй форме? Спасибо.
PM MAIL   Вверх
lukan2
Дата 13.12.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



surfrider Как вариант: имеется две формы Form1 и Form2. На первой поле textBox1 и одна кнопка. В поле textBox1 вписываем строку и по нажатии кнопки открывается вторая форма, где имеется только одно поле textBox1, в котором и появляется текст из textBox1 первой формы. 

Для всего этого необходимо во второй форме (файл Form2.h) изменить конструктор следующим образом для передачи в него данных:
Код

public:
        Form2(String^ data)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            //
            this->data = data;
        }
        String^ data;


Далее в файле Form1.h , там где необходимо, написать следующие строки кода:
Код

Form2^ f = gcnew Form2(this->textBox1->Text); // передача во 2-ую форму из первой содержимого textBox1->Text первой формы
f->ShowDialog();

Так можно передать любой тип данных, но только из более ранней формы в более позднюю. Нужно лишь немного тогда изменить конструктор!

Это сообщение отредактировал(а) lukan2 - 14.12.2010, 00:58
PM MAIL   Вверх
Nikosss
Дата 3.2.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте,
 есть форма Form1, на ней несколько Label'ов. При нажатии курсором на один из Label'ов появляется форма frmPopUp. На этой форме есть Label, текст которого при нажатии на него, нужно вставить в текст Label'a, который вызвал форму frmPopUp. Обработчики событий:
Код

        public void Label_Click(object sender, System.EventArgs e)
        {

            Control label = (Control)sender;
            AddPopUpForm(); // метод вызывает форму frmPopUp
        }

        public void frmPopUp_Label_Click(object sender, System.EventArgs e)
        {
            Control label1 = (Control)sender;
            label.Text = label1.Text; // -->?
            
        }


Я не знаю как обратиться к Label'у, который вызывает форму frmPopUp и передать ему текст с Label'a, нажатого на форме frmPopUp
PM MAIL   Вверх
Nikosss
Дата 3.2.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте,
 есть форма Form1, на ней несколько Label'ов. При нажатии курсором на один из Label'ов появляется форма frmPopUp. На этой форме есть Label, текст которого при нажатии на него, нужно вставить в текст Label'a, который вызвал форму frmPopUp. Обработчики событий:
Код

        public void Label_Click(object sender, System.EventArgs e)
        {

            Control label = (Control)sender;
            AddPopUpForm(); // метод вызывает форму frmPopUp
        }

        public void frmPopUp_Label_Click(object sender, System.EventArgs e)
        {
            Control label1 = (Control)sender;
            label.Text = label1.Text; // -->?
            
        }


Я не знаю как обратиться к Label'у, который вызывает форму frmPopUp и передать ему текст с Label'a, нажатого на форме frmPopUp
PM MAIL   Вверх
Страницы: (14) [Все] 1 2 3 ... Последняя »
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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