@Kiram

Как организовать взаимодейтсвие двух форм ввода данных с третьей формой-справочником?

Добрый день.
Как организовать взаимодействие между формами? Есть форма ввода (2) и форма редактирования (1). Так же есть 3 форма справочник. Как организовать взаимодействие между формами 1 и 3 и формами 2 и 3.
Код на формах:
//код с формы 1 событие на двойной клик по полю
		private void tbCodeStreet_DoubleClick(object sender, EventArgs e)
        {            
            frmSprStreet form = new frmSprStreet(); //создаем форму населенные пункты
            form.btnSelectZero.Visible = true;          //Отображаем кнопки "Выбор 0" и "Выбор" на форме населенные пункты
            form.btnSelect.Visible = true;
            form.ShowDialog(this);  //показать модельно форму населенные пункты
        }

		//код с формы 3 справочника. событие на нажатие по кнопки выбор.
		private void btnSelect_Click(object sender, EventArgs e)
        {
            //написать код для передачи данных из формы населенные пункты на форму вызвашую 
            frmLScheta frm = this.Owner as frmLScheta;
            //frm = this.Owner
            frm.tbCodeStreet.Text = dgvStreet.CurrentRow.Cells[0].Value.ToString();            
            frm.tbStreet.Text = dgvStreet.CurrentRow.Cells[1].Value.ToString();
            this.Close();
        }
		
		//код с формы 3 справочника. событие на нажатие по кнопки выбор.
        private void btnSelectZero_Click(object sender, EventArgs e)
        {
            //написать код для передачи "пустых данных" из формы населенные пункты на форму вызвашую
            frmLScheta frm = this.Owner as frmLScheta;
            frm.tbCodeStreet.Text = "";
            frm.tbStreet.Text = "";
            this.Close();
        }


Но это между 1 и 3 формами код. Как его изменить чтоб он работал с между 2 и 3 формами? Гуглил, но решения находил только на 2 формы. А как связать 3 так и не разобрался.

5d8c44a912183057641476.jpeg
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
по фрагментам:
1 - тут вы создаете форму в локальной переменной form и отображаете как диалог. модально кстати, а не модельно.. если слово смущает, просто нагуглите модальное окно ))
2 и 3 - финт с var frm = this.Owner; избавляет от незнания переменной, указывающей на экземпляр класса. но именно тут и возникает ваша проблема

решения:
- попробуйте рассматривать переменные главного окна, как глобальные, по отношению ко всем порождаемым окнам/диалогам. тогда можно применить другой финт - описать в классе главного окна (здесь видимо frmLScheta) поля форм нужных типов (допустим frmSprStreet SprStreet). и пользоваться ими вместо локальных переменных. получится что то вроде
var frm = (this.Owner as frmLScheta).SprStreet;
но такой прием требует обязательной проверки на SprStreet на null
- более классический прием состоит в создании своего конструктора для дочерних форм (да вообще чего угодно), куда можно передавать и нормально типизированное значение главной формы, и сколь угодное количество смежных форм. естественно в классе должны быть предусмотрены соответствующие типизированные поля, куда конструктор и сохраняет эти значения (указатели по существу). проверка на null так же обязательна. ее можно выполнять в конструкторе, но надежнее в каждом методе, где такой указатель используется.

ps

1 - слышали понятие best practices?.. так во у вас bad practices.. попробуйте открыть 2 экземпляра frmSprStreet и работать параллельно. ну и быстро все поймете
2
Ничего не понял
выходит лукавите. поняли, но не очень удачно. при этом удаляете свой камент. да еще и медальку вешаете себе - тройное лукавство. фу
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Kiram Автор вопроса
Решил сам проблему.
Создал глобальную переменную в модуле Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinApplication
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false); 
            Application.Run(new FrmAuthorization());
        }
        public static string MyIndex;
        public static string MyIndexStr;
    }
}

далее на форме 1 и 2 вставил код вызова на двойной клик по текстовому полю
private void tbCodeStreet_DoubleClick(object sender, EventArgs e)
        {            
            frmSprStreet form = new frmSprStreet(); //создаем форму населенные пункты
            form.btnSelectZero.Visible = true; //Отображаем кнопки "Выбор 0" и "Выбор" на форме населенные пункты
            form.btnSelect.Visible = true;
            form.ShowDialog();  //показать модельно форму населенные пункты
            tbCodeStreet.Text = ABELS_SQL.Program.MyIndex;
            tbStreet.Text = ABELS_SQL.Program.MyIndexStr;
            ABELS_SQL.Program.MyIndex = "";
            ABELS_SQL.Program.MyIndexStr = "";
        }

и на форме 3 справочнике на кнопки "Выбор 0" (пустого значения) и "Выбор" сделал так:
private void btnSelect_Click(object sender, EventArgs e)
        {
            //Код для передачи данных из формы населенные пункты на форму вызвашую 
            ABELS_SQL.Program.MyIndex = dgvStreet.CurrentRow.Cells[0].Value.ToString();
            ABELS_SQL.Program.MyIndexStr = dgvStreet.CurrentRow.Cells[1].Value.ToString();
            this.Close();
        }

        private void btnSelectZero_Click(object sender, EventArgs e)
        {
            //Код для передачи "пустых данных" из формы населенные пункты на форму вызвашую
            ABELS_SQL.Program.MyIndex = "";
            ABELS_SQL.Program.MyIndexStr = "";
            this.Close();
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы