web-dev-qa-db-ja.com

子フォームを閉じるときに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();
21
DanSogaard

これを行うには多くの方法がありますが、以下は最も単純なものであり、必要なことを実行して開始します。

  • メインフォームにパブリックメソッドを作成します。
  • メインフォームを取るように2番目のフォームのコンストラクターを変更しました。
  • メインフォームオブジェクトを渡す2番目のフォームのインスタンスを作成します。
  • 2番目のフォームを閉じるときに、メインフォームオブジェクトのパブリックメソッドを呼び出します。

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();
    }
}
39
AMissico

実際のメインフォームインスタンスに影響を与えていないメインフォームの新しいインスタンスを作成しています。あなたがする必要があるのは、あなたが言うボタンのクリックで機能するコードのように、メインフォーム自体でコードを呼び出すことです:

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

すばらしい回答です。他の方法は次のようになります:

  1. 更新するフォームが開いているかどうかを確認します。
  2. メソッドを呼び出して、gridVieWを更新します。

    ** _form1_のrefreshMethod()内で、datasourcenullに設定していることを確認してください**

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

この方法で進めることもできます。

Form_1とform_2があります。

  1. Form_1で、パブリックメソッドを作成します。このパブリックメソッドの内部に、データを配置します。
  2. Form_2では、グローバルフォーム変数を作成します。
  3. 引き続きform_2で、form_2コンストラクターを介してform_1をform_2に渡します。
  4. 引き続きform_2で、グローバル変数(手順2で作成したもの)に、form_2コンストラクターで作成した新しいform_1インスタンスを受け取ります。
  5. Close_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
}

それが役に立てば幸い...