Подтвердить что ты не робот

Как обновить datagridview при закрытии дочерней формы?

У меня есть dgv на моей основной форме, есть кнопка, которая открывает другую форму для вставки некоторых данных в источник данных, ограниченный dgv. Я хочу, когда дочерняя форма закрывает автоматическое обновление dgv. Я попытался добавить это в событие закрытия дочерней формы, но он не обновляется:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
        {
            frmMain frmm = new frmMain();

            frmm.itemCategoryBindingSource.EndEdit();
            frmm.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
            frmm.dataGridView1.Refresh();
        }

Однако, когда я добавляю этот код в кнопку в родительской форме, он действительно делает трюк:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();
4b9b3361

Ответ 1

Существует много способов сделать это, но следующее самое простое, и оно будет делать то, что вы хотите, и начать работу.

  • Создайте общедоступный метод в вашей основной форме.
  • Модифицированный конструктор второй формы принимает основную форму.
  • Создайте экземпляр второй формы, передающей основной объект формы.
  • При закрытии второй формы вызовите общедоступный метод объекта основной формы.

Form1

public partial class Form1 : Form {
    public Form1() {
        //'add a label and a buttom to form
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) {
        Form2 oForm = new Form2(this);
        oForm.Show();
    }
    public void PerformRefresh() {
        this.label1.Text = DateTime.Now.ToLongTimeString();
    }
}

Form2

public class Form2 : Form {
    Form1 _owner;
    public Form2(Form1 owner) {
        _owner = owner;
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
    }
    private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
        _owner.PerformRefresh();
    }
}

Ответ 2

Вы создаете новый экземпляр основной формы, которая не влияет на фактический экземпляр основной формы. Что вам нужно сделать, вызовите код самой основной формы, точно так же, как код, который вы говорите, работает при нажатии кнопки:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
{
    this.itemCategoryBindingSource.EndEdit();
    this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
    this.dataGridView1.Refresh();
}

Ответ 3

Мы также можем продолжить этот путь:

У нас есть form_1 и form_2

  • В form_1 создайте общедоступный метод. Внутри этого общественного метода мы помещаем наши вещи;
  • В form_2 мы создаем глобальную переменную формы;
  • Еще в form_2 передайте form_1 в form_2 через конструктор form_2;
  • Еще в form_2 сделайте свою глобальную переменную (созданную на шаге 2), получив новый экземпляр form_1, созданный в конструкторе form_2;
  • В методе clos_event мы вызываем метод, который содержит наш материал.

Метод с нашим материалом - это метод, который заполнит наш список form1, dataGridView, comboBox или все, что мы хотим.

Form_1:

public fillComboBox()//Step 1. This is the method with your stuff in Form1
{
     foreach(var item in collection myInfo)
     {myComboBox.Items.Add(item)}

}

Form_2:

Form1 instanceForm1;//Step 2
public Form2(Form1 theTransporter)//Step 3. This the Form2 contructor. 
{ 
    InitializeComponent();
    instanceForm1 = theTransporter;//Step 4
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    instanceForm1.fillComboBox();//Step 5 we call the method to execute the task updating the form1
}

Надеюсь, это поможет...

Ответ 4

Отличный ответ! Другой метод:

  • Проверьте, открыта ли форма, которую вы хотите обновить.
  • Вызвать метод для обновления gridVieW.

    ** внутри refreshMethod() в form1 убедитесь, что вы установили datasource в null **

 if (System.Windows.Forms.Application.OpenForms["Form1"]!=null)
            {
                (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).refreshGridView("");
            }