2016-10-16 22 views
-1

質問自体はちょっと騒々しく聞こえます。別のクラスから非静的メソッドを呼び出すには、そのクラスの現在のインスタンスを使用する必要があります。私は2番目のクラスに呼び出したいメソッドでクラスのインスタンスを取得しようとしました。私は成功したと思いますが、それでもまだ動作していません。C#で別のクラスから非静的メソッドを呼び出すにはどうすればよいですか?

私は2番目のクラスにインスタンスを持参しようとしたか、この一つの方法:

arbeitsbearbeitung arbeitenbearbeitung = new arbeitsbearbeitung(arbeit); 
arbeitenbearbeitung.Parent = this; 
arbeitenbearbeitung.Show(); 

(クラス1のうち)

そして、私はクラス2でそれを使用場所です:

Form frm = (Form)this.Parent; 
frm.updateGrid(); 

また、パラメータとして渡すような方法で試しました。同じ結果が...

これはクラス1でupdateGrid()です:

public void updateGrid() 
{ 
    klassenarbeitenTableAdapter.Fill(this.database1DataSet.Klassenarbeiten); 
} 

それはフォームがupdateGridの定義が含まれていないことを私に伝えます。

私はダムでなければなりませんが、私は間違いを見つけることができません。

考えて2時間もグーグルで、まだ手掛かりはありません。

私は今や気分が悪いです。ご協力ありがとうございました!

答えて

3

FormにはupdateGridメソッドはありませんが、派生クラスはありません。クラスをParentにキャストする必要があります。 MyForm frm =(MyForm)this。親;

3

あなたはにクラスのインスタンスを使用する必要がクラス

の現在のインスタンスを使用する必要があります。必ずしも現在のものではありません。

私は(それはシングルトンでない限り)インスタンスはありませんクラス

のインスタンスを取得しようとしました、インスタンスがあります。

次に、MicrosoftはFormを.NETフレームワークの一部として実装しました。 MicrosoftのFormクラスにはupdateGrid()メソッドがありません。

フォームを作成した場合、そのフォームFormからを継承し、あなたが方法updateGrid()を追加しました。だから、Formにキャストする代わりに、クラスにキャストしてください。

だから、コードはそれがLiskov substitution principleを壊すので、これは、クリーンなコードではないことを

arbeitsbearbeitung frm = (arbeitsbearbeitung) this.Parent; 
frm.updateGrid(); 

注意を読むかもしれません。しかし、私はそれがあなたの主な関心事ではないと思います。

+0

私は私の場合、私はクラスの現在のインスタンスが必要と思うので、私は変更を可視のフォーム上にしたいと思う。または私は間違っていますか? – Milanisius

+0

@Milanisius:はい、フォームを1つしか開いていない場合は、そのフォームを使用する必要があります。つまり、新しいインスタンスを新しく作成した場合は役に立ちません。しかし、一般的に(フォームではなくクラスについて話していた)、多くのオブジェクトにアクセスできます。 –

0

あなたは、プレーンFormとしてfrmを宣言している:

Form frm = (Form)this.Parent; 

問題はFormクラスはupdateGridと呼ばれる機能を有していないということです。 frm.updateGrid()と言うとき、コンパイラは「frmFormですが、FormにはupdateGridという名前のものはありません」と考えています。 frmが実際にFormの特別なサブクラスであり、updateGrid関数が定義されていることはわかりません。

代わりに、クラス1の実際のクラスでfrmを宣言する必要があります:

MyCustomForm frm = (MyCustomForm)this.Parent; 

あなたがfrm.updateGrid()を行うときに、コンパイラはあなたが何を言ってるのか知っています。

関連する問題