チェンジセット 1621 (default)


以下の違いを無視:
日時:
2023/09/22 0:32:49 (13ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • ソースコントロールのプロパティがバインドされたたり、プログラムから値が設定された場合 (OnInit の後にプロパティに値が変更され、Changed 系のイベントが発生しない場合)、連携対象のコントロールの状態が変更されない問題に対応。
ファイル:
1個の更新

凡例:

未変更
追加
削除
  • framework/trunk/WebLibrary/Sources/UI/WebControls/ControlPropertyLinkageConnector.cs

    r1616 r1621  
    8080        private const string LinkedPropertyNegativeValueKey = "LinkedPropertyNegativeValue"; 
    8181 
     82        /// <summary> 
     83        /// <see cref="ValueIsPositive"/> プロパティ用のキー。 
     84        /// </summary> 
     85        private const string ValueIsPositiveKey = "ValueIsPositive"; 
     86 
    8287 
    8388        /// <summary> 
     
    302307 
    303308        /// <summary> 
     309        /// 評価結果を取得または設定します。 
     310        /// </summary> 
     311        /// <value> 
     312        /// 評価結果。 
     313        /// </value> 
     314        private bool? ValueIsPositive 
     315        { 
     316            get 
     317            { 
     318                return (bool?)ViewState[ValueIsPositiveKey]; 
     319            } 
     320 
     321            set 
     322            { 
     323                ViewState[ValueIsPositiveKey] = value; 
     324            } 
     325        } 
     326 
     327        /// <summary> 
    304328        /// <see cref="E:System.Web.UI.Control.Init" /> イベントを発生させます。</summary> 
    305329        /// <param name="e">イベント データを格納している <see cref="T:System.EventArgs" /> オブジェクト。</param> 
     
    309333            base.OnInit(e); 
    310334 
    311             UpdateLinkedControl(true); 
     335            // 必ず更新 
     336            UpdateLinkedControl(true, false); 
    312337        } 
    313338 
     
    320345            base.OnPreRender(e); 
    321346 
    322             if (changed) 
    323             { 
    324                 UpdateLinkedControl(false); 
    325             } 
     347            // 変更があった場合のみ連携対象のコントロールを更新 
     348            UpdateLinkedControl(false, true); 
    326349        } 
    327350 
     
    370393        /// それ以外の場合は <see langword="false"/>。 
    371394        /// </param> 
    372         private void UpdateLinkedControl(bool isRequiredAttachEventHandler) 
     395        /// <param name="updateOnlyIfChanged"> 
     396        /// 値に変更があった場合のみ更新する場合は <see langword="true"/>。 
     397        /// それ以外の場合は <see langword="false"/>。 
     398        /// </param> 
     399        private void UpdateLinkedControl(bool isRequiredAttachEventHandler, bool updateOnlyIfChanged) 
    373400        { 
    374401            object value = GetSourcePropertyValue(ref isRequiredAttachEventHandler); 
     
    376403            bool valueIsPositive = EvaluateSourceValue(value); 
    377404 
     405            // 変更された場合のみ更新する場合、プロパティに変更が無く、値も変わっていなければ何もしない 
     406            if (updateOnlyIfChanged && !changed && valueIsPositive == ValueIsPositive) 
     407            { 
     408                return; 
     409            } 
     410 
    378411            SetLinkedPropertyValue(valueIsPositive, isRequiredAttachEventHandler); 
    379412 
     413            ValueIsPositive = valueIsPositive; 
    380414            changed = false; 
    381415        } 
     
    607641        private void ControlOnDefaultEventHandler(object sender, EventArgs e) 
    608642        { 
    609             UpdateLinkedControl(false); 
     643            // 変更があった場合のみ連携対象のコントロールを更新 
     644            UpdateLinkedControl(false, true); 
    610645        } 
    611646    } 
詳しい使い方は TracChangeset を参照してください。