Member 12977712 Ответов: 1

Дублированная форма после двойного щелчка в datagridview в C#


Итак, я попытаюсь объяснить, что я хочу, чтобы мое приложение делало:

1) в основной форме у меня есть текстовое поле и DataGridView. Я вставлю в текстовое поле то, что хочу найти, а затем нажму F1, чтобы открыть вторую форму, которая будет отображаться в другом DataGridView.

2) я дважды щелкну по второй форме DataGridView, и это значение столбца будет отображаться в текстовом поле из основной формы.

3) после него это текстовое поле заполняется и в зависимости от этого значения он вставляет в основную форму DataGridView это значение подробно.

Во второй форме DataGridView у меня есть событие двойного щелчка с этим:

Что я уже пробовал:

private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
    try
    {
        DataGridViewRow dr = dataGridView1.SelectedRows[0];
        this.Hide();

        frmPrincipal frm = new frmPrincipal();

        frm.Show();

        frm.txtCarga.Text = dr.Cells[0].Value.ToString();

        frm.txtCarga.Focus();
        frm.txtCarga.SelectAll();

    }
    catch (Exception ex)
    {
        MessageBox.Show("Erro\nDetalhes: " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}


Проблема здесь в том, что если я использую frm.Show(); он откроет новую форму frmPrincipal, но она у меня уже есть. Если я прокомментирую frm. Show (); код не будет выполнен, но erros не появится. В принципе, это значение не будет отображаться в текстовом поле.

Что же мне делать?

[no name]

"он откроет новую frmPrincipal форму", да, потому что это именно то, что вы сказали ему сделать.
"frm. Show(); код не будет выполнен", это совсем не так. Он будет выполняться, вы просто не сможете увидеть его на экране.
"Что мне делать?", вы, вероятно, хотите использовать свой существующий экземпляр формы вместо создания новой.

Member 12977712

Не могли бы вы мне помочь?

[no name]

Я только что это сделал.

Member 12977712

Как использовать существующий экземпляр ?

[no name]

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

1 Ответов

Рейтинг:
1

OriginalGriff

Проблема в том, что вам нужно остановиться и подумать, что вы делаете.

frmPrincipal frm = new frmPrincipal();
frm.Show();
Всегда будет создавать новый экземпляр формы и отображать его - он не может, не может и совершенно определенно не должен взаимодействовать с существующим экземпляром так же, как создание новой целочисленной переменной должно "присоединять" ее к предыдущей и влиять на них обоих, когда вы устанавливаете новое значение!
И даже если бы это было так, вы не должны пытаться получить доступ к элементам управления в этой форме, потому что вы даже не должны знать, что они существуют! Они являются private по умолчанию по очень веской причине-и делать их общедоступными, чтобы вы могли делать подобные вещи, очень плохая практика, поскольку она "блокирует" две формы вместе, поэтому вы не можете изменить одну из них, не рассматривая последствия для всех других форм, которые могут зависеть от ее внутренних компонентов.

То, что вы хотите сделать, - это "поговорить" с предыдущим экземпляром , что нетрудно: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^] покажет вам, как это сделать - и перестаньте прятать формы, когда вы закончите с ними! Вместо этого закройте их.