C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: イベントの継承で警告


(過去ログ 126 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■74909 / inTopicNo.1)  イベントの継承で警告
  
□投稿者/ ふる (1回)-(2015/02/09(Mon) 11:50:10)

分類:[.NET 全般] 

VisualStudio2010です

DefaultFormの内容
protected void ClickEventHandler(object sender, EventArgs e)
{}

MainFormはDefaultFormを継承します。
MainFormのボタンAのイベントはClickEventHandlerを設定します。

以下の警告が出力され、VisualStudio上からデザインが確認できなくなります。
警告 2 メソッド 'ClickEventHandler' は、このクラスが派生した元のクラスが既にメソッドを定義しているため、イベントのメソッドにすることができません。

デザインを開くと以下のエラーメッセージとなります。
メソッド 'ClickEventHandler' は、このクラスが派生した元のクラスが既にメソッドを定義しているため、イベントのメソッドにすることができません。

実行すると正常に動作します。

DefaultFormを削除し、MainFormにClickEventHandlerを定義すれば正常になるのですが
デザインを使いたい場合はイベントを継承するのは駄目なのでしょうか。
引用返信 編集キー/
■74910 / inTopicNo.2)  Re[1]: イベントの継承で警告
□投稿者/ WebSurfer (496回)-(2015/02/09(Mon) 12:34:04)
No74909 (ふる さん) に返信

> デザインを使いたい場合はイベントを継承するのは駄目なのでしょうか。

質問者さんが具体的にどうやっているか分からないのですが、やり方の問題ではないのでし
ょうか?

DefaultForm でハンドラ ClickEventHandler(←これはイベントではなくてハンドラです)
は定義しないでイベントのみ定義し、MainForm でハンドラを定義してそれをイベントにア
タッチするようにしてますか?

例えば System.Windows.Forms.Button コントロールのイベントを MSDN ライブラリで調べて
いただくと、多くのイベントが Control から継承されているのが分かると思います。それは
問題なく継承されて、デザイン画面で報告されているような警告が出ることはないはずです。
引用返信 編集キー/
■74913 / inTopicNo.3)  Re[1]: イベントの継承で警告
□投稿者/ WebSurfer (498回)-(2015/02/09(Mon) 13:33:23)
No74909 (ふる さん) に返信

【追伸】

参考になりそうな MSDN ライブラリのページを見つけたので紹介しておきます。

方法 : 派生クラスから基本クラス イベントを発生させる (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/hy3sefw3.aspx


もう少し基本的な、デリゲートの定義、イベントの定義、イベントの発行のあたりから
勉強したい場合は、以下のページから読んではいかがでしょう。

方法 : .NET Framework ガイドラインに準拠したイベントを発行する (C# プログラミング ガイド)
https://msdn.microsoft.com/ja-jp/library/w369ty8x.aspx
引用返信 編集キー/
■74915 / inTopicNo.4)  Re[2]: イベントの継承で警告
□投稿者/ ふる (2回)-(2015/02/09(Mon) 14:12:34)
なるほど。
イベントやデリゲートに対して勉強したいと思います。

ありがとうございます。
引用返信 編集キー/
■74916 / inTopicNo.5)  Re[2]: イベントの継承で警告
□投稿者/ PANG2 (58回)-(2015/02/09(Mon) 14:13:49)
DefaultForm側でイベントを公開する

public event EventHandler Button1Click
{
	add
	{
		this.button1.Click += value;
	}
	remove
	{
		this.button1.Click -= value;
	}
}

引用返信 編集キー/
■74917 / inTopicNo.6)  Re[1]: イベントの継承で警告
□投稿者/ なちゃ (27回)-(2015/02/09(Mon) 14:15:10)
No74909 (ふる さん) に返信
> 実行すると正常に動作します。
>
> DefaultFormを削除し、MainFormにClickEventHandlerを定義すれば正常になるのですが
> デザインを使いたい場合はイベントを継承するのは駄目なのでしょうか。

