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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к объекту другой формы, очень часто задаваемый вопрос 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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