Связь между двумя формами C # - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть три формы, основная форма, которую она вызывает Form2, а Form2 имеет Form3 в качестве конструктора и то же самое для Form3 (конструктор Form2).

На самом деле, я пытаюсьпоместить информацию о Form3 в Form2.

У меня есть DataGridView с информацией (Form2), и я хочу разместить информацию при открытии Form3 в текстовых полях.

Я могу сделатьэто, но я также хочу, открывая форму Form3, отправляющую информацию в форму Form2, чтобы создать новую строку в моем DataGridView (Form2) после закрытия формы 3.

в моей основной форме:

        private void btn_gestCapteur_Click(object sender, EventArgs e)
        {
            FormGestionCapteurs fGesCapt;
            fGesCapt = new FormGestionCapteurs();

            FormGestionCapteurs fGestCapt;
            fGestCapt = new FormGestionCapteurs(fConfRes, new FormAjoutCapteur(fConfRes,fGesCapt));
            fGestCapt.ShowDialog();
        }

В моем Form1, который называется FormGestionCapteurs:

        FormAjoutCapteur fAddCpt;

        FormConfigReseau fConfRes;

        public FormGestionCapteurs(FormConfigReseau fConfRes, FormAjoutCapteur fAddCpt)
        {
            InitializeComponent();

            this.fConfRes = fConfRes;

            this.fAddCpt = fAddCpt;
        }

        public FormGestionCapteurs()
        {
            InitializeComponent();
        }

В моем Form3, который называется FormAjoutCapteurs:

        FormGestionCapteurs fGest;

        FormConfigReseau fConfRes;

        public FormAjoutCapteur(FormConfigReseau fConfRes, FormGestionCapteurs fGest)
        {
            InitializeComponent();

            this.fConfRes = fConfRes;

            this.fGest = fGest;
        }

        private void btn_ok_Click(object sender, EventArgs e)
        {
         DataGridViewRow row = (DataGridViewRow)fGest.tab_listeCapteurs.Rows[0].Clone(); //fGest. is the Form2 and tab_listeCapteurs is the DataGridView
                    row.Cells[0].Value = txtBox_name.Text; //These textboxes aren't empty so I want to send the text of these in the good cells of my DataGridView
                    row.Cells[1].Value = txtBox_marque.Text;
                    row.Cells[2].Value = txtBox_model.Text;
                    row.Cells[3].Value = numUpDown_calibre.Value;
                    row.Cells[4].Value = txtBox_a.Text;
                    row.Cells[5].Value = txtBox_b.Text;
                    fGest.tab_listeCapteurs.Rows.Add(row);
                    //This code doesn't effect
        }

, я могу отправить информацию о DataGridView в Form3, но когда я хочу создатьновая строка в Form2 после закрытия Form3 не вставляет строку.

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Быстрый ответ, см. Комментарии внутри кода.но он выглядит "Form1" в бесполезном для вашего вопроса.

public partial class Form2 : Form
{
    //No need to use constructor, this is good for a frequently open/close child form.
    private readonly FormAjoutCapteur formAjoutCapteur = new FormAjoutCapteur();

    public Form2()
    {
        InitializeComponent();

        formAjoutCapteur.FormClosed += FormAjoutCapteur_FormClosed; //this is simplest way to get inputs
        //formAjoutCapteur.BtnOK.Click += FormAjoutCapteur_BtnOK_Click; //this require the button's "Modifiers" must be "Public"
    }

    private void FormAjoutCapteur_FormClosed(object sender, FormClosedEventArgs e)
    {
        var text = formAjoutCapteur.textBoxInput.Text;//you can simply change the input "modifiers" as "public"
        //var obj = formAjoutCapteur.GetInputs(); // you can make a public method to return all input into an object, which is recommended.

        //add your row
        this.dataGridView1.Rows.Add(new DataGridViewRow());
    }

    private void BtnGestionCapteurs_Click(object sender, EventArgs e)
    {
        formAjoutCapteur.ShowDialog(this);
    }
}
0 голосов
/ 22 апреля 2019

Я думаю, что у вас есть мастер / деталь формы ситуации..NET Framework имеет много встроенных функций для решения подобных задач.Я действительно не понимаю деталей запроса, так что это может быть весьма полезно для вас.Я также предлагаю вам прочитать книгу или взять урок по связыванию данных, поскольку это сделает вашу жизнь намного проще, чем ручное обновление текстового поля с помощью текстового поля и перемещение данных вручную.

Часть A - Общий вид

Сначала создайте модель данных для представления каждой строки в вашей сетке данных.Из проводки я предположил следующую модель данных:

/// <summary>
/// Defines a Capteurs
/// </summary>
public class Capteurs : ICloneable
{
    public Capteurs()
    {
        this.Name=  string.Empty;
        this.Marque=  string.Empty;
        this.Model=  string.Empty;
        this.Calibre=  0;
        this.A=  string.Empty;
        this.B=  string.Empty;
    }
    public Capteurs(Capteurs other)
    {
        this.Name = other.Name;
        this.Marque = other.Marque;
        this.Model = other.Model;
        this.Calibre= other.Calibre;
        this.A=other.A;
        this.B=other.B; 
    }

    public string Name { get; set; }
    public string Marque { get; set; }
    public string Model { get; set; }
    public int Calibre { get; set; }
    public string A { get; set; }
    public string B { get; set; }

    #region ICloneable Members
    public Capteurs Clone() => new Capteurs(this);
    object ICloneable.Clone() => Clone();
    #endregion

}

Заметил, что я реализовал ICloneable, чтобы делать копии данных, чтобы не мешать в основном списке, если я не хочу.

Затем я добавил источник данных в проект на основе этого класса

add data source

В главной форме содержится DataGridView, чтобы показать все данные, которыесвязан с источником данных

data link

Теперь, когда форма загружается, я добавляю данные в источник данных с помощью capteursBindingSource.DataSource = list; и в списке элементов отображаетсявверх в мастер-форме.

master form

Добавьте следующие свойства в мастер-форму, чтобы иметь доступ к выбранному в данный момент элементу, менеджеру списка,список элементов и индекс текущего элемента.

public Capteurs Current
{
    get => List[Index];
    set => List[Index] = value;
}
public CurrencyManager CurrencyManager 
{ 
    get => BindingContext[capteursBindingSource] as CurrencyManager; 
}
public IList<Capteurs> List 
{ 
    get => capteursBindingSource.DataSource as IList<Capteurs>; 
}
public int Index
{
    get => BindingContext[capteursBindingSource].Position;
    set => BindingContext[capteursBindingSource].Position = value;
}

Часть B - Подробный вид

Создайте вторую форму и перетащите источник данных на поверхность формы

data as details

drag and drop

Удалить позиционирование вolbar (поскольку вы одновременно отображаете только один набор данных).Организуйте элементы управления, которые создаются, и добавьте кнопки для OK / Отмена или Принять / Закрыть или что-то, чтобы указать, хороши ли изменения или нет.

detail form

Наконец, добавьте следующее свойство, чтобы получить или установить данные, которые должны отображаться в форме

public Capteurs Current
{
    get => BindingContext[capteursBindingSource].Current as Capteurs;
    set => capteursBindingSource.DataSource = new Capteurs[] { value };
}

Часть C - Связывание форм

Все вышеперечисленное выполняется для того, чтобыупростить передачу данных между формами.В основной форме следующий обработчик кнопок открывает детальную форму, отправляет клон текущих данных, и если пользователь выбирает [Сохранить], отредактированные данные сохраняются обратно в основной список и сетка обновляется используя команду CurrencyManager.Refresh().

private void detailsButton_Click(object sender, EventArgs e)
{
    var dlg = new DetaillForm();
    dlg.Current = this.Current.Clone();

    if (dlg.ShowDialog(this) == DialogResult.OK)
    {
        this.Current = dlg.Current;
        CurrencyManager.Refresh();
    }
}

the final result

0 голосов
/ 18 апреля 2019

вы можете сделать это с помощью делегатов.Я едва могу понять вашу проблему, но я уверен, что это поможет.просто измените код в соответствии с вашими потребностями.

public partial class Form3 : Form
{
    public delegate void callback_data(string dataToSend);
    public event callback_data sentIt;


   private void form3_FormClosing(object sender, FormClosingEventArgs e)
   {
       string data = "Top Secret Data";
       sentIt(data);
   }
}

Теперь в вашей Form2, где вы создаете экземпляр Form3, вызовите событие.

public partial class Form2 : Form
{

   private void Form2_OnLoad()
   {
       Form2 obj = new Form2();
       obj.sentIt += onReceiveData;
       obj.ShowDialog();
   }

   private void onReceiveData(string myData)
   {
      console.WriteLine(myData);
   }
}

Таким образом, вы получите данныеот Form3 до Form2 ... я перепробовал 200 новых методов: p, но этот делегат - самый эффективный способ сделать это!Поверь мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...