Control.cs の OnEnabledChanged です。

 protected virtual void OnEnabledChanged(EventArgs e) { 
     if (GetAnyDisposingInHierarchy()) {
         return;
     }
 
     if (IsHandleCreated) {
         SafeNativeMethods.EnableWindow(new HandleRef(this, Handle), Enabled); 
 
         // User-paint controls should repaint when their enabled state changes
         // 
         if (GetStyle(ControlStyles.UserPaint)) {
             Invalidate();
             Update();
         } 
     }
 
     EventHandler eh = Events[EventEnabled] as EventHandler; 
     if (eh != null) {
         eh(this, e); 
     }
 
     ControlCollection controlsCollection = (ControlCollection)Properties.GetObject(PropControlsCollection);
     if (controlsCollection != null) { 
         // PERFNOTE: This is more efficient than using Foreach.  Foreach
         // forces the creation of an array subset enum each time we 
         // enumerate 
         for(int i = 0; i < controlsCollection.Count; i++) {
             controlsCollection[i].OnParentEnabledChanged(e); 
         }
     }
 }

何をしているかというと

(1) GetAnyDisposingInHierarchy で上位のコントロールが Dispose 中かチェック
(2) EnableWindow を実行
(3) イベントを発生
(4) 子コントロールに対し、「親の Enabled プロパティが変わったよー」と通知

VB6.0 と違うのは、(2) と (4) ですね。

(2) は Enabled プロパティをセットしてますが、親が False なら、子はすべて False になってしまいます。

VB6.0 と互換性を持たせるには、個々のコントロールで管理している Enabled プロパティをセットしなければなりません。

(4) は、VB6.0 では行われません。

(1)(2)(3) を実装していきます。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-12-13 (金) 23:47:44 (1293d)