チェンジセット 1611 (default)


以下の違いを無視:
日時:
2023/09/14 3:48:12 (13ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • BoundParameter のバインドを、そのパラメータを使用しているコントロールにバインドされたタイミングで行う様に修正。これにより、DataBindingContextHolder はほとんどのケースで不要になった。BoundParameter に特別対応していないコントローでは依然として必要。
場所:
framework/trunk
ファイル:
11個の更新

凡例:

未変更
追加
削除
  • framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx

    r1608 r1611  
    182182                        <div> 
    183183                            DataTypeNames = [<%# ConvertToString(Eval("DataTypeNames")) %>] 
     184                        </div> 
     185 
     186                        <%-- DataType --%> 
     187                        <sff:ObjectDataSource ID="DataTypeViewDataSource" runat="server" 
     188                            TypeName="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage" 
     189                            AutoDetectDataObjectTypeName="True" 
     190                            SelectMethod="ListDataTypes"> 
     191                            <SelectParameters> 
     192                                <sff:BoundParameter Name="names" DataField="DataTypeNames" DbType="Object"/> 
     193                            </SelectParameters> 
     194                        </sff:ObjectDataSource> 
     195                        <div> 
     196                            <asp:GridView ID="DataTypeViewGridView" runat="server" 
     197                                DataSourceID="DataTypeViewDataSource" 
     198                                AutoGenerateColumns="True"/> 
    184199                        </div> 
    185200 
  • framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx.cs

    r1610 r1611  
    2828    using System.Collections.Specialized; 
    2929    using System.Diagnostics; 
     30    using System.Linq; 
    3031    using System.Text; 
    3132    using System.Web.UI.WebControls; 
     
    122123        /// データの一覧。 
    123124        /// </returns> 
    124         public static IList<ModeItem> ListMode() 
     125        public static IList<DataItem> ListMode() 
    125126        { 
    126127            return new[] 
    127128            { 
    128                 new ModeItem 
     129                new DataItem 
    129130                { 
    130131                    Id = null, 
    131132                    Name = null, 
    132133                }, 
    133                 new ModeItem 
     134                new DataItem 
    134135                { 
    135136                    Id = 0, 
    136137                    Name = "Mode-0", 
    137138                }, 
    138                 new ModeItem 
     139                new DataItem 
    139140                { 
    140141                    Id = 1, 
    141142                    Name = "Mode-1", 
    142143                }, 
    143                 new ModeItem 
     144                new DataItem 
    144145                { 
    145146                    Id = 2, 
    146147                    Name = "Mode-2", 
    147148                }, 
    148                 new ModeItem 
     149                new DataItem 
    149150                { 
    150151                    Id = 3, 
    151152                    Name = "Mode-3", 
    152153                }, 
    153                 new ModeItem 
     154                new DataItem 
    154155                { 
    155156                    Id = 4, 
     
    157158                }, 
    158159            }; 
     160        } 
     161 
     162        /// <summary> 
     163        /// データタイプ表示に使用する <see cref="ObjectDataSource"/> 
     164        /// のためにデータを取得します。 
     165        /// </summary> 
     166        /// <param name="names">データタイプの一覧。</param> 
     167        /// <returns> 
     168        /// データの一覧。 
     169        /// </returns> 
     170        public static IList<DataItem> ListDataTypes(string[] names) 
     171        { 
     172            return names.Select((name, index) => new DataItem { Id = index, Name = name }).ToList(); 
    159173        } 
    160174 
     
    971985 
    972986        /// <summary> 
    973         /// モード情報を表すクラスです。 
    974         /// </summary> 
    975         public class ModeItem 
     987        /// 汎用データを表すクラスです。 
     988        /// </summary> 
     989        public class DataItem 
    976990        { 
    977991            /// <summary> 
     
    9911005            /// インスタンスを作成します。 
    9921006            /// </summary> 
    993             public ModeItem() 
     1007            public DataItem() 
    9941008            { 
    9951009                // AVOID 
  • framework/trunk/WebApplication/UI/WebControls/TemplateFieldPage.aspx

    r1606 r1611  
    6969                            HeaderText="template"> 
    7070                            <ItemTemplate> 
    71                                 <sff:DataBindingContextHolder runat="server"> 
    72                                     Link: 
    73                                     <sff:HyperLink runat="server" 
    74                                         NavigateUrl="~/UI/WebControls/HyperLinkPageTarget.aspx" 
    75                                         NavigateMethod='<%# Eval("name") %>' 
    76                                         Text="HyperLink"> 
    77                                         <NavigateParameters> 
    78                                             <sff:BoundParameter Name="ID" DataField="system_type_id" /> 
    79                                             <sff:BoundParameter Name="Name" DataField="name" /> 
    80                                         </NavigateParameters> 
    81                                     </sff:HyperLink> 
    82                                 </sff:DataBindingContextHolder> 
     71                                Link: 
     72                                <sff:HyperLink runat="server" 
     73                                    NavigateUrl="~/UI/WebControls/HyperLinkPageTarget.aspx" 
     74                                    NavigateMethod='<%# Eval("name") %>' 
     75                                    Text="HyperLink"> 
     76                                    <NavigateParameters> 
     77                                        <sff:BoundParameter Name="ID" DataField="system_type_id" /> 
     78                                        <sff:BoundParameter Name="Name" DataField="name" /> 
     79                                    </NavigateParameters> 
     80                                </sff:HyperLink> 
    8381                            </ItemTemplate> 
    8482                        </sff:TemplateField> 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/BoundParameter.cs

    r1605 r1611  
    5454        private const string DataFieldKey = "DataField"; 
    5555 
    56  
    57         /// <summary> 
    58         /// データフィールドデスクリプタ。 
    59         /// </summary> 
    60         private PropertyDescriptor dataFieldDesc; 
     56        /// <summary> 
     57        /// <see cref="DataFormatString"/> プロパティ用のキー。 
     58        /// </summary> 
     59        private const string DataFormatStringKey = "DataFormatString"; 
     60 
     61 
     62        /// <summary> 
     63        /// バインドしたデータ。 
     64        /// </summary> 
     65        private object boundData; 
     66 
     67        /// <summary> 
     68        /// バインドしているかどうか。 
     69        /// </summary> 
     70        private bool alreadyBound; 
    6171 
    6272 
     
    155165 
    156166                ViewState[DataFieldKey] = value; 
    157                 dataFieldDesc = null; 
    158167                OnParameterChanged(); 
    159168            } 
    160169        } 
    161170 
     171        /// <summary> 
     172        /// パラメータに使用する値の書式を指定する文字列を取得または設定します。 
     173        /// </summary> 
     174        /// <value> 
     175        /// パラメータに使用する値の書式を指定する文字列。 
     176        /// </value> 
     177        [Themeable(false)] 
     178        [DefaultValue("")] 
     179        [WebCategory("Parameter")] 
     180        [WebDescription("Description_DataFormatString")] 
     181        public virtual string DataFormatString 
     182        { 
     183            get 
     184            { 
     185                return (string)(ViewState[DataFormatStringKey] ?? string.Empty); 
     186            } 
     187 
     188            set 
     189            { 
     190                if (DataFormatString == value) 
     191                { 
     192                    return; 
     193                } 
     194 
     195                ViewState[DataFormatStringKey] = value; 
     196                OnParameterChanged(); 
     197            } 
     198        } 
     199 
     200 
     201        /// <summary> 
     202        /// パラメータに対してデータをバインドします。 
     203        /// </summary> 
     204        /// <param name="container">評価に使用するオブジェクト参照。</param> 
     205        /// <param name="parameters">パラメータのコレクション。</param> 
     206        internal static void DataBind(object container, ParameterCollection parameters) 
     207        { 
     208            if (parameters == null || parameters.Count == 0) 
     209            { 
     210                return; 
     211            } 
     212 
     213            foreach (Parameter parameter in parameters) 
     214            { 
     215                BoundParameter boundParameter = parameter as BoundParameter; 
     216                if (boundParameter != null) 
     217                { 
     218                    boundParameter.DataBind(container); 
     219                } 
     220            } 
     221        } 
     222 
     223        /// <summary>データ ソース ビューの、以前保存したビューステートを復元します。</summary> 
     224        /// <param name="savedState">復元する <see cref="T:System.Web.UI.WebControls.Parameter" /> の状態を表す <see cref="T:System.Object" />。</param> 
     225        protected override void LoadViewState(object savedState) 
     226        { 
     227            if (savedState == null) 
     228            { 
     229                // 親を呼び出す 
     230                base.LoadViewState(null); 
     231                return; 
     232            } 
     233 
     234            Triplet triplet = (Triplet)savedState; 
     235 
     236            boundData = triplet.Second; 
     237            alreadyBound = (bool)triplet.Third; 
     238 
     239            // 親を呼び出す 
     240            base.LoadViewState(triplet.First); 
     241        } 
     242 
     243        /// <summary> 
     244        /// ページがサーバーにポストバックされた時間以降に発生した、 
     245        /// <see cref="BoundParameter" /> オブジェクトのビューステートへの変更を保存します。 
     246        /// </summary> 
     247        /// <returns> 
     248        /// <see cref="BoundParameter" /> のビューステートへの変更を格納する <see cref="object" />。 
     249        /// オブジェクトに関連付けられているビューステートがない場合、メソッドは <see langword="null"/> を返します。 
     250        /// </returns> 
     251        protected override object SaveViewState() 
     252        { 
     253            // 親を呼び出す 
     254            object baseViewState = base.SaveViewState(); 
     255 
     256            // バインドされておらず、親クラスのビューステートも無い場合 
     257            if (!alreadyBound && baseViewState == null) 
     258            { 
     259                return null; 
     260            } 
     261 
     262            return new Triplet(baseViewState, boundData, alreadyBound); 
     263        } 
    162264 
    163265        /// <summary> 
     
    197299            } 
    198300 
     301            if (alreadyBound) 
     302            { 
     303                return boundData; 
     304            } 
     305 
     306            // 以降は、DataBind() が呼ばれていない場合用 (主に HyperLinkField と BoundParameter に対応していないコントロール) 
    199307            string dataField = DataField; 
    200308            if (string.IsNullOrEmpty(dataField)) 
     
    209317            } 
    210318 
    211             if (dataFieldDesc == null) 
    212             { 
    213                 dataFieldDesc = TypeDescriptor.GetProperties(dataItem).Find(dataField, true); 
    214                 if (dataFieldDesc == null) 
    215                 { 
    216                     throw new HttpException(Utility.Format( 
    217                         Resources.Http_DataSourceFieldNotFound, 
    218                         dataField)); 
    219                 } 
    220             } 
    221  
    222             return dataFieldDesc.GetValue(dataItem); 
     319            return Eval(dataItem, dataField); 
     320        } 
     321 
     322        /// <summary> 
     323        /// データをバインドします。 
     324        /// </summary> 
     325        /// <param name="container">評価に使用するオブジェクト参照。</param> 
     326        private void DataBind(object container) 
     327        { 
     328            string dataField = DataField; 
     329            if (string.IsNullOrEmpty(dataField)) 
     330            { 
     331                return; 
     332            } 
     333 
     334            boundData = Eval(container, dataField); 
     335            alreadyBound = true; 
     336            SetDirty(); 
     337        } 
     338 
     339        /// <summary> 
     340        /// 式を評価して値を返します。 
     341        /// </summary> 
     342        /// <param name="container">評価に使用するオブジェクト参照。</param> 
     343        /// <param name="expression">評価式。</param> 
     344        /// <returns> 
     345        /// 評価結果。 
     346        /// </returns> 
     347        private object Eval(object container, string expression) 
     348        { 
     349            string dataFormatString = DataFormatString; 
     350            return string.IsNullOrEmpty(dataFormatString) 
     351                ? DataBinder.Eval(container, expression) 
     352                : DataBinder.Eval(container, expression, DataFormatString); 
    223353        } 
    224354    } 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/CommonDbDataSource.cs

    r1337 r1611  
    845845 
    846846        /// <summary> 
     847        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     848        /// </summary> 
     849        protected override void DataBindChildren() 
     850        { 
     851            // 親を呼び出す 
     852            base.DataBindChildren(); 
     853 
     854            // バインドが必要なパラメータにデータをバインド 
     855            BoundParameter.DataBind(Page.GetDataItem(), SelectParameters); 
     856        } 
     857 
     858        /// <summary> 
    847859        /// <see cref="CommonDbDataSource"/> インターフェイスに関連付けられた 
    848860        /// ビュー オブジェクトのリストを表す名前のコレクションを取得します。 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/DialogOpenButton.cs

    r1200 r1611  
    292292 
    293293        /// <summary> 
     294        /// コントロールへの変更の追跡および保存の開始点を、 
     295        /// コントロールのビューステートの一部としてマークします。 
     296        /// </summary> 
     297        protected override void TrackViewState() 
     298        { 
     299            // 親を呼び出す 
     300            base.TrackViewState(); 
     301 
     302            if (navigateParameters != null) 
     303            { 
     304                ((IStateManager)navigateParameters).TrackViewState(); 
     305            } 
     306        } 
     307 
     308        /// <summary> 
     309        /// <see cref="HyperLink"/> コントロールの保存された状態を読み込みます。 
     310        /// </summary> 
     311        /// <param name="savedState"> 
     312        /// <see cref="HyperLink"/> の保存された状態を格納している 
     313        /// <see cref="object"/>。 
     314        /// </param> 
     315        protected override void LoadViewState(object savedState) 
     316        { 
     317            if (savedState == null) 
     318            { 
     319                return; 
     320            } 
     321 
     322            Pair state = (Pair)savedState; 
     323 
     324            // 親を呼び出す 
     325            base.LoadViewState(state.First); 
     326 
     327            if (state.Second != null) 
     328            { 
     329                ((IStateManager)NavigateParameters).LoadViewState(state.Second); 
     330            } 
     331        } 
     332 
     333        /// <summary> 
     334        /// <see cref="HyperLink"/> コントロールの状態を格納します。 
     335        /// </summary> 
     336        /// <returns> 
     337        /// <see cref="HyperLink"/> の保存された状態を格納しているオブジェクト。 
     338        /// </returns> 
     339        protected override object SaveViewState() 
     340        { 
     341            // 親を呼び出す 
     342            Pair state = new Pair 
     343            { 
     344                First = base.SaveViewState(), 
     345            }; 
     346 
     347            if (navigateParameters != null) 
     348            { 
     349                state.Second = ((IStateManager)navigateParameters).SaveViewState(); 
     350            } 
     351 
     352            if (state.First == null && state.Second == null) 
     353            { 
     354                return null; 
     355            } 
     356 
     357            return state; 
     358        } 
     359 
     360        /// <summary> 
     361        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     362        /// </summary> 
     363        protected override void DataBindChildren() 
     364        { 
     365            // 親を呼び出す 
     366            base.DataBindChildren(); 
     367 
     368            // バインドが必要なパラメータにデータをバインド 
     369            BoundParameter.DataBind(Page.GetDataItem(), navigateParameters); 
     370        } 
     371 
     372        /// <summary> 
    294373        /// クライアント側で表示する前にポストバック イベントを生成するためのクライアント スクリプトを登録します。 
    295374        /// </summary> 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/Forwarder.cs

    r864 r1611  
    282282            return state; 
    283283        } 
     284 
     285        /// <summary> 
     286        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     287        /// </summary> 
     288        protected override void DataBindChildren() 
     289        { 
     290            // 親を呼び出す 
     291            base.DataBindChildren(); 
     292 
     293            // バインドが必要なパラメータにデータをバインド 
     294            BoundParameter.DataBind(Page.GetDataItem(), navigateParameters); 
     295        } 
    284296    } 
    285297} 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/HyperLink.cs

    r1200 r1611  
    355355 
    356356        /// <summary> 
     357        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     358        /// </summary> 
     359        protected override void DataBindChildren() 
     360        { 
     361            // 親を呼び出す 
     362            base.DataBindChildren(); 
     363 
     364            // バインドが必要なパラメータにデータをバインド 
     365            BoundParameter.DataBind(Page.GetDataItem(), navigateParameters); 
     366        } 
     367 
     368        /// <summary> 
    357369        /// ASP.NET ページ フレームワークによって呼び出され、 
    358370        /// コンポジション ベースの実装を使用するサーバー コントロールに、 
     
    390402        /// </summary> 
    391403        /// <param name="writer"> 
    392         /// クライアントで表示するための出力ストリーム。  
     404        /// クライアントで表示するための出力ストリーム。 
    393405        /// </param> 
    394406        protected override void AddAttributesToRender(HtmlTextWriter writer) 
     
    446458        /// </summary> 
    447459        /// <param name="writer"> 
    448         /// クライアントで表示するための出力ストリーム。  
     460        /// クライアントで表示するための出力ストリーム。 
    449461        /// </param> 
    450462        protected override void RenderContents(HtmlTextWriter writer) 
     
    518530        private sealed class ContentContainer : 
    519531            Control, 
    520             INamingContainer  
     532            INamingContainer 
    521533        { 
    522534            /// <summary> 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/LocalizedMessage.cs

    r864 r1611  
    5353        private bool visible; 
    5454 
    55   
     55 
    5656        /// <summary> 
    5757        /// インスタンスを作成します。 
     
    204204 
    205205        /// <summary> 
     206        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     207        /// </summary> 
     208        protected override void DataBindChildren() 
     209        { 
     210            // 親を呼び出す 
     211            base.DataBindChildren(); 
     212 
     213            // バインドが必要なパラメータにデータをバインド 
     214            BoundParameter.DataBind(Page.GetDataItem(), textParameters); 
     215        } 
     216 
     217        /// <summary> 
    206218        /// 提供されたクライアントに表示される内容を書き込む 
    207219        /// <see cref="HtmlTextWriter"/> オブジェクトに、サーバー コントロールの内容を送信します。 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/ObjectDataSource.cs

    r1608 r1611  
    109109 
    110110        /// <summary> 
     111        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     112        /// </summary> 
     113        protected override void DataBindChildren() 
     114        { 
     115            // 親を呼び出す 
     116            base.DataBindChildren(); 
     117 
     118            // バインドが必要なパラメータにデータをバインド 
     119            object dataItem = Page.GetDataItem(); 
     120            BoundParameter.DataBind(dataItem, SelectParameters); 
     121            BoundParameter.DataBind(dataItem, InsertParameters); 
     122            BoundParameter.DataBind(dataItem, UpdateParameters); 
     123            BoundParameter.DataBind(dataItem, DeleteParameters); 
     124            BoundParameter.DataBind(dataItem, FilterParameters); 
     125        } 
     126 
     127        /// <summary> 
    111128        /// <see cref="ParameterCollection"/> から名前のハッシュセットを取得します。 
    112129        /// </summary> 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/TinyMCE.cs

    r1586 r1611  
    468468 
    469469            return state; 
     470        } 
     471 
     472        /// <summary> 
     473        /// データ ソースをサーバー コントロールの子コントロールにバインドします。 
     474        /// </summary> 
     475        protected override void DataBindChildren() 
     476        { 
     477            // 親を呼び出す 
     478            base.DataBindChildren(); 
     479 
     480            // バインドが必要なパラメータにデータをバインド 
     481            BoundParameter.DataBind(Page.GetDataItem(), initializeParameters); 
    470482        } 
    471483 
詳しい使い方は TracChangeset を参照してください。