|
■No34624 (tamaboyo さん) に返信 > ということは、動作の流れは、継承元のLB_Clickを抜けた後で > 継承先のクリックイベントに飛んでくるということになるのでしょうか。
期待される処理の流れは、以下のようになります。
イベント Label.Click 発火 → 継承元 LB_Click が呼ばれる → 継承元 OnLbClicked を呼び出す → 継承元 OnLbClicked が呼ばれる → イベント LbClicked 発火 → 継承先 EditExtend_LbClicked が呼ばれる
> 動作の流れとしては、継承元で > Lb[i].Click += new EventHandler(this.LB_Click); > でクリックイベントを括りつけしているので、、LB_Click関数の中で、抜ける直前に > OnLbClicked(new LbClickedEventArgs(label)); > しています。 > これだけでは足りないということでしょうか? 話を聞く限り、継承元の実装は問題無いように思えます。 (となると、疑うべきは継承先の方?)
> 今、LB_Click関数を抜けた後 > public delegate void LbClickedEventHandler(object sender, LbClickedEventArgs e); > public class LbClickedEventArgs : EventArgs > { > private Label label; > public Label Labels { get { return label; } } > public LbClickedEventArgs(Label label) { this.label = label; } //☆ > } > を通るので、☆の部分にブレイクをかけているのですが、 > LbClickedEventArgs(Label label)の引数で渡されるlabelには値が入っているので、そのあとのthis.labelに値は設定されます。 > これが、そのあともう一度LB_Click関数のOnLbClicked(new LbClickedEventArgs(label))を通ってから > OnLbClickedに飛ぶのですが、LB_Click関数を抜けるときにはlabelに値が設定されているのに、 > OnLbClickedに飛んできたときにnullになっています。 > なぜ、値を渡しているのになぜnullになるのでしょうか?
同名の "label" があちこちにあるので、整理しながら見ていきます。
> LbClickedEventArgs(Label label)の引数で渡されるlabelには値が入っているので この label は、「LbClickedEventArgs のコンストラクタ引数」の事ですね。
> そのあとのthis.labelに値は設定されます。 この label は、「LbClickedEventArgs のフィールド変数」だと思います。
> これが、そのあともう一度LB_Click関数のOnLbClicked(new LbClickedEventArgs(label))を通ってから これは「もう一度通っている」というよりも、 『new LbClickedEventArgs(label)』の部分と『OnLbClicked(〜);』の部分とが、 それぞれステップ実行されているという事でしょうね。
デバッグ時の流れを追いやすくするため、 OnLbClicked(new LbClickedEventArgs(label)); の部分を、 LbClickedEventArgs arg = new LbClickedEventArgs(label); OnLbClicked(arg); の 2 行に分けておく事をお薦めします。
> OnLbClickedに飛ぶのですが、LB_Click関数を抜けるときにはlabelに値が設定されているのに、 > OnLbClickedに飛んできたときにnullになっています。 この label が、どれを指しているのか読み取れなかったのですが、デバッグ時に、 上記でいうところの、インスタンス「arg」の有効範囲を読み違えている可能性はありませんか?
>>もしかしたら、別の箇所に問題があるのかも知れませんが( No34513 のように)、 >>今のところ、原因が思い当たらないです。 >可能性は捨てきれないのですが、、、 いきなり今のコードに組み込もうとするのでは無く、まずは今回の範囲について、 単純な実験コードを作って、動作検証を行うようにしてみてください。
個々のパーツが完全で無いうちに、全体の組み上げに取り掛かってしまうと、 問題発生時の切り分けが難しくなってしまいますから。
> 同じようにボタンのクリックイベントをvirtualとoverrideで宣言しているところがあるのですが、 > そこが影響を及ぼすということはありえるのでしょうか?
イベントのオーバーライドという事は、こういう意味でしょうか?
// 継承元 public virtual event EventHandler MyEvent;
// 継承先 public override event EventHandler MyEvent;
だとすると、継承元で「MyEvent(this, EventArgs.Empty);」が実行されても、 継承先の「void foo_MyEvent(object sender, EventArgs e)」メソッドは呼び出されません。
この場合、継承先の「void foo_MyEvent(object sender, EventArgs e)」が呼び出れるのは、 継承先で「MyEvent(this, EventArgs.Empty);」が実行された場合のみです。
もし、イベントが継承先でオーバーライドされていないのであれば、 継承元で「MyEvent(this, EventArgs.Empty);」が実行されたタイミングで、 継承先の「void foo_MyEvent(object sender, EventArgs e)」が呼び出されます。
|