0

複数のフォームで構成されるアプリケーションがあります。MainForm があり、この MainForm 内で他のフォームが開きます。開く子フォームの 1 つ (単に Form1 と呼びます) には、datagrid ビューなど、内部にコントロールを持つユーザー コントロールが含まれています。この datagridview コントロールには、トリガーされるイベントがいくつかあります。そのうちの 1 つは「cellclick」イベントです。

このクリック イベントは、Form1 で宣言されているパブリック タイマー オブジェクトにアクセスする必要があります。

現在、それを機能させるために、次のコードを使用しました:

((Form1)this.Parent.Parent.Parent.Parent.Parent).clickTimer.Start();

ただし、これはこの Timer オブジェクトにアクセスするための最良の方法とは思えず、Form1 とそのユーザー コントロールの将来の開発で頭痛の種になる可能性があります。

ユーザー コントロールの datagridview クリック イベント内から Form1 タイマーにアクセスする別の方法は何ですか?

私は今これについて空白を描いているので、アドバイスをいただければ幸いです。

ありがとう

4

3 に答える 3

2

ユーザー コントロールに Timer インスタンスをコンストラクター引数として取り、将来のアクセスのためにプライベート バッキング フィールドに格納することができます。

于 2012-08-01T16:37:59.590 に答える
0

さて、Form1オブジェクトにアクセスするためのよりエレガントな方法を見つけました(Parent.Parent.Parent ...などを使用するのではなく):

Control activeForm = this.FindForm();

だから今私は持っています:

((Form1)activeForm).clickTimer.Start();

上記のコードは、userControl が内部に存在するフォーム (Form1) を提供します。UC が内部に存在するフォームには常にタイマーがあるため、ユーザー コントロールが別のフォーム (Form2 など) に配置されていても、これは機能するはずです。

ただし、@Darin は優れた代替手段を提供してくれましたが、必要なコードの変更を最小限に抑えながら問題を修正する最も迅速な方法を提供してくれましたが、フォームの保守性は依然として低いため、ソリューションを使用することにしました。もちろん、私の状況に固有のものです。

于 2012-08-01T17:10:30.200 に答える
0

子フォームで静的イベントを作成し、親フォームで登録することができます。

「cellclick」でイベントをトリガーし、親フォームのイベント ハンドラーでタイマーをトリガーします。

于 2012-08-02T06:47:33.457 に答える