一応紛らわしいので、イベントハンドラを継承という話と言うことで。

.NETの仕組み的には別に問題ないはずですので、単純にVisual Studioのデザイナが対応していないという事でしょうね…
コードで明示的にハンドラを追加するか、イベントハンドラ自体ではなく処理本体のメソッドを継承する形にして、イベントハンドラはあくまで派生側で追加して、継承した処理本体のメソッドを間接的に呼び出すか、くらいですかね。

引用返信 編集キー/
■74922 / inTopicNo.7)  Re[3]: イベントの継承で警告
□投稿者/ ふる (1回)-(2015/02/09(Mon) 21:41:36)
皆さんありがとうございます。

イベントに関してはオーバーライドして解決できましたが

フォームを継承するとVisualStudioが強制終了するなど他の問題も起きました。
その場合、MainFormの継承をDefaultFormからFormに変更しビルドし
再度DefaultFormに戻したりすると直っていましたが
度々発生するので、フォームの継承はあきらめました。。。

フォームの共通メソッドはユーティリティとして別クラスとし
ユーティリティを呼び出すことにしました。

ありがとうございました。
解決済み
引用返信 編集キー/
■74927 / inTopicNo.8)  Re[4]: イベントの継承で警告
□投稿者/ PANG2 (59回)-(2015/02/10(Tue) 10:17:42)
No74922 (ふる さん) に返信
> フォームを継承するとVisualStudioが強制終了するなど他の問題も起きました。
> その場合、MainFormの継承をDefaultFormからFormに変更しビルドし
> 再度DefaultFormに戻したりすると直っていましたが
> 度々発生するので、フォームの継承はあきらめました。。。

DefaultFormを別プロジェクトにするとか


解決済み
引用返信 編集キー/
■74928 / inTopicNo.9)  Re[4]: イベントの継承で警告
□投稿者/ WebSurfer (500回)-(2015/02/10(Tue) 10:24:59)
No74922 (ふる さん) に返信

> イベントに関してはオーバーライドして解決できましたが

継承するのは「イベント」なのか「イベントハンドラ」なのか用語の使い方を正確
にすることをお勧めします。そうしないと、特に掲示板では、話が通じにくいので。
解決済み
引用返信 編集キー/
■74934 / inTopicNo.10)  Re[5]: イベントの継承で警告
□投稿者/ キム (49回)-(2015/02/10(Tue) 13:39:44)
No74922 (ふる さん) に返信

解決されているようですが、念のために補足させてください。

> フォームを継承するとVisualStudioが強制終了するなど他の問題も起きました。

フォームをデザイナーで表示しようとすると、基底クラスのデフォルトコンストラクターや
各種処理が呼ばれます。
なので、通常であれば、System.Windows.Forms.Formクラスがこっそり呼ばれることになります。

フォームを継承するとその基底クラスが呼ばれるので、今回のケースではMainFormをデザイナーで
表示しようとするとDefaultFormの処理が呼ばれることになります。

例を挙げると、
・MainFormをデザイナーで表示した時点で、DefaultFormのデフォルトコンストラクターが呼ばれる。
・さらにLoadイベントやOnLoad、PaintイベントやOnPaintも呼ばれる。
・デザイナーでMainFormのサイズを変更すると、DefaultFormのResizeイベントやOnResizeが呼ばれる。
などが予想されます。

これらの処理の中でデザイン時に実行されることを想定していないようなコードが記述されていると、
様々な問題を引き起こす可能性があります。

大抵は DesignMode プロパティを見てデザイン時には実行しないようにすれば解決します。

ただし、デフォルトコンストラクターが実行されている時点ではまだ DesignMode プロパティに有効な値
が設定されていないので、DesignMode プロパティではデザイン時かどうかを判定できません。
私はコンストラクター内で判定が必要な状況になったことがないので使ったことがないですが、
コンストラクター内でも有効な方法が幾つか確立されているようです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -