| 魔界の仮面弁士 さん、ありがとうございます。
>>理解力が低くてお手数をおかけしております。 > いえ、こちらの説明が不足している部分もあるかと思うので、 > 不明な点はその都度、再質問していただいた方がありがたいです。 > > # こうしたやり取りは、教える側にとっても勉強になります。
そう言っていただけるとありがたいです。 もう少しで解決しそうな気がしているのですが、、、よろしくお願いします。
> >>>コンパイルは通りましたが、継承先のLB_Clickへイベントは飛んできませんでした。 > >> 別の表現でいうと、継承元で LB_Click が呼ばれた時に、その中で継承元自身の OnLbClicked メソッドを > >> 呼び出しているかどうかという事です。この部分の具体的なコードは、 No34566 を参照してください。 >>継承元のLB_Clickで、関数を抜ける直前に >>OnLbClicked(new LbClickedEventArgs(label)); >>の記述を入れています。 > > 以下の点を確認してみてください。 > > (1) 継承元の LB_Click 内にある、「OnLbClicked(new LbClickedEventArgs(label));」の行が実行されているか。 > → OnEventName メソッドは、イベントを発生させる為に用意されるメソッドです。
この行にブレイクをかけているのですが 継承元のフォームを表示させてラベルをクリックすると、ブレイクが引っ掛かります。 継承先のフォームを表示させてラベルをクリックしても、ブレイクは引っ掛かりません。
> (2) 継承元の OnLbClicked の中にある、「LbClicked(this, e);」の行が実行されているか。 > → これが最も重要な箇所です。これにより、LbClicked イベントが発生します。 > ブレイクをかけて継承元のフォームを表示させてラベルをクリックさせてみましたが、 このブレイクには引っ掛かりませんでした。 その前の、if (LbClicked != null)の条件文で抜けています。
もちろん、継承先のフォームを表示させてラベルをクリックしても引っ掛かりません。
> (3) 継承先で「LbClicked += new LbClickedEventHandler(EditExtend_LbClicked);」が実行されているか。 > → ここでイベントハンドラとして登録されたメソッドが、イベント発生時に呼び出される事になります。
ブレイクをかけているのですがフォームを表示するタイミングで引っ掛かります。
> (4) 継承先で LbClicked のイベントやその他のメソッドを再定義していたりはしないか。 > → 継承先で処理を上書きしてしまうと、継承元からの通知を握りつぶしてしまう結果になりかねません。
今は LbClickedの再定義はコメントにしています。 #はじめは継承元をvirtualにしていたので、overrideで定義していました。 継承先のEditExtend_LbClickedを抜ける直前にも OnLbClicked(new LbClickedEventArgs(label)); の記述をしていますが、それで再定義になりますでしょうか? その他、思いつく再定義はないつもりです。 #検索かけましたが引っ掛かりませんでした。
(2)で引っ掛かってないので、それが原因ということでしょうか。 LB_Click関数のOnLbClicked(new LbClickedEventArgs(label));で 引数で渡しているlabelは、 Label label = (Label)sender; で定義&値の設定をしています。 この時点ではnullではないのですが、OnBitClickedの飛んできたときにはnullになっています。
>>継承元ではArrange関数の中でLbのインスタンス作成を行っているfor文中、 > 『Lb[i].Click += new EventHandler(this.LB_Click);』を実行するとすれば、 > タイミングとしてはそこでしょうね。
はい、そこでその通りに設定しています。
>>継承先では、継承元のArrange関数から戻ってきた後に記述していますが、 > いつでも良いとは思いますが、私はフォームのロード時に割り当てています。
フォームを呼び出す側のフォームから呼ばれるラベルの個数を渡される関数の中で設定していますが、 この関数を抜けたあとでShowDialogしているので、大丈夫だと思います。
>>このタイミングが悪くて括りつけが行われない、ということはないですよね? > += で登録する前に発生したイベントは当然拾えませんが、 > += で登録した後に発生したイベントであれば拾えるはずです。
フォームが表示されるまでに、継承元、継承先とも括りつけは終了しています。
> >>>#自動生成で関数として作成し実行してみましたが、イベントはそこには飛んできませんでした。 > >>継承元で、イベントを発生させていないからでしょう。 >>ちょっと整理させてください。 >>ここでいうイベントとは、LB_Clickに飛んで来ていない、ということでしょうか? > LB_Click が呼ばれた際に、LBClicked イベントを発生させているか否か、という事です。 > > イベントの宣言は、 > >>> public event LbClickedEventHandler LbClicked; > の部分です。そして、ここで宣言したイベントを発生させているのが、 > >>> LbClicked(this, e); > の行です。 > > 継承元で LbClicked(this, e); を呼びだすことで、 > 継承先の「LbClicked += 〜」で割り当てられたメソッドも呼び出されます。
継承元でイベントが発生できていないということだったのですね。 イベントの宣言は public event LbClickedEventHandler LbClicked; protected void OnLbClicked(LbClickedEventArgs e) { if (LbClicked != null) { LbClicked(this, e); } } です。 あっていると思うのですが・・・? |