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

Поиск:

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

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


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

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


 




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


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

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