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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к объекту другой формы, очень часто задаваемый вопрос 
V
    Опции темы
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   Вверх
LRC
Дата 2.3.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Здравствуйте,
 есть форма Form1, на ней несколько Label'ов. При нажатии курсором на один из Label'ов появляется форма frmPopUp. На этой форме есть Label, текст которого при нажатии на него, нужно вставить в текст Label'a, который вызвал форму frmPopUp. Обработчики событий:код C#
          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


Вот решение

public partial class frmPopUp : Form
    {
        private static Label l=new Label();
        public frmPopUp()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {
            l.Text = label1.Text;
        }

        public static Label GetSetLabel
        {
            get { return l; }
            set { l = value; }
        }
    }

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

        private void label1_Click(object sender, EventArgs e)
        {
            frmPopUp f = new frmPopUp();
            frmPopUp.GetSetLabel = (Label)label1;
            f.Show();
        }
}


Это сообщение отредактировал(а) LRC - 2.3.2011, 12:36
PM MAIL ICQ   Вверх
ASkripko
Дата 30.3.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Люди добрые) помогите, чем сможете) а то, честно признаюсь, уже задолбался и все перепробовал

Дело такое.
Есть форма - контейнер, в ней еще 2 формы: в 1-ой производится расчет и построение графиков, во 2-ой нужно в гридбокс вывести данные.
Проблема в том, что переменные 1-ой формы не видны из 2-ой, хотя они паблик, более того, если прописывать методы на вывод этих данных (просто банально return) они тоже ничего не выводят. Обращаюсь так:
Form1 F1 = new Form1();
int a = F1.data, где data public переменная

В результате ничего - все переменные видны (в меню интелленсе при написании F1. ) но получить получается только те переменные, которые объявлены в инициализации самой формы.

Буду оч признателен, если поможете
PM MAIL   Вверх
Vezd
Дата 21.6.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я создал UserControl1.cs.  Но возникли некоторые проблемы с передачей значений из Form1 в UserControl1:

Код

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 bred4
    {
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            UserControl1 fff = new UserControl1();
            UserControl1.A_set = 6;
            UserControl1.B_set = 3;
            fff.Am();
        }
    }
    }

И код в UserControl:
Код

using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
 
    namespace bred4
    {
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        static float a, b; 
        float c;
        private void UserControl1_Load(object sender, EventArgs e)
        {
        }
        public static float A_set
        {
            set { a = value; }
        }
        public static float B_set
        {
            set { b = value; }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            c = a + b;
           label1.Text = c.ToString();
        }
        public void Am()
      {
             c = a + b;
            label1.Text = c.ToString();
      }
    }
    }

При использовании метода button1_Click() и нажатии на кнопку результат получается правильный .А при использовании метода Am()(если кнопку не нажимать) никакого результата не получается. В чем здесь проблема и как это исправить?


Это сообщение отредактировал(а) Vezd - 21.6.2011, 10:57
PM MAIL   Вверх
Hajime
Дата 5.10.2011, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток уважаемые про! Прочитал всю тему ,но столкнулся с проблемой...

Суть проблемы :

Имеется UserControl1 , UserControl2 , Form1 на UserControl1 размещены TextBox1и Button1 , на UserControl2 тоже TextBox1и Button1 . UserControl2  помещена на Form1. По Button1 на UserControl1 вызывается форма с UserControl2. Как передать значения с TextBox1 на UserControl2 в TextBox1 на UserControl1 , если на UserControl2  пользователь обязан нажать на кнопку?

Заранее благодарен!

Это сообщение отредактировал(а) Hajime - 5.10.2011, 09:14
PM MAIL   Вверх
Allen
Дата 12.1.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Очень нужна помощь. у меня есть форма на ней 1 кнопка и текст бокс. как мне передать значение из текст бокса на кнопку. т.е чтобы после ввода в текст бокс текста этот текст передавался на кнопку?
Заранее спасибо
PM MAIL   Вверх
ayala80
  Дата 22.1.2012, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



можно и устновить винду.... 
PM MAIL   Вверх
GOSTT
Дата 21.5.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

1. невозможность обратиться к свойствам передаваемого элемента управления через класс Object
2. проблему выше решил использованием временной переменой, но так можно настроить только классы, методы все равно недоступны
3. я не знаю можно ли передать в функцию неопределенное количество (без жесткого указания) элементов

Код:
Код

 private void pvConfigElementUniv(object o_element, st_params st_param) 
        {
            // ComboBox, Label, Button, TextBox, CheckBox
            this.labelChek.Text = o_element.GetType().Name;
            string s_type = o_element.GetType ().Name;

            switch (s_type) 
            {
                case "ComboBox":
                    ComboBox CB_temp = (ComboBox) o_element;
                    // Enable, Visible
                    if (st_param.i_Enable != (int) e_stat.NULL) CB_temp.Enabled = pbStatAnalize(st_param.i_Enable);
                    if (st_param.i_Visible != (int) e_stat.NULL) CB_temp.Visible = pbStatAnalize (st_param.i_Visible);
                    o_element = CB_temp;
                    break;
                case "TextBox":
                    TextBox TB_temp = (TextBox) o_element;
                    // Enable, Visible, ReadOnly
                    if (st_param.i_Enable != (int) e_stat.NULL) TB_temp.Enabled = pbStatAnalize(st_param.i_Enable);
                    if (st_param.i_Visible != (int) e_stat.NULL) TB_temp.Visible = pbStatAnalize (st_param.i_Visible);
                    if (st_param.i_ReadOnly != (int) e_stat.NULL) TB_temp.ReadOnly = pbStatAnalize (st_param.i_ReadOnly);
                    o_element = TB_temp;
                    break;
                    ...
                 }// switch(s_type)
 }// private void pvConfigElementUniv(object o_element)


В функцию передаются:
1. элемент управления WindowsForms (button, textbox, ...)
2. экземпляр структуры st_params (набор int`ов, обрабатываемый pbStatAnalize и возвращающий соответствующее значение в свойство элемента)
3. e_stat - enum структура для большей наглядности кода

Хотелось бы убрать switch - привязку к типу (напрямую обращаться к свойствам элемента,  вызывать методы), передавать в функцию набор разных элементов и их настроек, в общем, сделать функцию действительно универсальной
PM MAIL   Вверх
EgoBrain
Дата 10.6.2013, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GOSTT @  21.5.2012,  11:30 Найти цитируемый пост)
я не знаю можно ли передать в функцию неопределенное количество (без жесткого указания) элементов

ArrayList в помощь


Цитата(GOSTT @  21.5.2012,  11:30 Найти цитируемый пост)
Хотелось бы убрать switch - привязку к типу (напрямую обращаться к свойствам элемента,  вызывать методы), передавать в функцию набор разных элементов и их настроек, в общем, сделать функцию действительно универсальной 

Передавай тип базового класса, от которого наследуются элементы, например, Control и дальше пошло поехало (преобразование типа, вызов базовых методов). Но если обращаешься к перегруженным или новым атрибутам/методам, то без проверки типа всё равно не обойтись.
PM MAIL ICQ Skype   Вверх
ZyevArtem
Дата 7.4.2017, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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

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# по-умолчанию защищенные

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

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


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

Фроде фисё ;-)  
P.S. В нашем полку прибыло?  smile Добро пожаловать ;-)  
P.P.S. Код писал по памяти, так что мог где-нить накосячить с синтаксисом  smile

Спасибо за инфу) с токой же проблемой столкнулся
PM MAIL WWW   Вверх
semashuk
Дата 5.1.2019, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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


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

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


 




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


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

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