1

DataGridView コントロールにデータを表示するアプリケーションを作成しました。データは SQL データベースに格納されます。この特定の表示には多くのパラメーターがあるため、ユーザーがデータベース内のデータを追加または変更するのに役立つ別の (子) フォームを同じプロジェクトに作成しました。追加機能と代替機能の両方が正常に機能しますが、DataGridView 内のデータは変更されません。DataGridView の DataSource を更新する方法は知っていますが、別のフォームからその関数をトリガーする方法がわかりません。

この関数を使用して、DataGridView の DataSource を更新します。

private void RefreshMyDGV()
{
    command.CommandText = "SELECT * FROM MyDataBase";
    SDA.SelectCommand = command;
    SDA.Fill(myDataTable);
    dataGridView1.DataSource = MyDataTable;
}

この関数を public static 関数に変更して、他の (子) フォームからアクセスできるようにしようとしましたが、コンパイラは「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」というエラーをスローします。 "。

また、DataGridView をパブリックとして定義してから、他のフォームからアクセスしようとしました。

((Form1)fr1).dataGridView1.DataSource = myDataTable;

しかし、それもうまくいきませんでした。

これを行う方法を提案してください。ありがとう。

4

3 に答える 3

4

問題は、関数を作成していることですstatic。あなたはそれをする必要はありません - 作るだけpublicです。

静的メソッドとインスタンス メソッドの違いについては、次のドキュメントを参照してください:
http://msdn.microsoft.com/en-us/library/aa645629(v=vs.71).aspx

パブリック関数を呼び出すには、子フォームから (クラスだけでなく)親フォームインスタンスへの参照が必要になります。LogicalParentタイプと呼ばれる子フォームにプロパティを追加しますParentForm(実際の親フォームのタイプを置き換えます) (すでにParentandという名前のプロパティがありParentFormますが、それらは別の目的で使用されているため、使用しないでください):

public ParentForm LogicalParent{ get; set; }

ここで、親フォームで、子フォームの新しいインスタンスを開くときに、Show 関数を呼び出す直前にこのプロパティを設定します。

ChildForm l_childForm = new ChildForm();
l_childForm.LogicalParent = this;
l_childForm.Show();

これで、子フォームに親への参照ができました。パブリック関数を呼び出すことができるようになりました:

this.LogicalParent.RefreshMyDGV();

別:

親フォームで、親フォームへの参照をShowDialog関数に渡します。

ChildForm l_childForm = new ChildForm();
l_childForm.ShowDialog(this);

これで、子ウィンドウで、プロパティを介して親フォームにアクセスできますOwnerOwnerただし、プロパティを親フォームのタイプにキャストする必要があります。したがって、子フォームでは次のようになります。

((ParentForm)this.Owner).RefreshMyDGV();

MDI:

MDI 環境を使用している場合 (それが何かわからない場合は無視してください)、上記ParentFormのプロパティを使用したのと同じ方法でプロパティを使用できOwnerます (親の型にキャストする必要があります)。MDI 環境は説明がより複雑です。それを使用しているとは言っていないので、ここでは説明しません。さらに詳しい情報が必要な場合は、http: //msdn.microsoft.com/en-us/library/xyhh2e7e.aspxにアクセスしてください。

于 2012-10-26T13:24:43.840 に答える
0

RefreshMyDGV() メソッドを公開します。その後、子フォームの親を介してアクセスできます。

データを変更すると、バインディングがうまくいくはずです。

dataGridView1.ResetBindings()
于 2012-10-26T13:22:47.707 に答える
0

子フォームの DialogResult を使用できます

次に、代わりにchildform.Show();

あなたが使うだろう childform.ShowDialog();

ParentForm は、続行する前に DialogResult を待機するようになりました

子フォームのデータベースを正常に変更すると、Dialogresult を設定できます

childForm で:

try
{

//alter database

//set DialogResult
this.Dialogresult = DialogResult.OK;

}

catch(System.Exception)
{
//Error Message
this.Dialogresult = DialogResult.NO;
}

親フォーム:

ChildForm cf = new ChildForm();
cf.ShowDialog();

if(cf.DialogResult = DialogResult.OK)
{
    //SET DATASOURCE
}
于 2013-06-12T10:37:59.953 に答える