Передача данных из одной формы в другую

Здраствуйте! У меня возникла следующая проблема: есть две формы, одна основная, на которой находится DataGridView для отображения данных. По нажатию кнопки "Добавить" на этой форме появляется вторая форма, на которой находятся TextBox-ы. Так вото вопрос в следующем: Как передать данные со второй формы в первую? Так как в на первой форме у меня уже сть строка подключения к БД и там я хочу добавить данные в БД. Или если это неудачное решение, то можно ли как нибудь из первой формы выудить строку подключения к БД и соответственно уже в ней написать аксесс к БД и добавить в нее данные? Заранее спасибо!
13 ответов

FAQ пункт 2.


Спасибо!


Заранее прошу на FAQ не отсылать я его читал. Нужно передать значение из Form1 по нажатии на лэйбл в лэйбл формы2 В форме 2 создаю делегата
public delegate void MyLabelClickedHandler(string text);
                public MyLabelClickedHandler LabelText;
В форме 1 создаю метод вычисляющий значение
        void Relation_RtoS(string text)
            {
                ****** RdivideS, Rpunch, Weight;
                Weight = ******.Parse( textBox2.Text );
                Rpunch = ******.Parse( textBox1.Text );
                RdivideS = Rpunch / Weight;
                Label myLabel = new Label();
                myLabel.Text = "R/S=" + RdivideS;
            }
и обработчик для лэйбла
        private void label12_Click( object sender, EventArgs e )
            {
            Form2 form2 = new Form2();
            form2.LabelText = new Form2.MyLabelClickedHandler(Relation_RtoS);
            form2.ShowDialog();
            }
в форме 2 создаю обработчик
        private void Form2_Load( object sender, EventArgs e )
            {
                label2.Text = ;\\как присвоить значение?????????????????????????
            }
что я делаю не так???


полная билиберда, зачет тут делегаты, если ты по нажатию создаешь экземляр второй формы.
  private void label1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.label1.Text = label1.Text;
            f2.ShowDialog();
 
        }
предварительно установи на label во второй форме свойство modifers в public


Делегаты для того чтобы не делать label публичным. Я только начинаю учиться, и везде читаю что делать объекты публичными не правильно. Разве нельзя сделать это без присвоения label публичности.


чтобы не делать label публичным
для этого можно воспользоваться свойствами. Почитай все-таки Ответы на 7 самых частых вопросов по WinForms, там все подробно расписано.


Из FAQ по формам. хочу всё таки разобраться с делегатами
2.7.1 Передача метода в конструктор Создаем в основном namespace делегат Код C#1
public delegate void MyDelegate(string data);
В Form1 создаем метод, который будет обрабатывать принятые данные Код C#1
2
3
4   void func(string param)
{
    // обработка
}
Создаем вторую форму так: Код C#1
2   Form2 f = new Form2(new MyDelegate(GetData));
f.ShowDialog();
При этом изменяем конструктор второй формы, чтобы он принимал делегат Код C#1
2
3
4
5
6   MyDelegate d;
public Form2(MyDelegate sender)
{
    InitializeComponent();
    d= sender;
}
И в любой момент отправляем данные Код C#1
d(textBox1.Text);
Тут описывается, как я понял, передача данных из Form2 в Form1!? Это я реализовал. Но вот, как это не смешно выглядит, из Form1 в Form2 передать не могу. По примеру: "В Form1 создаём метод который будет обрабатывать принятые данные" тоесть если мне надо принять данные в Form2 то этот метод я создаю во второй форме? Далее я вообще с трудом понимаю. Нужно ли мне создавать в первой форме экземпляр второй формы? И что и где мне вообще нужно создавать?Пожалуйста разъясните, в голове полная "каша".И ещё основная проблемма в понимании сего состоит в том, что мне нужно предать не текст из одного лэйбла в другой, а результат вычисления значений. Тоесть нужно взять данные из первой формы а результат их сложения, деления и т.п. передать в лэйбл второй формы.


Ну хоть убей, не въезжаю. Как передать результат из метода формы1:
void Relation_RtoS(string text)
            {
                ****** RdivideS, Rpunch, Weight;
                Weight = ******.Parse( textBox2.Text );
                Rpunch = ******.Parse( textBox1.Text );
                RdivideS = Rpunch / Weight;
            }
в лэйбл формы 2.


Тебе 3 раза показали FAQ с советами как это сделать Показываю метод передачи данных из родительской в дочернюю форму через свойства на первой форме пишешь:
Form2 f2 = new Form2();
 
        private void button1_Click(object sender, EventArgs e)
        {
            f2.LabelText = "heohtraerhaqregja";
        }
на второй пишешь свойство:
public string LabelText
        {
            get { return label1.Text; }
            set { label1.Text = value; }
        }


C FAQ я разобрался и написал что проблемма передать данные из метода который я привёл
void Relation_RtoS()
            {
                ****** RdivideS, Rpunch, Weight;
                Weight = ******.Parse( textBox2.Text );
                Rpunch = ******.Parse( textBox1.Text );
                RdivideS = Rpunch / Weight;
            }
в лэйбл. конкретизирую: приведеный мной метод получает значение типа ******, а лэйбл принимает string. Я могу передать текст из label1 формы1 в label1 формы2, а как если в форме1- label1 не существует. Тоесть в форме1 происходят вычисления, а результат этих вычислений надо преобразовать в текст и передать в label формы2. Надеюсь что вы поймёте о чём я прошу.


Вот что у меня получилось
 private void label12_Click( object sender, EventArgs e )
            {
            Form2 form2 = new Form2();
            form2.MyLabelClicked += new MyLabelClickedHandler(form2_MyLabelClicked);
            form2.form2_LabelText("текст");
            form2.ShowDialog();
            }
слово "текст" передаётся, а вот при попытке предать значение вычисляемое в методе не удаётся. Ругается на то, что невозможно преобразовать ****** в string. Что можно сделать?


Всё вопрос снимаю- разобрался. Урррра!!!!!!!


Вот еще прикольный способ передачи данных... В классе Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
       // public static Form2 f2;
        public static Form1 f1; //Создаем экземпляр класса Form1
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Инциализируем :)
            Application.Run(f1 = new Form1());
          
        }
    }
}
И теперь можно обратиться к f1 (к Form1) из любого места
Program.f1.rich1.Text = this.textBox1.Text;