2

頻繁に使用する DLL に静的イベントがある - Toolkit.Dialogs.ExitConfirm

このイベントを使用できる唯一の方法は、form.Designer.cs でイベントを追加する行を変更することです。例:

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

になる

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Toolkit.Dialogs.ExitConfirm);

[プロパティ] -> [イベント] ページから追加しようとすると、次のエラーが表示されます: 'Toolkit.Dialogs.ExitConfirm' は有効な識別子ではありません。

フォーム デザイナーが他のクラス/名前空間からイベントを参照できるようにする方法はありますか?

編集: 一部の人々は視覚的な合図でうまく機能するため、問題を定義するための画像をいくつか示します: http://imgur.com/a/RaLMg

最初の画像は、イベントを呼び出すイベントである Visual Studio で動作させる方法を示しています。

2 番目の画像は、私が実際にやろうとしていることを示しています。

3 番目の画像は、メソッド名を手で入力したときに発生するエラーです。

4

3 に答える 3

1

DLLに静的イベントがあります

あなたはそうではありません、あなたはただ方法を持っています。FormClosingはイベントです。適切な署名があれば、メソッドをイベントハンドラーメソッドにすることができます。デザイナーはあなたがやろうとしていることを単にサポートしていません。あなたはやめなければなりません。2つの正しい解決策があり、どちらもフォームクラスでコードを記述する必要があります。まず、コンストラクターでそれを行うことができます。

    public Form1() {
        InitializeComponent();
        this.FormClosing += Toolkit.Dialogs.ExitConfirm;
    }

または、クラスが独自のイベントを聞くことは意味がないため、正気です。

    protected override void OnFormClosing(FormClosingEventArgs e) {
        Toolkit.Dialogs.ExitConfirm(this, e);
        if (!e.Cancel) base.OnFormClosing(e);
    }

これには、これから別のフォームを派生させるときに適切に機能するという大きな利点があります。これは、あなたがおそらく実際にすべきことへの強力なヒントでもあります。ダイアログの一般的なコードを記述しようとしているようです。「Toolkit」名前空間も同様に示唆しています。代わりに、このツールキットに基本フォームクラスを実装させることで、うまく機能させることができます。これで、コードやイベントハンドラーなしでフォームクラスを設計できます。

public partial class Form1 : Toolkit.Dialogs.BaseDialog {
   // etc
}

Toolkit.Dialogs.BaseDialogは、OnFormClosing()をオーバーライドするFormから派生したクラスであると想定しています。たぶん、bool型の「ConfirmOnClose」という名前のパブリックプロパティも必要です。これにより、「ExitConfirm」ロジックが有効になります。デザイナでそのプロパティを問題なく設定できます。

于 2012-04-18T12:51:35.180 に答える
0

このメソッドを呼び出すことができます'Toolkit.Dialogs.ExitConfirm'アプリケーションフォームのフォーム終了イベントで、必要なパラメータをToolkit.Dialogs.ExitConfirmに渡します

于 2012-04-18T05:12:55.920 に答える
0

WinForms デザイナーは、それを行うようには設計されていません。次回デザイナーに変更を加えたときに、イベントが失われないことに少し驚いています。

これを機能させる他の方法に関するいくつかのアイデア:

  • イベントをフックする Form クラスを作成し、その基本クラスから他のすべてのフォームを派生させることができます。次に、どこでも動作を取得します。
  • イベントをフックするユーティリティ メソッドを作成し、各フォームのコンストラクターから呼び出すことができます。
  • イベントをフックしてフォームを表示する拡張メソッドを作成し、フォームを表示するすべての場所で拡張メソッドを呼び出すことができます (を呼び出す代わりにShow)。

他の目的でフォーム継承をまだ使用していない限り、基本クラスはおそらく最も単純なソリューションです。

于 2012-04-18T12:14:40.133 に答える