チェンジセット 1608 (default)


以下の違いを無視:
日時:
2023/09/10 17:08:11 (13ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • FormView + バインドのサンプルを強化。
  • ObjectDataSource で DataObjectTypeName を SelectMethod から推測する機能を追加。
  • DateBox, NumericBox, TimeBox に RenderingMode プロパティを追加し、ブラウザネイティブでコントロールを描画できるように機能追加。
  • DateBox に最小日と最大日を指摘でいるように機能を追加。
場所:
framework/trunk
ファイル:
4個の追加
9個の更新

凡例:

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

    r1604 r1608  
    44    Inherits="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage" 
    55%> 
     6<%@ Register 
     7    tagPrefix="uc" 
     8    tagName="UserControl1" 
     9    src="FormViewBindUserControl1.ascx" %> 
     10<%@ Import Namespace="System" %> 
     11<%@ Import Namespace="FCSoft.SilverFrost.Framework.Web" %> 
    612 
    713<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     
    915<html xmlns="http://www.w3.org/1999/xhtml"> 
    1016<head runat="server"> 
    11     <title>SelectFieldTest (in the ASPX)</title> 
     17    <title>FormViewBind (in the ASPX)</title> 
    1218    <link rel="stylesheet" href="../../Styles/main.css" type="text/css" /> 
    1319</head> 
     
    1622        <div class="test test-webcontrols"> 
    1723 
    18             <h1>UnitTestWeb/UI/WebControls/SelectFieldPage.aspx</h1> 
     24            <h1>UnitTestWeb/UI/WebControls/FormViewBindPage.aspx</h1> 
    1925 
    2026            <asp:Button ID="PostBackButton" runat="server" 
     
    2632            <div> 
    2733                <asp:ValidationSummary runat="server" 
     34                    ValidationGroup="Edit" 
    2835                    BackColor="Red"/> 
    2936 
    3037 
    31                 <asp:ObjectDataSource ID="OuterDataSource" runat="server" 
    32                     TypeName="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage" 
    33                     DataObjectTypeName="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage+Data" 
     38                <sff:ObjectDataSource ID="OuterDataSource" runat="server" 
     39                    TypeName="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage+DataManager" 
     40                    AutoDetectDataObjectTypeName="True" 
    3441                    SelectMethod="GetData" 
    35                     UpdateMethod="UpdateData"/> 
     42                    InsertMethod="InsertData" 
     43                    UpdateMethod="UpdateData" 
     44                    DeleteMethod="DeleteData"/> 
    3645 
    3746                <%-- Mode --%> 
     
    5463                <asp:FormView runat="server" 
    5564                    DataSourceID="OuterDataSource" 
    56                     DefaultMode="Edit" 
    5765                    DataKeyNames="Key" 
     66                    AllowPaging="True" 
     67                    RenderOuterTable="False" 
     68                    OnModeChanging="OnModeChanging" 
     69                    OnModeChanged="OnModeChanged" 
     70                    OnCallingDataMethods="OnCallingDataMethods" 
     71                    OnCreatingModelDataSource="OnCreatingModelDataSource" 
     72                    OnPageIndexChanging="OnPageIndexChanging" 
     73                    OnPageIndexChanged="OnPageIndexChanged" 
     74                    OnItemCommand="OnItemCommand" 
     75                    OnItemCreated="OnItemCreated" 
     76                    OnItemInserting="OnItemInserting" 
     77                    OnItemInserted="OnItemInserted" 
    5878                    OnItemUpdating="OnItemUpdating" 
    59                     OnItemUpdated="OnItemUpdated"> 
     79                    OnItemUpdated="OnItemUpdated" 
     80                    OnItemDeleting="OnItemDeleting" 
     81                    OnItemDeleted="OnItemDeleted"> 
     82 
     83                    <%-- ヘッダー --%> 
     84                    <HeaderTemplate> 
     85                        <div> 
     86                            Header: 
     87                            <asp:Button runat="server" 
     88                                CommandName="New" 
     89                                Text="新規"/> 
     90                        </div> 
     91                    </HeaderTemplate> 
     92 
     93 
     94                    <%-- データ無しモード --%> 
     95                    <EmptyDataTemplate> 
     96 
     97                        <h4>Empty Mode</h4> 
     98 
     99                        <div> 
     100                            No data! 
     101                        </div> 
     102 
     103                    </EmptyDataTemplate> 
     104 
     105 
     106                    <%-- 表示モード --%> 
     107                    <ItemTemplate> 
     108 
     109                        <h4>View Mode</h4> 
     110 
     111                        <%-- Key --%> 
     112                        <div> 
     113                            Key = [<%# Eval("Key") %>] 
     114                        </div> 
     115 
     116                        <%-- Mode --%> 
     117                        <div> 
     118                            Mode = [<%# Eval("Mode") %>] 
     119                        </div> 
     120 
     121                        <%-- Enabled --%> 
     122                        <div> 
     123                            Enabled = [<%# Eval("Enabled") %>] 
     124                        </div> 
     125 
     126                        <%-- Gender --%> 
     127                        <div> 
     128                            Gender = [<%# Eval("Gender") %>] 
     129                        </div> 
     130 
     131                        <%-- Age --%> 
     132                        <div> 
     133                            Age = [<%# Eval("Age") %>] 
     134                        </div> 
     135 
     136                        <%-- Score --%> 
     137                        <div> 
     138                            Score = [<%# Eval("Score") %>] 
     139                        </div> 
     140 
     141                        <%-- FromDate --%> 
     142                        <div> 
     143                            FromDate = [<%# Eval("FromDate", "{0:D}") %>] 
     144                        </div> 
     145 
     146                        <%-- ToDate --%> 
     147                        <div> 
     148                            ToDate = [<%# Eval("ToDate", "{0:D}") %>] 
     149                        </div> 
     150 
     151                        <%-- WaitTime --%> 
     152                        <div> 
     153                            ToDate = [<%# Eval("WaitTime") %>] 
     154                        </div> 
     155 
     156                        <%-- Color --%> 
     157                        <div> 
     158                            Color = [<%# Eval("Color") %>] 
     159                        </div> 
     160 
     161                        <%-- Description --%> 
     162                        <div> 
     163                            Description = [<%# WebUtility.HtmlEncode(Eval("Description"), true, true, true) %>] 
     164                        </div> 
     165 
     166                        <%-- ZipCode --%> 
     167                        <div> 
     168                            ZipCode = [<%# Eval("ZipCode") %>] 
     169                        </div> 
     170 
     171                        <%-- UseDetail --%> 
     172                        <div> 
     173                            UseDetail = [<%# Eval("UseDetail") %>] 
     174                        </div> 
     175 
     176                        <%-- DetailLabel --%> 
     177                        <div> 
     178                            DetailLabel = [<%# WebUtility.HtmlEncode(Eval("DetailLabel"), true, true, true) %>] 
     179                        </div> 
     180 
     181                        <%-- DataType --%> 
     182                        <div> 
     183                            DataTypeNames = [<%# ConvertToString(Eval("DataTypeNames")) %>] 
     184                        </div> 
     185 
     186                        <%-- Button --%> 
     187                        <div> 
     188                            <asp:Button runat="server" 
     189                                CommandName="Edit" 
     190                                Text="編集"/> 
     191                            <asp:Button runat="server" 
     192                                CommandName="Delete" 
     193                                Text="削除"/> 
     194                        </div> 
     195 
     196                    </ItemTemplate> 
     197 
     198 
     199                    <%-- 追加モード --%> 
     200                    <InsertItemTemplate> 
     201 
     202                        <h4>Insert Mode</h4> 
     203 
     204                        <%-- Mode --%> 
     205                        <div> 
     206                            <asp:DropDownList ID="ModeDropDownList" runat="server" 
     207                                DataSourceID="ModeDataSource" 
     208                                DataValueField="Id" 
     209                                DataTextField="Name" 
     210                                SelectedValue='<%# Bind("Mode") %>'/> 
     211                            <asp:RequiredFieldValidator runat="server" 
     212                                ControlToValidate="ModeDropDownList" 
     213                                ValidationGroup="Insert" 
     214                                SetFocusOnError="True" 
     215                                Text="(Require!)" 
     216                                ErrorMessage="Mode required."/> 
     217                        </div> 
     218 
     219                        <%-- Button --%> 
     220                        <div> 
     221                            <asp:Button runat="server" 
     222                                CommandName="Insert" 
     223                                ValidationGroup="Insert" 
     224                                Text="追加"/> 
     225                            <asp:Button runat="server" 
     226                                CommandName="Cancel" 
     227                                Text="キャンセル"/> 
     228                        </div> 
     229 
     230                    </InsertItemTemplate> 
     231 
     232 
     233                    <%-- 編集モード --%> 
    60234                    <EditItemTemplate> 
    61235 
     236                        <h4>Edit Mode</h4> 
     237 
    62238                        <%-- Key --%> 
    63                         Key = [<%# Eval("Key") %>] 
     239                        <div> 
     240                            Key = [<%# Eval("Key") %>] 
     241                        </div> 
    64242 
    65243                        <%-- Mode --%> 
    66                         <asp:DropDownList ID="ModeDropDownList" runat="server" 
    67                             DataSourceID="ModeDataSource" 
    68                             DataValueField="Id" 
    69                             DataTextField="Name" 
    70                             SelectedValue='<%# Bind("Mode") %>'/> 
    71                         <asp:RequiredFieldValidator runat="server" 
    72                             ControlToValidate="ModeDropDownList" 
    73                             SetFocusOnError="True" 
    74                             Text="(Require!)" 
    75                             ErrorMessage="Mode required."/> 
     244                        <div> 
     245                            <asp:DropDownList ID="ModeDropDownList" runat="server" 
     246                                DataSourceID="ModeDataSource" 
     247                                DataValueField="Id" 
     248                                DataTextField="Name" 
     249                                SelectedValue='<%# Bind("Mode") %>'/> 
     250                            <asp:RequiredFieldValidator runat="server" 
     251                                ControlToValidate="ModeDropDownList" 
     252                                ValidationGroup="Edit" 
     253                                SetFocusOnError="True" 
     254                                Text="(Require!)" 
     255                                ErrorMessage="Mode required."/> 
     256                        </div> 
     257 
     258                        <%-- Enabled --%> 
     259                        <div> 
     260                            <asp:CheckBox ID="EnabledCheckBox" runat="server" 
     261                                Text="Enabled" 
     262                                Checked='<%# Bind("Enabled") %>'/> 
     263                        </div> 
     264 
     265                        <%-- Gender --%> 
     266                        <div> 
     267                            <asp:RadioButtonList ID="GenderRadioButtonList" runat="server" 
     268                                RepeatLayout="Table" 
     269                                RepeatDirection="Horizontal" 
     270                                SelectedValue='<%# Bind("Gender") %>'> 
     271                                <Items> 
     272                                    <asp:ListItem Value="" Text="(未設定)"/> 
     273                                    <asp:ListItem Value="M" Text="男性"/> 
     274                                    <asp:ListItem Value="F" Text="女性"/> 
     275                                    <asp:ListItem Value="x" Text="回答しない"/> 
     276                                </Items> 
     277                            </asp:RadioButtonList> 
     278                        </div> 
     279 
     280                        <%-- Age --%> 
     281                        <div> 
     282                            <sff:NumericBox ID="AgeNumericBox" runat="server" 
     283                                RenderingMode="Browser" 
     284                                MinimumValue="-10" 
     285                                MaximumValue="99" 
     286                                Int32Value='<%# Bind("Age") %>'/> 
     287                        </div> 
     288 
     289                        <%-- Score --%> 
     290                        <div> 
     291                            <sff:NumericBox ID="ScoreNumericBox" runat="server" 
     292                                RenderingMode="Browser" 
     293                                MinimumValue="0" 
     294                                MaximumValue="10" 
     295                                StepValue="0.1" 
     296                                DecimalPosition="1" 
     297                                Value='<%# Bind("Score") %>'/> 
     298                        </div> 
     299 
     300                        <%-- FromDate --%> 
     301                        <div> 
     302                            <sff:DateBox ID="FromDateBox" runat="server" 
     303                                ButtonText="..." 
     304                                MinimumValue='<%# DateTime.Today.AddMonths(-1) %>' 
     305                                MaximumValue='<%# DateTime.Today.AddMonths(3) %>' 
     306                                Value='<%# Bind("FromDate") %>'/> 
     307                            <sff:DateBoxValidator ID="FromDateBoxRegularExpressionValidator" runat="server" 
     308                                ControlToValidate="FromDateBox" 
     309                                ValidationGroup="Edit" 
     310                                SetFocusOnError="true" 
     311                                Text="(FromForamt!)" 
     312                                ErrorMessage="From date invalid format."/> 
     313                        </div> 
     314 
     315                        <%-- ToDate --%> 
     316                        <div> 
     317                            <sff:DateBox ID="ToDateBox" runat="server" 
     318                                RenderingMode="Browser" 
     319                                MinimumValue='<%# DateTime.Today.AddMonths(-1) %>' 
     320                                MaximumValue='<%# DateTime.Today.AddMonths(3) %>' 
     321                                Value='<%# Bind("ToDate") %>'/> 
     322                            <sff:DateBoxValidator ID="ToDateBoxRegularExpressionValidator" runat="server" 
     323                                ControlToValidate="ToDateBox" 
     324                                ValidationGroup="Edit" 
     325                                SetFocusOnError="true" 
     326                                Text="(ToForamt!)" 
     327                                ErrorMessage="To date invalid format."/> 
     328                        </div> 
     329 
     330                        <%-- WaitTime --%> 
     331                        <div> 
     332                            <sff:TimeBox ID="WaitTimeBox" runat="server" 
     333                                RenderingMode="Browser" 
     334                                Value='<%# Bind("WaitTime") %>'/> 
     335                        </div> 
     336 
     337                        <%-- Color --%> 
     338                        <div> 
     339                            <asp:TextBox ID="ColorTextBox" runat="server" 
     340                                TextMode="Color" 
     341                                Text='<%# Bind("Color") %>'/> 
     342                        </div> 
     343 
     344                        <%-- Description --%> 
     345                        <div> 
     346                            <asp:TextBox ID="DescriptionTextBox" runat="server" 
     347                                TextMode="MultiLine" 
     348                                Text='<%# Bind("Description") %>'/> 
     349                        </div> 
     350 
     351                        <%-- UserControl1 --%> 
     352                        <div> 
     353                            <uc:UserControl1 ID="UserControl1" runat="server" 
     354                                ValidationGroup="Edit" 
     355                                ZipCode='<%# Bind("ZipCode") %>'/> 
     356                        </div> 
     357 
     358                        <%-- UseDetail --%> 
     359                        <div> 
     360                            <asp:CheckBox ID="UseDetailCheckBox" runat="server" 
     361                                Text="UseDetail" 
     362                                AutoPostBack="True" 
     363                                OnCheckedChanged="UseDetailCheckBox_OnCheckedChanged" 
     364                                Checked='<%# Bind("UseDetail") %>'/> 
     365 
     366                            <asp:PlaceHolder ID="DetailPlaceHolder" runat="server" 
     367                                Visible='<%# Eval("UseDetail") %>'> 
     368 
     369                                <h5>Detail</h5> 
     370 
     371                                <%-- DetailLabel --%> 
     372                                <div> 
     373                                    <asp:TextBox ID="DetailLabelTextBox" runat="server" 
     374                                        Text='<%# Bind("DetailLabel") %>'/> 
     375                                    <asp:RequiredFieldValidator runat="server" 
     376                                        ControlToValidate="DetailLabelTextBox" 
     377                                        ValidationGroup="Edit" 
     378                                        SetFocusOnError="True" 
     379                                        Text="(Require!)" 
     380                                        ErrorMessage="DetailLabel required."/> 
     381                                </div> 
     382 
     383                            </asp:PlaceHolder> 
     384                        </div> 
    76385 
    77386                        <%-- DataType --%> 
    78                         <sff:GridView ID="DataTypeGridView" runat="server" 
    79                             DataSourceID="DataTypeDataSource" 
    80                             AutoGenerateColumns="false" 
    81                             DataKeyNames="name" 
    82                             SelectedValues='<%# Bind("DataTypeNames") %>'> 
    83                             <Columns> 
    84                                 <sff:SelectField /> 
    85                                 <sff:BoundField 
    86                                     HeaderText="name" 
    87                                     DataField="name" 
    88                                     HtmlEncode="true" /> 
    89                                 <sff:BoundField 
    90                                     HeaderText="system_type_id" 
    91                                     DataField="system_type_id" 
    92                                     HtmlEncode="true" /> 
    93                                 <sff:BoundField 
    94                                     HeaderText="schema_name" 
    95                                     DataField="schema_name" 
    96                                     HtmlEncode="true" /> 
    97                                 <sff:BoundField 
    98                                     HeaderText="max_length" 
    99                                     DataField="max_length" 
    100                                     HtmlEncode="true" /> 
    101                             </Columns> 
    102                         </sff:GridView> 
    103  
     387                        <div> 
     388                            <sff:GridView ID="DataTypeGridView" runat="server" 
     389                                DataSourceID="DataTypeDataSource" 
     390                                AutoGenerateColumns="false" 
     391                                DataKeyNames="name" 
     392                                SelectedValues='<%# Bind("DataTypeNames") %>'> 
     393                                <Columns> 
     394                                    <sff:SelectField /> 
     395                                    <sff:BoundField 
     396                                        HeaderText="name" 
     397                                        DataField="name" 
     398                                        HtmlEncode="true" /> 
     399                                    <sff:BoundField 
     400                                        HeaderText="system_type_id" 
     401                                        DataField="system_type_id" 
     402                                        HtmlEncode="true" /> 
     403                                    <sff:BoundField 
     404                                        HeaderText="schema_name" 
     405                                        DataField="schema_name" 
     406                                        HtmlEncode="true" /> 
     407                                    <sff:BoundField 
     408                                        HeaderText="max_length" 
     409                                        DataField="max_length" 
     410                                        HtmlEncode="true" /> 
     411                                </Columns> 
     412                            </sff:GridView> 
     413                        </div> 
    104414 
    105415                        <%-- Button --%> 
    106                         <asp:Button runat="server" 
    107                             CommandName="Update" 
    108                             Text="更新"/> 
     416                        <div> 
     417                            <asp:Button runat="server" 
     418                                CommandName="Update" 
     419                                ValidationGroup="Edit" 
     420                                Text="更新"/> 
     421                            <asp:Button runat="server" 
     422                                CommandName="Delete" 
     423                                Text="削除"/> 
     424                            <asp:Button runat="server" 
     425                                CommandName="Cancel" 
     426                                Text="キャンセル"/> 
     427                        </div> 
    109428 
    110429                    </EditItemTemplate> 
  • framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx.cs

    r1604 r1608  
    2626    using System.Collections; 
    2727    using System.Collections.Generic; 
     28    using System.Collections.Specialized; 
    2829    using System.Diagnostics; 
    29     using System.Web; 
    30     using System.Web.UI; 
     30    using System.Text; 
    3131    using System.Web.UI.WebControls; 
    3232    using FCSoft.SilverFrost.Framework.ComponentModel; 
     
    4141        Page 
    4242    { 
    43         /// <summary> 
    44         /// 更新されたデータを識別するキー。 
    45         /// </summary> 
    46         private static readonly NamedObject UpdatedDataKey = new NamedObject("UpdatedData"); 
    47  
    48  
    4943#pragma warning disable 169 // CS0169 フィールド xxx は使用されませんでした。 
    5044#pragma warning disable 649 // CS0649 xxx は割り当てられません。常に既定値 null を使用します。 
     
    6963 
    7064 
    71         /// <summary> 
    72         /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
    73         /// の為にデータを取得します。 
    74         /// </summary> 
     65 
     66        /// <summary> 
     67        /// オブジェクトを文字列表現に変換します。 
     68        /// </summary> 
     69        /// <param name="value">オブジェクト。</param> 
    7570        /// <returns> 
    76         /// データの一覧 
     71        /// <paramref name="value"/> の文字列表現 
    7772        /// </returns> 
    78         public static IList<Data> GetData() 
    79         { 
    80             object updatedData = HttpContext.Current.Items[UpdatedDataKey]; 
    81             if (updatedData != null) 
    82             { 
    83                 return new[] 
    84                 { 
    85                     (Data)updatedData, 
    86                 }; 
    87             } 
    88  
    89             return new[] 
    90             { 
    91                 new Data 
    92                 { 
    93                     Key = "Key1", 
    94                     Mode = 2, 
    95                     DataTypeNames = new[] 
    96                     { 
    97                         "bit", 
    98                         "int", 
    99                         "real", 
    100                         "char", 
    101                     }, 
    102                 } 
    103             }; 
    104         } 
    105  
    106         /// <summary> 
    107         /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
    108         /// の為にデータを更新します。 
    109         /// </summary> 
    110         /// <param name="data">更新するデータ。</param> 
    111         public static void UpdateData(Data data) 
    112         { 
    113             HttpContext.Current.Items[UpdatedDataKey] = data; 
     73        public static string ConvertToString(object value) 
     74        { 
     75            if (value == null) 
     76            { 
     77                return null; 
     78            } 
     79 
     80            string stringValue = value as string; 
     81            if (stringValue != null) 
     82            { 
     83                return stringValue; 
     84            } 
     85 
     86            IEnumerable enumerable = value as IEnumerable; 
     87            if (enumerable == null) 
     88            { 
     89                return value.ToString(); 
     90            } 
     91 
     92            StringBuilder builder = new StringBuilder(); 
     93            foreach (object element in enumerable) 
     94            { 
     95                if (builder.Length == 0) 
     96                { 
     97                    builder.Append('{'); 
     98                } 
     99                else 
     100                { 
     101                    builder.Append(", "); 
     102                } 
     103 
     104                builder.Append(element); 
     105            } 
     106 
     107            if (builder.Length == 0) 
     108            { 
     109                return "{}"; 
     110            } 
     111 
     112            builder.Append('}'); 
     113            return builder.ToString(); 
    114114        } 
    115115 
     
    161161 
    162162        /// <summary> 
     163        /// <see cref="System.Web.UI.WebControls.FormView.ItemCreated"/> イベントハンドラです。 
     164        /// </summary> 
     165        /// <param name="sender">イベントのソース。</param> 
     166        /// <param name="e">イベント データを格納している <see cref="EventArgs"/>。</param> 
     167        protected void OnItemCreated(object sender, EventArgs e) 
     168        { 
     169            Logger.Debug(90000, "# FormView.OnItemCreated"); 
     170        } 
     171 
     172        /// <summary> 
     173        /// <see cref="System.Web.UI.WebControls.FormView.ItemCommand"/> イベントハンドラです。 
     174        /// </summary> 
     175        /// <param name="sender">イベントのソース。</param> 
     176        /// <param name="e">イベント データを格納している <see cref="FormViewCommandEventArgs"/>。</param> 
     177        protected void OnItemCommand(object sender, FormViewCommandEventArgs e) 
     178        { 
     179            Logger.Debug(90000, "# FormView.OnItemCommand"); 
     180            Logger.Debug(90000, "      CommandName: {0}", e.CommandName); 
     181            Logger.Debug(90000, "  CommandArgument: {0}", e.CommandArgument); 
     182            Logger.Debug(90000, "          Handled: {0}", e.Handled); 
     183        } 
     184 
     185        /// <summary> 
     186        /// <see cref="System.Web.UI.WebControls.FormView.ItemInserting"/> イベントハンドラです。 
     187        /// </summary> 
     188        /// <param name="sender">イベントのソース。</param> 
     189        /// <param name="e">イベント データを格納している <see cref="FormViewInsertEventArgs"/>。</param> 
     190        protected void OnItemInserting(object sender, FormViewInsertEventArgs e) 
     191        { 
     192            Logger.Debug(90000, "# FormView.OnItemInserting"); 
     193            Dump(90000, "Values", e.Values); 
     194        } 
     195 
     196        /// <summary> 
     197        /// <see cref="System.Web.UI.WebControls.FormView.ItemInserted"/> イベントハンドラです。 
     198        /// </summary> 
     199        /// <param name="sender">イベントのソース。</param> 
     200        /// <param name="e">イベント データを格納している <see cref="FormViewInsertedEventArgs"/>。</param> 
     201        protected void OnItemInserted(object sender, FormViewInsertedEventArgs e) 
     202        { 
     203            Logger.Debug(90000, "# FormView.OnItemInserted"); 
     204            Logger.Debug(90000, "      AffectedRows: {0}", e.AffectedRows); 
     205            Logger.Debug(90000, "  KeepInInsertMode: {0}", e.KeepInInsertMode); 
     206            Logger.Debug(90000, "  ExceptionHandled: {0}", e.ExceptionHandled); 
     207            Logger.Debug(90000, "         Exception: {0}", e.Exception); 
     208        } 
     209 
     210        /// <summary> 
    163211        /// <see cref="System.Web.UI.WebControls.FormView.ItemUpdating"/> イベントハンドラです。 
    164212        /// </summary> 
     
    168216        { 
    169217            Logger.Debug(90000, "# FormView.OnItemUpdating"); 
    170  
    171             foreach (DictionaryEntry entry in e.Keys) 
    172             { 
    173                 Logger.Debug(90001, "Keys: '{0}'='{1}'", entry.Key, entry.Value); 
    174             } 
    175  
    176             foreach (DictionaryEntry entry in e.OldValues) 
    177             { 
    178                 Logger.Debug(90002, "OldValues: '{0}'='{1}'", entry.Key, entry.Value); 
    179             } 
    180  
    181             foreach (DictionaryEntry entry in e.NewValues) 
    182             { 
    183                 Logger.Debug(90003, "NewValues: '{0}'='{1}'", entry.Key, entry.Value); 
    184             } 
     218            Dump(90000, "Keys", e.Keys); 
     219            Dump(90000, "OldValues", e.OldValues); 
     220            Dump(90000, "NewValues", e.NewValues); 
    185221        } 
    186222 
     
    189225        /// </summary> 
    190226        /// <param name="sender">イベントのソース。</param> 
    191         /// <param name="e">イベント データを格納している <see cref="FormViewUpdateEventArgs"/>。</param> 
     227        /// <param name="e">イベント データを格納している <see cref="FormViewUpdatedEventArgs"/>。</param> 
    192228        protected void OnItemUpdated(object sender, FormViewUpdatedEventArgs e) 
    193229        { 
    194230            Logger.Debug(90000, "# FormView.OnItemUpdated"); 
    195  
    196             e.KeepInEditMode = true; 
    197             foreach (DictionaryEntry entry in e.Keys) 
    198             { 
    199                 Logger.Debug(90011, "Keys: '{0}'='{1}'", entry.Key, entry.Value); 
    200             } 
    201  
    202             foreach (DictionaryEntry entry in e.OldValues) 
    203             { 
    204                 Logger.Debug(90012, "OldValues: '{0}'='{1}'", entry.Key, entry.Value); 
    205             } 
    206  
    207             foreach (DictionaryEntry entry in e.NewValues) 
    208             { 
    209                 Logger.Debug(90013, "NewValues: '{0}'='{1}'", entry.Key, entry.Value); 
    210             } 
    211         } 
     231            Logger.Debug(90000, "      AffectedRows: {0}", e.AffectedRows); 
     232            Logger.Debug(90000, "    KeepInEditMode: {0}", e.KeepInEditMode); 
     233            Logger.Debug(90000, "  ExceptionHandled: {0}", e.ExceptionHandled); 
     234            Logger.Debug(90000, "         Exception: {0}", e.Exception); 
     235            Dump(90000, "     Keys", e.Keys); 
     236            Dump(90000, "OldValues", e.OldValues); 
     237            Dump(90000, "NewValues", e.NewValues); 
     238        } 
     239 
     240        /// <summary> 
     241        /// <see cref="System.Web.UI.WebControls.FormView.ItemDeleting"/> イベントハンドラです。 
     242        /// </summary> 
     243        /// <param name="sender">イベントのソース。</param> 
     244        /// <param name="e">イベント データを格納している <see cref="FormViewDeleteEventArgs"/>。</param> 
     245        protected void OnItemDeleting(object sender, FormViewDeleteEventArgs e) 
     246        { 
     247            Logger.Debug(90000, "# FormView.OnItemDeleting"); 
     248            Logger.Debug(90000, "          RowIndex: {0}", e.RowIndex); 
     249            Dump(90000, "     Keys", e.Keys); 
     250            Dump(90000, "   Values", e.Values); 
     251        } 
     252 
     253        /// <summary> 
     254        /// <see cref="System.Web.UI.WebControls.FormView.ItemDeleted"/> イベントハンドラです。 
     255        /// </summary> 
     256        /// <param name="sender">イベントのソース。</param> 
     257        /// <param name="e">イベント データを格納している <see cref="FormViewDeletedEventArgs"/>。</param> 
     258        protected void OnItemDeleted(object sender, FormViewDeletedEventArgs e) 
     259        { 
     260            Logger.Debug(90000, "# FormView.OnItemDeleted"); 
     261            Logger.Debug(90000, "          RowIndex: {0}", e.AffectedRows); 
     262            Logger.Debug(90000, "  ExceptionHandled: {0}", e.ExceptionHandled); 
     263            Logger.Debug(90000, "         Exception: {0}", e.Exception); 
     264            Dump(90000, "     Keys", e.Keys); 
     265            Dump(90000, "   Values", e.Values); 
     266        } 
     267 
     268        /// <summary> 
     269        /// <see cref="System.Web.UI.WebControls.FormView.ModeChanging"/> イベントハンドラです。 
     270        /// </summary> 
     271        /// <param name="sender">イベントのソース。</param> 
     272        /// <param name="e">イベント データを格納している <see cref="FormViewModeEventArgs"/>。</param> 
     273        protected void OnModeChanging(object sender, FormViewModeEventArgs e) 
     274        { 
     275            Logger.Debug(90000, "# FormView.OnModeChanging"); 
     276            Logger.Debug(90000, "          NewMode: {0}", e.NewMode); 
     277            Logger.Debug(90000, "    CancelingEdit: {0}", e.CancelingEdit); 
     278        } 
     279 
     280        /// <summary> 
     281        /// <see cref="System.Web.UI.WebControls.FormView.ModeChanged"/> イベントハンドラです。 
     282        /// </summary> 
     283        /// <param name="sender">イベントのソース。</param> 
     284        /// <param name="e">イベント データを格納している <see cref="EventArgs"/>。</param> 
     285        protected void OnModeChanged(object sender, EventArgs e) 
     286        { 
     287            Logger.Debug(90000, "# FormView.OnModeChanged"); 
     288        } 
     289 
     290        /// <summary> 
     291        /// <see cref="System.Web.UI.WebControls.FormView.PageIndexChanging"/> イベントハンドラです。 
     292        /// </summary> 
     293        /// <param name="sender">イベントのソース。</param> 
     294        /// <param name="e">イベント データを格納している <see cref="FormViewPageEventArgs"/>。</param> 
     295        protected void OnPageIndexChanging(object sender, FormViewPageEventArgs e) 
     296        { 
     297            Logger.Debug(90000, "# FormView.OnPageIndexChanging"); 
     298            Logger.Debug(90000, "     NewPageIndex: {0}", e.NewPageIndex); 
     299        } 
     300 
     301        /// <summary> 
     302        /// <see cref="System.Web.UI.WebControls.FormView.PageIndexChanged"/> イベントハンドラです。 
     303        /// </summary> 
     304        /// <param name="sender">イベントのソース。</param> 
     305        /// <param name="e">イベント データを格納している <see cref="EventArgs"/>。</param> 
     306        protected void OnPageIndexChanged(object sender, EventArgs e) 
     307        { 
     308            Logger.Debug(90000, "# FormView.OnPageIndexChanged"); 
     309        } 
     310 
     311        /// <summary> 
     312        /// <see cref="OnCallingDataMethods"/> イベントハンドラです。 
     313        /// </summary> 
     314        /// <param name="sender">イベントのソース。</param> 
     315        /// <param name="e">イベント データを格納している <see cref="CallingDataMethodsEventArgs"/>。</param> 
     316        protected void OnCallingDataMethods(object sender, CallingDataMethodsEventArgs e) 
     317        { 
     318            Logger.Debug(90000, "# FormView.OnCallingDataMethods"); 
     319            Logger.Debug(90000, "  DataMethodsType: {0}", e.DataMethodsType); 
     320            Logger.Debug(90000, "DataMethodsObject: {0}", e.DataMethodsObject); 
     321        } 
     322 
     323        /// <summary> 
     324        /// <see cref="OnCreatingModelDataSource"/> イベントハンドラです。 
     325        /// </summary> 
     326        /// <param name="sender">イベントのソース。</param> 
     327        /// <param name="e">イベント データを格納している <see cref="CreatingModelDataSourceEventArgs"/>。</param> 
     328        protected void OnCreatingModelDataSource(object sender, CreatingModelDataSourceEventArgs e) 
     329        { 
     330            Logger.Debug(90000, "# FormView.OnCreatingModelDataSource"); 
     331            Logger.Debug(90000, "  ModelDataSource: {0}", e.ModelDataSource); 
     332        } 
     333 
     334        /// <summary> 
     335        /// ログに出力します。 
     336        /// </summary> 
     337        /// <param name="id">ログID。</param> 
     338        /// <param name="label">ログのラベル。</param> 
     339        /// <param name="dictionary">ログに記録するディクショナリ。</param> 
     340        private void Dump(int id, string label, IOrderedDictionary dictionary) 
     341        { 
     342            foreach (DictionaryEntry entry in dictionary) 
     343            { 
     344                Logger.Debug(id, "{0,17}: [{1}]=[{2}]", label, entry.Key, ConvertToString(entry.Value)); 
     345            } 
     346        } 
     347 
     348 
     349 
     350        /// <summary> 
     351        /// データを操作するクラスです。 
     352        /// </summary> 
     353        public static class DataManager 
     354        { 
     355            /// <summary> 
     356            /// 同期ルート。 
     357            /// </summary> 
     358            private static readonly object SyncRoot = new object(); 
     359 
     360            /// <summary> 
     361            /// 更新されたデータを識別するキー。 
     362            /// </summary> 
     363            private static readonly DataCollection DataList = new DataCollection 
     364            { 
     365                new Data 
     366                { 
     367                    Mode = 1, 
     368                    Enabled = true, 
     369                    Gender = "M", 
     370                    Age = 19, 
     371                    Score = 3.5, 
     372                    FromDate = DateTime.Today, 
     373                    ToDate = DateTime.Today.AddDays(20), 
     374                    WaitTime = (60 * 2) + 5, 
     375                    Color = "#FF0000", 
     376                    Description = "long text1\nlong text2", 
     377                    ZipCode = "100-0001", 
     378                    UseDetail = true, 
     379                    DetailLabel = "Fanny", 
     380                    DataTypeNames = new[] 
     381                    { 
     382                        "date", 
     383                        "time", 
     384                    }, 
     385                }, 
     386                new Data 
     387                { 
     388                    Mode = 2, 
     389                    Enabled = false, 
     390                    Gender = "F", 
     391                    Age = 24, 
     392                    Score = 0.2, 
     393                    FromDate = DateTime.Today.AddDays(1), 
     394                    ToDate = DateTime.Today.AddDays(20), 
     395                    WaitTime = (60 * 3) + 10, 
     396                    Color = "#00FF00", 
     397                    Description = "long text1\r\nlong text2", 
     398                    ZipCode = "200-0002", 
     399                    UseDetail = false, 
     400                    DetailLabel = null, 
     401                    DataTypeNames = new[] 
     402                    { 
     403                        "tinyint", 
     404                        "smallint", 
     405                        "int", 
     406                    }, 
     407                }, 
     408            }; 
     409 
     410 
     411            /// <summary> 
     412            /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
     413            /// の為にデータを取得します。 
     414            /// </summary> 
     415            /// <returns> 
     416            /// データの一覧。 
     417            /// </returns> 
     418            public static IList<Data> GetData() 
     419            { 
     420                lock (SyncRoot) 
     421                { 
     422                    return DataList.Clone(); 
     423                } 
     424            } 
     425 
     426            /// <summary> 
     427            /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
     428            /// の為にデータを追加します。 
     429            /// </summary> 
     430            /// <param name="data">更新するデータ。</param> 
     431            public static void InsertData(Data data) 
     432            { 
     433                lock (SyncRoot) 
     434                { 
     435                    DataList.Add(data); 
     436                } 
     437            } 
     438 
     439            /// <summary> 
     440            /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
     441            /// の為にデータを更新します。 
     442            /// </summary> 
     443            /// <param name="data">更新するデータ。</param> 
     444            /// <exception cref="ArgumentException"> 
     445            /// <paramref name="data"/> が更新対象のデータではありません。 
     446            /// </exception> 
     447            public static void UpdateData(Data data) 
     448            { 
     449                lock (SyncRoot) 
     450                { 
     451                    for (int i = 0; i < DataList.Count; i++) 
     452                    { 
     453                        if (DataList[i].Key == data.Key) 
     454                        { 
     455                            DataList[i] = data; 
     456                            return; 
     457                        } 
     458                    } 
     459                } 
     460 
     461                throw new ArgumentException(); 
     462            } 
     463 
     464            /// <summary> 
     465            /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 
     466            /// の為にデータを追加します。 
     467            /// </summary> 
     468            /// <param name="data">更新するデータ。</param> 
     469            /// <exception cref="ArgumentException"> 
     470            /// <paramref name="data"/> が削除対象のデータではありません。 
     471            /// </exception> 
     472            public static void DeleteData(Data data) 
     473            { 
     474                lock (SyncRoot) 
     475                { 
     476                    for (int i = 0; i < DataList.Count; i++) 
     477                    { 
     478                        if (DataList[i].Key == data.Key) 
     479                        { 
     480                            DataList.RemoveAt(i); 
     481                            return; 
     482                        } 
     483                    } 
     484                } 
     485 
     486                throw new ArgumentException(); 
     487            } 
     488        } 
     489 
     490 
     491        /// <summary> 
     492        /// <see cref="Data"/> のコレクションです。 
     493        /// </summary> 
     494        [DebuggerDisplay(@"Count = {Count}")] 
     495        public class DataCollection : 
     496            System.Collections.ObjectModel.Collection<Data> 
     497        { 
     498            /// <summary> 
     499            /// 最後のインデックス。 
     500            /// </summary> 
     501            private int lastIndex; 
     502 
     503 
     504            /// <summary> 
     505            /// インスタンスを作成します。 
     506            /// </summary> 
     507            internal DataCollection() 
     508            { 
     509                // AVOID 
     510            } 
     511 
     512            /// <summary> 
     513            /// コレクションを元にしたインスタンスを作成します。 
     514            /// </summary> 
     515            /// <param name="collection">新しいコレクションにコピーするコレクション。</param> 
     516            private DataCollection(IEnumerable<Data> collection) 
     517                : base(new List<Data>(collection)) 
     518            { 
     519                // AVOID 
     520            } 
     521 
     522 
     523            /// <summary> 
     524            /// 同じ内容を持った新しいインスタンスを作成して返します。 
     525            /// </summary> 
     526            /// <returns> 
     527            /// 同じ内容を持った新しいインスタンス。 
     528            /// </returns> 
     529            public DataCollection Clone() 
     530            { 
     531                return new DataCollection(this); 
     532            } 
     533 
     534            /// <summary> 
     535            /// <see cref="DataCollection" /> 内の指定したインデックスの位置に要素を挿入します。 
     536            /// </summary> 
     537            /// <param name="index"> 
     538            /// <paramref name="item" /> を挿入する位置の 0 から始まるインデックス。</param> 
     539            /// <param name="item">挿入するオブジェクト。</param> 
     540            /// <exception cref="ArgumentException"> 
     541            /// <paramref name="item"/> のデータが正しく有りません。 
     542            /// </exception> 
     543            /// <exception cref="ArgumentOutOfRangeException"> 
     544            /// <paramref name="index" /> が 0 未満です。 
     545            /// または <paramref name="index" /> が 
     546            /// <see cref="P:System.Collections.ObjectModel.Collection`1.Count" /> より大きくなっています。 
     547            /// </exception> 
     548            protected override void InsertItem(int index, Data item) 
     549            { 
     550                if (item.Key != null) 
     551                { 
     552                    throw new ArgumentException(); 
     553                } 
     554 
     555                item.Key = "Key" + (++lastIndex); 
     556                base.InsertItem(index, item); 
     557            } 
     558        } 
     559 
    212560 
    213561 
     
    230578 
    231579            /// <summary> 
     580            /// 有効かどうか。 
     581            /// </summary> 
     582            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     583            private bool enabled; 
     584 
     585            /// <summary> 
     586            /// 性別。 
     587            /// </summary> 
     588            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     589            private string gender; 
     590 
     591            /// <summary> 
     592            /// 年齢。 
     593            /// </summary> 
     594            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     595            private int? age; 
     596 
     597            /// <summary> 
     598            /// スコア。 
     599            /// </summary> 
     600            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     601            private double? score; 
     602 
     603            /// <summary> 
     604            /// 開始日。 
     605            /// </summary> 
     606            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     607            private DateTime? fromDate; 
     608 
     609            /// <summary> 
     610            /// 終了日。 
     611            /// </summary> 
     612            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     613            private DateTime? toDate; 
     614 
     615            /// <summary> 
     616            /// 待機時間。 
     617            /// </summary> 
     618            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     619            private int waitTime; 
     620 
     621            /// <summary> 
     622            /// 色。 
     623            /// </summary> 
     624            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     625            private string color; 
     626 
     627            /// <summary> 
     628            /// 説明文。 
     629            /// </summary> 
     630            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     631            private string description; 
     632 
     633            /// <summary> 
     634            /// 郵便番号。 
     635            /// </summary> 
     636            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     637            private string zipCode; 
     638 
     639            /// <summary> 
     640            /// 詳細情報を使うかどうか。 
     641            /// </summary> 
     642            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     643            private bool useDetail; 
     644 
     645            /// <summary> 
     646            /// 詳細ラベル。 
     647            /// </summary> 
     648            [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     649            private string detailLabel; 
     650 
     651            /// <summary> 
    232652            /// 選択された値のリスト。 
    233653            /// </summary> 
     
    284704 
    285705            /// <summary> 
     706            /// 有効かどうかを取得または設定します。 
     707            /// </summary> 
     708            /// <value> 
     709            /// 有効かどうか。 
     710            /// </value> 
     711            public bool Enabled 
     712            { 
     713                get 
     714                { 
     715                    return enabled; 
     716                } 
     717 
     718                set 
     719                { 
     720                    enabled = value; 
     721                } 
     722            } 
     723 
     724            /// <summary> 
     725            /// 性別を取得または設定します。 
     726            /// </summary> 
     727            /// <value> 
     728            /// 性別。 
     729            /// </value> 
     730            public string Gender 
     731            { 
     732                get 
     733                { 
     734                    return gender; 
     735                } 
     736 
     737                set 
     738                { 
     739                    gender = value; 
     740                } 
     741            } 
     742 
     743            /// <summary> 
     744            /// 年齢を取得または設定します。 
     745            /// </summary> 
     746            /// <value> 
     747            /// 年齢。 
     748            /// </value> 
     749            public int? Age 
     750            { 
     751                get 
     752                { 
     753                    return age; 
     754                } 
     755 
     756                set 
     757                { 
     758                    age = value; 
     759                } 
     760            } 
     761 
     762            /// <summary> 
     763            /// スコアを取得または設定します。 
     764            /// </summary> 
     765            /// <value> 
     766            /// スコア。 
     767            /// </value> 
     768            public double? Score 
     769            { 
     770                get 
     771                { 
     772                    return score; 
     773                } 
     774 
     775                set 
     776                { 
     777                    score = value; 
     778                } 
     779            } 
     780 
     781            /// <summary> 
     782            /// 開始日を取得または設定します。 
     783            /// </summary> 
     784            /// <value> 
     785            /// 開始日。 
     786            /// </value> 
     787            public DateTime? FromDate 
     788            { 
     789                get 
     790                { 
     791                    return fromDate; 
     792                } 
     793 
     794                set 
     795                { 
     796                    fromDate = value; 
     797                } 
     798            } 
     799 
     800            /// <summary> 
     801            /// 終了日を取得または設定します。 
     802            /// </summary> 
     803            /// <value> 
     804            /// 終了日。 
     805            /// </value> 
     806            public DateTime? ToDate 
     807            { 
     808                get 
     809                { 
     810                    return toDate; 
     811                } 
     812 
     813                set 
     814                { 
     815                    toDate = value; 
     816                } 
     817            } 
     818 
     819            /// <summary> 
     820            /// 待機時間を取得または設定します。 
     821            /// </summary> 
     822            /// <value> 
     823            /// 待機時間。 
     824            /// </value> 
     825            public int WaitTime 
     826            { 
     827                get 
     828                { 
     829                    return waitTime; 
     830                } 
     831 
     832                set 
     833                { 
     834                    waitTime = value; 
     835                } 
     836            } 
     837 
     838            /// <summary> 
     839            /// 色を取得または設定します。 
     840            /// </summary> 
     841            /// <value> 
     842            /// 色。 
     843            /// </value> 
     844            public string Color 
     845            { 
     846                get 
     847                { 
     848                    return color; 
     849                } 
     850 
     851                set 
     852                { 
     853                    color = value; 
     854                } 
     855            } 
     856 
     857            /// <summary> 
     858            /// 説明文を取得または設定します。 
     859            /// </summary> 
     860            /// <value> 
     861            /// 説明文。 
     862            /// </value> 
     863            public string Description 
     864            { 
     865                get 
     866                { 
     867                    return description; 
     868                } 
     869 
     870                set 
     871                { 
     872                    description = value; 
     873                } 
     874            } 
     875 
     876            /// <summary> 
     877            /// 郵便番号を取得または設定します。 
     878            /// </summary> 
     879            /// <value> 
     880            /// 郵便番号。 
     881            /// </value> 
     882            public string ZipCode 
     883            { 
     884                get 
     885                { 
     886                    return zipCode; 
     887                } 
     888 
     889                set 
     890                { 
     891                    zipCode = value; 
     892                } 
     893            } 
     894 
     895            /// <summary> 
     896            /// 詳細情報を使うかどうかを取得または設定します。 
     897            /// </summary> 
     898            /// <value> 
     899            /// 詳細情報を使うかどうか。 
     900            /// </value> 
     901            public bool UseDetail 
     902            { 
     903                get 
     904                { 
     905                    return useDetail; 
     906                } 
     907 
     908                set 
     909                { 
     910                    useDetail = value; 
     911                } 
     912            } 
     913 
     914            /// <summary> 
     915            /// 詳細ラベルを取得または設定します。 
     916            /// </summary> 
     917            /// <value> 
     918            /// 詳細ラベル。 
     919            /// </value> 
     920            public string DetailLabel 
     921            { 
     922                get 
     923                { 
     924                    return detailLabel; 
     925                } 
     926 
     927                set 
     928                { 
     929                    detailLabel = value; 
     930                } 
     931            } 
     932 
     933            /// <summary> 
    286934            /// 選択された値のリストを取得または設定します。 
    287935            /// </summary> 
     
    3681016                } 
    3691017            } 
     1018        } 
     1019 
     1020 
     1021        protected void UseDetailCheckBox_OnCheckedChanged(object sender, EventArgs e) 
     1022        { 
     1023            System.Web.UI.WebControls.CheckBox checkBox = (System.Web.UI.WebControls.CheckBox)sender; 
     1024            System.Web.UI.WebControls.PlaceHolder placeHolder = checkBox.FindControl("DetailPlaceHolder") as System.Web.UI.WebControls.PlaceHolder; 
     1025            if (placeHolder == null) 
     1026            { 
     1027                return; 
     1028            } 
     1029 
     1030            placeHolder.Visible = checkBox.Checked; 
    3701031        } 
    3711032    } 
  • framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx.designer.cs

    r1604 r1608  
    3838        /// 変更するには、フィールドの宣言をデザイナー ファイルから分離コード ファイルに移動します。 
    3939        /// </remarks> 
    40         protected global::System.Web.UI.WebControls.ObjectDataSource OuterDataSource; 
     40        protected global::FCSoft.SilverFrost.Framework.Web.UI.WebControls.ObjectDataSource OuterDataSource; 
    4141         
    4242        /// <summary> 
  • framework/trunk/WebApplication/WebApplication.csproj

    r1605 r1608  
    6464    <Content Include="UI\CulturePage.aspx" /> 
    6565    <Content Include="UI\Database\SqlErrorPage.aspx" /> 
     66    <Content Include="UI\WebControls\FormViewBindUserControl1.ascx" /> 
    6667    <Content Include="UI\WebControls\FormViewPage.aspx" /> 
    6768    <Content Include="UI\WebControls\TemplateFieldPage.aspx" /> 
     
    260261    <Compile Include="UI\WebControls\DialogPage.aspx.designer.cs"> 
    261262      <DependentUpon>DialogPage.aspx</DependentUpon> 
     263    </Compile> 
     264    <Compile Include="UI\WebControls\FormViewBindUserControl1.ascx.cs"> 
     265      <DependentUpon>FormViewBindUserControl1.ascx</DependentUpon> 
     266      <SubType>ASPXCodeBehind</SubType> 
     267    </Compile> 
     268    <Compile Include="UI\WebControls\FormViewBindUserControl1.ascx.designer.cs"> 
     269      <DependentUpon>FormViewBindUserControl1.ascx</DependentUpon> 
    262270    </Compile> 
    263271    <Compile Include="UI\WebControls\FormViewPage.aspx.cs"> 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/DateBox.cs

    r1440 r1608  
    3232    using System.Web.UI; 
    3333    using System.Web.UI.WebControls; 
     34    using FCSoft.SilverFrost.Framework.ComponentModel; 
    3435    using FCSoft.SilverFrost.Framework.Web.Properties; 
    3536 
     
    4950 
    5051        /// <summary> 
     52        /// <see cref="RenderingMode"/> プロパティ用のキー。 
     53        /// </summary> 
     54        private const string RenderingModeKey = "RenderingMode"; 
     55 
     56        /// <summary> 
    5157        /// <see cref="ImageUrl"/> プロパティ用のキー。 
    5258        /// </summary> 
     
    6773        /// </summary> 
    6874        private const string MaxLengthKey = "MaxLength"; 
     75 
     76        /// <summary> 
     77        /// <see cref="MinimumValue"/> プロパティ用のキー。 
     78        /// </summary> 
     79        private const string MinimumValueKey = "MinimumValue"; 
     80 
     81        /// <summary> 
     82        /// <see cref="MaximumValue"/> プロパティ用のキー。 
     83        /// </summary> 
     84        private const string MaximumValueKey = "MaximumValue"; 
     85 
     86        /// <summary> 
     87        /// ブラウザでレンダリングする場合の日付書式の一覧。 
     88        /// </summary> 
     89        private static readonly string[] BrowserDateFormats = 
     90        { 
     91            @"yyyy-MM-dd" 
     92        }; 
    6993 
    7094        /// <summary> 
     
    124148        } 
    125149 
     150 
     151        /// <summary> 
     152        /// レンダリングモードを取得または設定します。 
     153        /// </summary> 
     154        /// <value> 
     155        /// レンダリングモード。 
     156        /// 既定値は <c>RenderingMode.Default</c> で 
     157        /// <c>RenderingMode.ClientScript</c> と同じ。 
     158        /// </value> 
     159        [Themeable(false)] 
     160        [DefaultValue(RenderingMode.Default)] 
     161        [WebCategory("Appearance")] 
     162        [WebDescription("Description_RenderingMode")] 
     163        public virtual RenderingMode RenderingMode 
     164        { 
     165            get 
     166            { 
     167                return (RenderingMode)(ViewState[RenderingModeKey] ?? RenderingMode.Default); 
     168            } 
     169 
     170            set 
     171            { 
     172                ViewState[RenderingModeKey] = value; 
     173            } 
     174        } 
    126175 
    127176        /// <summary> 
     
    145194            get 
    146195            { 
    147                 return TextBoxMode.SingleLine; 
     196                return RenderingMode == RenderingMode.Browser 
     197                    ? TextBoxMode.Date 
     198                    : TextBoxMode.SingleLine; 
    148199            } 
    149200 
     
    221272        /// </value> 
    222273        /// <remarks> 
     274        /// <para> 
    223275        /// このプロパティを設定すると、カレンダーを表示するイメージが表示されます。 
    224276        /// <see cref="ButtonText"/> プロパティが設定されている場合、 
    225277        /// <see cref="ImageUrl"/> に指定したイメージがボタン内に表示されますが、テキストは表示されません。 
     278        /// </para> 
     279        /// <para> 
     280        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     281        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     282        /// </para> 
    226283        /// </remarks> 
    227284        [DefaultValue("")] 
     
    249306        /// マウス ポインタがイメージの上を移動したときに表示されるテキスト。 
    250307        /// </value> 
     308        /// <remarks> 
     309        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     310        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     311        /// </remarks> 
    251312        [DefaultValue("")] 
    252313        [WebCategory("Behavior")] 
     
    273334        /// </value> 
    274335        /// <remarks> 
     336        /// <para> 
    275337        /// このプロパティを設定すると、カレンダーを表示するボタンが表示されます。 
    276338        /// <see cref="ImageUrl"/> プロパティが設定されている場合、 
    277339        /// <see cref="ImageUrl"/> に指定したイメージがボタン内に表示されますが、テキストは表示されません。 
     340        /// </para> 
     341        /// <para> 
     342        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     343        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     344        /// </para> 
    278345        /// </remarks> 
    279346        [DefaultValue("")] 
     
    301368        /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 
    302369        /// </value> 
    303         [Browsable(false)] 
     370        [Bindable(true, BindingDirection.TwoWay)] 
     371        [Themeable(false)] 
     372        [DefaultValue(null)] 
     373        [TypeConverter(typeof(NullableExtendedConverter))] 
    304374        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     375        [WebCategory("Behavior")] 
     376        [WebDescription("Description_DateBox_Value")] 
    305377        public virtual DateTime? Value 
    306378        { 
     
    312384                    && DateTime.TryParseExact( 
    313385                        text, 
    314                         CreateDateFormats(), 
     386                        CreateDateFormats(RenderingMode), 
    315387                        CultureInfo.CurrentCulture, 
    316388                        DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, 
     
    324396                Text 
    325397                    = value.HasValue 
    326                         ? value.Value.ToString("d", CultureInfo.CurrentCulture) 
     398                        ? FormatDate(value.Value, RenderingMode) 
    327399                        : string.Empty; 
     400            } 
     401        } 
     402 
     403        /// <summary> 
     404        /// 入力可能な最小値を取得または設定します。 
     405        /// </summary> 
     406        /// <value> 
     407        /// 最小値を表す <see cref="DateTime"/>。 
     408        /// 既定値は <see langword="null"/> です。 
     409        /// </value> 
     410        [Themeable(false)] 
     411        [DefaultValue(null)] 
     412        [TypeConverter(typeof(NullableExtendedConverter))] 
     413        [WebCategory("Behavior")] 
     414        [WebDescription("Description_MinimumValue")] 
     415        public virtual DateTime? MinimumValue 
     416        { 
     417            get 
     418            { 
     419                return (DateTime?)ViewState[MinimumValueKey]; 
     420            } 
     421 
     422            set 
     423            { 
     424                ViewState[MinimumValueKey] = value; 
     425            } 
     426        } 
     427 
     428        /// <summary> 
     429        /// 入力可能な最大値を取得または設定します。 
     430        /// </summary> 
     431        /// <value> 
     432        /// 最大値を表す <see cref="DateTime"/>。 
     433        /// 既定値は <see langword="null"/> です。 
     434        /// </value> 
     435        [Themeable(false)] 
     436        [DefaultValue(null)] 
     437        [TypeConverter(typeof(NullableExtendedConverter))] 
     438        [WebCategory("Behavior")] 
     439        [WebDescription("Description_MaximumValue")] 
     440        public virtual DateTime? MaximumValue 
     441        { 
     442            get 
     443            { 
     444                return (DateTime?)ViewState[MaximumValueKey]; 
     445            } 
     446 
     447            set 
     448            { 
     449                ViewState[MaximumValueKey] = value; 
    328450            } 
    329451        } 
     
    343465                if (validationExpression == null) 
    344466                { 
    345                     string pattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 
    346  
    347                     validationExpression 
    348                         = DayRegex.Replace( 
    349                             MonthRegex.Replace( 
    350                                 ShortYearRegex.Replace( 
    351                                     //// LongYearRegex に対応 (0000-9999) 
    352                                     LongYearRegex.Replace(pattern, "[0-9]{4}"), 
    353                                     //// ShortYearRegex に対応 (00-99) 
    354                                     "[0-9]{2}"), 
    355                                 //// MonthRegex に対応 (10-12, 01-09) 
    356                                 "(1[0-2]|0?[1-9])"), 
    357                             //// DayRegex に対応 (30-31, 10-29, 01-09) 
    358                             "(3[0-1]|[12][0-9]|0?[1-9])"); 
     467                    string pattern 
     468                        = RenderingMode == RenderingMode.Browser 
     469                            ? BrowserDateFormats[0] 
     470                            : Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 
     471 
     472                    try 
     473                    { 
     474                        validationExpression 
     475                            = DayRegex.Replace( 
     476                                MonthRegex.Replace( 
     477                                    ShortYearRegex.Replace( 
     478                                        //// LongYearRegex に対応 (0000-9999) 
     479                                        LongYearRegex.Replace(pattern, "[0-9]{4}"), 
     480                                        //// ShortYearRegex に対応 (00-99) 
     481                                        "[0-9]{2}"), 
     482                                    //// MonthRegex に対応 (10-12, 01-09) 
     483                                    "(1[0-2]|0?[1-9])"), 
     484                                //// DayRegex に対応 (30-31, 10-29, 01-09) 
     485                                "(3[0-1]|[12][0-9]|0?[1-9])"); 
     486                    } 
     487                    catch (RegexMatchTimeoutException) 
     488                    { 
     489                        validationExpression = string.Empty; 
     490                    } 
    359491                } 
    360492 
     
    386518                string pattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 
    387519 
    388                 // M や d など 1 桁か 2 桁か未確定の場合に 2 桁に変換する 
    389                 pattern = DayRegex.Replace(MonthRegex.Replace(pattern, "MM"), "dd"); 
    390  
    391                 return pattern.Length; 
     520                try 
     521                { 
     522                    // M や d など 1 桁か 2 桁か未確定の場合に 2 桁に変換する 
     523                    pattern = DayRegex.Replace(MonthRegex.Replace(pattern, "MM"), "dd"); 
     524 
     525                    return pattern.Length; 
     526                } 
     527                catch (RegexMatchTimeoutException) 
     528                { 
     529                    return 0; 
     530                } 
    392531            } 
    393532 
     
    429568            base.OnPreRender(e); 
    430569 
     570            if (RenderingMode == RenderingMode.Browser) 
     571            { 
     572                return; 
     573            } 
     574 
    431575            ClientScriptUtility.RegisterJQueryUI(); 
    432576            ClientScriptUtility.RegisterFireEvent(); 
     
    440584                imageUrl = null; 
    441585            } 
     586 
     587            DateTime? minimunValue = MinimumValue; 
     588            DateTime? maximunValue = MaximumValue; 
    442589 
    443590            // AgentSmith SpellCheck Disable 
     
    455602        buttonImageOnly: " + string.IsNullOrEmpty(buttonText).ToString().ToLowerInvariant() + @", 
    456603        buttonText: '" + ClientScriptUtility.EscapeStringForSingleQuotes(imageUrl != null ? imageToolTip : buttonText) + @"', 
     604        minDate: " + FormatDateScript(minimunValue) + @", 
     605        maxDate: " + FormatDateScript(maximunValue) + @", 
    457606        gotoCurrent: true, 
    458607        onSelect: function(dateText) { " + ClientScriptUtility.FireEventReference("this", "change") + @"; } 
     
    466615        } 
    467616 
     617        /// <summary> 
     618        /// コントロールについて表示する必要のある HTML 属性およびスタイルを、指定した 
     619        /// <see cref="HtmlTextWriter"/> オブジェクトに追加します。 
     620        /// </summary> 
     621        /// <param name="writer"> 
     622        /// HTML コンテンツをクライアントに表示する出力ストリームを表す 
     623        /// <see cref="HtmlTextWriter"/>。 
     624        /// </param> 
     625        protected override void AddAttributesToRender(HtmlTextWriter writer) 
     626        { 
     627            // 親を呼び出す 
     628            base.AddAttributesToRender(writer); 
     629 
     630            if (RenderingMode != RenderingMode.Browser) 
     631            { 
     632                return; 
     633            } 
     634 
     635            RenderingMode renderingMode = RenderingMode; 
     636            DateTime? minimunValue = MinimumValue; 
     637            if (minimunValue.HasValue) 
     638            { 
     639                writer.AddAttribute("min", FormatDate(minimunValue.Value, renderingMode)); 
     640            } 
     641 
     642            DateTime? maximunValue = MaximumValue; 
     643            if (maximunValue.HasValue) 
     644            { 
     645                writer.AddAttribute("max", FormatDate(maximunValue.Value, renderingMode)); 
     646            } 
     647        } 
     648 
     649 
     650        /// <summary> 
     651        /// 日付を表すクライアントスクリプトに変換して返します。 
     652        /// </summary> 
     653        /// <param name="date">日付を表す値。</param> 
     654        /// <returns> 
     655        /// <paramref name="date"/> のクライアントスクリプト表現。 
     656        /// </returns> 
     657        private static string FormatDateScript(DateTime? date) 
     658        { 
     659            if (!date.HasValue) 
     660            { 
     661                return "null"; 
     662            } 
     663 
     664            return string.Format( 
     665                CultureInfo.InvariantCulture, 
     666                "new Date({0}, {1}, {2})", 
     667                date.Value.Year, 
     668                date.Value.Month - 1, 
     669                date.Value.Day); 
     670        } 
     671 
     672        /// <summary> 
     673        /// 日付を表す文字列に変換して返します。 
     674        /// </summary> 
     675        /// <param name="date">日付を表す値。</param> 
     676        /// <param name="renderingMode">レンダリングモード。</param> 
     677        /// <returns> 
     678        /// <paramref name="date"/> の文字列表現。 
     679        /// </returns> 
     680        private static string FormatDate(DateTime date, RenderingMode renderingMode) 
     681        { 
     682            return date.ToString( 
     683                renderingMode == RenderingMode.Browser ? "yyyy-MM-dd" : "d", 
     684                CultureInfo.CurrentCulture); 
     685        } 
    468686 
    469687        /// <summary> 
    470688        /// 受け付け可能な日付のフォーマットの一覧を取得します。 
    471689        /// </summary> 
     690        /// <param name="renderingMode">レンダリングモード。</param> 
    472691        /// <returns> 
    473692        /// 受け付け可能な日付のフォーマットの一覧。 
    474693        /// </returns> 
    475         private static string[] CreateDateFormats() 
    476         { 
     694        private static string[] CreateDateFormats(RenderingMode renderingMode) 
     695        { 
     696            if (renderingMode == RenderingMode.Browser) 
     697            { 
     698                return BrowserDateFormats; 
     699            } 
     700 
    477701            DateTimeFormatInfo dateTimeFormat = Thread.CurrentThread.CurrentCulture.DateTimeFormat; 
    478702 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/NumericBox.cs

    r931 r1608  
    4848 
    4949        /// <summary> 
     50        /// <see cref="RenderingMode"/> プロパティ用のキー。 
     51        /// </summary> 
     52        private const string RenderingModeKey = "RenderingMode"; 
     53 
     54        /// <summary> 
    5055        /// <see cref="ShowSpinButton"/> プロパティ用のキー。 
    5156        /// </summary> 
     
    96101        } 
    97102 
     103 
     104        /// <summary> 
     105        /// レンダリングモードを取得または設定します。 
     106        /// </summary> 
     107        /// <value> 
     108        /// レンダリングモード。 
     109        /// 既定値は <c>RenderingMode.Default</c> で 
     110        /// <c>RenderingMode.ClientScript</c> と同じ。 
     111        /// </value> 
     112        [Themeable(false)] 
     113        [DefaultValue(RenderingMode.Default)] 
     114        [WebCategory("Appearance")] 
     115        [WebDescription("Description_RenderingMode")] 
     116        public virtual RenderingMode RenderingMode 
     117        { 
     118            get 
     119            { 
     120                return (RenderingMode)(ViewState[RenderingModeKey] ?? RenderingMode.Default); 
     121            } 
     122 
     123            set 
     124            { 
     125                ViewState[RenderingModeKey] = value; 
     126            } 
     127        } 
    98128 
    99129        /// <summary> 
     
    117147            get 
    118148            { 
    119                 return TextBoxMode.SingleLine; 
     149                return RenderingMode == RenderingMode.Browser 
     150                    ? TextBoxMode.Number 
     151                    : TextBoxMode.SingleLine; 
    120152            } 
    121153 
     
    197229        /// プロパティが指定されているとその桁に合わせて四捨五入されれマス。 
    198230        /// </remarks> 
     231        [Bindable(true, BindingDirection.TwoWay)] 
     232        [Themeable(false)] 
    199233        [Browsable(false)] 
     234        [DefaultValue(null)] 
     235        [TypeConverter(typeof(NullableExtendedConverter))] 
    200236        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     237        [WebCategory("Behavior")] 
     238        [WebDescription("Description_NumericBox_Value")] 
    201239        public virtual double? Value 
    202240        { 
     
    209247                } 
    210248 
    211                 return double.Parse(text, NumberStyles.Number, CultureInfo.InvariantCulture); 
    212             } 
    213  
    214             set 
    215             { 
    216                 if (!value.HasValue) 
     249                double value; 
     250                return double.TryParse( 
     251                    text, 
     252                    NumberStyles.Number, 
     253                    RenderingMode == RenderingMode.Browser 
     254                        ? CultureInfo.InvariantCulture 
     255                        : CultureInfo.CurrentCulture, 
     256                    out value) 
     257                    ? value 
     258                    : (double?)null; 
     259            } 
     260 
     261            set 
     262            { 
     263                Text 
     264                    = value.HasValue 
     265                        ? FormatNumber(value.Value, DecimalPosition, RenderingMode) 
     266                        : string.Empty; 
     267            } 
     268        } 
     269 
     270        /// <summary> 
     271        /// <see cref="Text"/> プロパティの値を <see cref="int"/> で取得または設定します。 
     272        /// </summary> 
     273        /// <value> 
     274        /// <see cref="Text"/> プロパティの値の <see cref="int"/> 型。 
     275        /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 
     276        /// </value> 
     277        /// <remarks> 
     278        /// このプロパティに値を設定する場合、<see cref="DecimalPosition"/> 
     279        /// プロパティが指定されているとその桁に合わせて四捨五入されれマス。 
     280        /// </remarks> 
     281        [Bindable(true, BindingDirection.TwoWay)] 
     282        [Themeable(false)] 
     283        [Browsable(false)] 
     284        [DefaultValue(null)] 
     285        [TypeConverter(typeof(NullableExtendedConverter))] 
     286        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     287        [WebCategory("Behavior")] 
     288        [WebDescription("Description_NumericBox_Value")] 
     289        public virtual int? Int32Value 
     290        { 
     291            get 
     292            { 
     293                string text = Text; 
     294                if (string.IsNullOrEmpty(text)) 
    217295                { 
    218                     Text = string.Empty; 
    219                     return; 
     296                    return null; 
    220297                } 
    221298 
    222                 int? decimalPosition = DecimalPosition; 
    223                 if (!decimalPosition.HasValue) 
     299                int value; 
     300                return int.TryParse( 
     301                    text, 
     302                    NumberStyles.Number, 
     303                    RenderingMode == RenderingMode.Browser 
     304                        ? CultureInfo.InvariantCulture 
     305                        : CultureInfo.CurrentCulture, 
     306                    out value) 
     307                    ? value 
     308                    : (int?)null; 
     309            } 
     310 
     311            set 
     312            { 
     313                Text 
     314                    = value.HasValue 
     315                        ? FormatNumber(value.Value, DecimalPosition, RenderingMode) 
     316                        : string.Empty; 
     317            } 
     318        } 
     319 
     320        /// <summary> 
     321        /// <see cref="Text"/> プロパティの値を <see cref="float"/> で取得または設定します。 
     322        /// </summary> 
     323        /// <value> 
     324        /// <see cref="Text"/> プロパティの値の <see cref="float"/> 型。 
     325        /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 
     326        /// </value> 
     327        /// <remarks> 
     328        /// このプロパティに値を設定する場合、<see cref="DecimalPosition"/> 
     329        /// プロパティが指定されているとその桁に合わせて四捨五入されれマス。 
     330        /// </remarks> 
     331        [Bindable(true, BindingDirection.TwoWay)] 
     332        [Themeable(false)] 
     333        [Browsable(false)] 
     334        [DefaultValue(null)] 
     335        [TypeConverter(typeof(NullableExtendedConverter))] 
     336        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     337        [WebCategory("Behavior")] 
     338        [WebDescription("Description_NumericBox_Value")] 
     339        public virtual float? SingleValue 
     340        { 
     341            get 
     342            { 
     343                string text = Text; 
     344                if (string.IsNullOrEmpty(text)) 
    224345                { 
    225                     Text = value.Value.ToString(CultureInfo.InvariantCulture); 
    226                     return; 
     346                    return null; 
    227347                } 
    228348 
    229                 Text = decimal.Round((decimal)value.Value, decimalPosition.Value).ToString(CultureInfo.InvariantCulture); 
     349                float value; 
     350                return float.TryParse( 
     351                    text, 
     352                    NumberStyles.Number, 
     353                    RenderingMode == RenderingMode.Browser 
     354                        ? CultureInfo.InvariantCulture 
     355                        : CultureInfo.CurrentCulture, 
     356                    out value) 
     357                    ? value 
     358                    : (float?)null; 
     359            } 
     360 
     361            set 
     362            { 
     363                Text 
     364                    = value.HasValue 
     365                        ? FormatNumber(value.Value, DecimalPosition, RenderingMode) 
     366                        : string.Empty; 
    230367            } 
    231368        } 
     
    239376        /// 既定値は <see langword="true"/> です。 
    240377        /// </value> 
     378        /// <remarks> 
     379        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     380        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     381        /// </remarks> 
    241382        [Themeable(false)] 
    242383        [DefaultValue(true)] 
     
    264405        /// 既定値は <c>500</c> ミリ秒です。 
    265406        /// </value> 
     407        /// <remarks> 
     408        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     409        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     410        /// </remarks> 
    266411        [Themeable(false)] 
    267412        [DefaultValue(500)] 
     
    289434        /// 既定値は <c>100</c> ミリ秒です。 
    290435        /// </value> 
     436        /// <remarks> 
     437        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     438        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     439        /// </remarks> 
    291440        [Themeable(false)] 
    292441        [DefaultValue(100)] 
     
    336485        /// <value> 
    337486        /// 最小値。 
    338         /// 未指定の場合は <see langword="null"/> です。 
    339487        /// 既定値は <see langword="null"/> です。 
    340488        /// </value> 
    341489        [Themeable(false)] 
    342         [DefaultValue((object)null)] 
     490        [DefaultValue(null)] 
     491        [TypeConverter(typeof(NullableExtendedConverter))] 
    343492        [WebCategory("Behavior")] 
    344493        [WebDescription("Description_MinimumValue")] 
     
    362511        /// <value> 
    363512        /// 最大値。 
    364         /// 未指定の場合は <see langword="null"/> です。 
    365513        /// 既定値は <see langword="null"/> です。 
    366514        /// </value> 
    367515        [Themeable(false)] 
    368         [DefaultValue((object)null)] 
     516        [DefaultValue(null)] 
    369517        [TypeConverter(typeof(NullableExtendedConverter))] 
    370518        [WebCategory("Behavior")] 
     
    389537        /// <value> 
    390538        /// 少数以下の桁数の精度を表す <c>0</c> から <c>13</c> の値。 
    391         /// 未指定の場合は <see langword="null"/> です。 
    392         /// 既定値は <see langword="null"/> です。 
     539        /// 既定値は <c>0</c> で、精度の調整が行われません。 
    393540        /// </value> 
    394541        /// <remarks> 
    395542        /// このプロパティを設定しても、すでに <see cref="Value"/> 
    396         /// プロパティや <see cref="Text"/> プロパティ設定されている値に影響しません。 
    397         /// </remarks> 
    398         [Themeable(false)] 
    399         [DefaultValue((object)null)] 
     543        /// プロパティや <see cref="Text"/> プロパティ設定されている値に影響しません。 
     544        /// </remarks> 
     545        [Themeable(false)] 
     546        [DefaultValue(null)] 
    400547        [TypeConverter(typeof(NullableExtendedConverter))] 
    401548        [WebCategory("Behavior")] 
     
    422569        /// 既定値は 「<c>0123456789.-</c>」 です。 
    423570        /// </value> 
     571        /// <remarks> 
     572        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     573        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     574        /// </remarks> 
    424575        [Themeable(false)] 
    425576        [DefaultValue("0123456789.-")] 
     
    464615            // 親を呼び出す 
    465616            base.OnPreRender(e); 
     617 
     618            if (RenderingMode == RenderingMode.Browser) 
     619            { 
     620                return; 
     621            } 
    466622 
    467623            StyleUtility.RegisterJQuerySpinedit(); 
     
    488644                true); 
    489645        } 
     646 
     647        /// <summary> 
     648        /// コントロールについて表示する必要のある HTML 属性およびスタイルを、指定した 
     649        /// <see cref="HtmlTextWriter"/> オブジェクトに追加します。 
     650        /// </summary> 
     651        /// <param name="writer"> 
     652        /// HTML コンテンツをクライアントに表示する出力ストリームを表す 
     653        /// <see cref="HtmlTextWriter"/>。 
     654        /// </param> 
     655        protected override void AddAttributesToRender(HtmlTextWriter writer) 
     656        { 
     657            // 親を呼び出す 
     658            base.AddAttributesToRender(writer); 
     659 
     660            RenderingMode renderingMode = RenderingMode; 
     661            if (renderingMode != RenderingMode.Browser) 
     662            { 
     663                return; 
     664            } 
     665 
     666            int? decimalPosition = DecimalPosition; 
     667 
     668            double? minimunValue = MinimumValue; 
     669            if (minimunValue.HasValue) 
     670            { 
     671                writer.AddAttribute("min", FormatNumber(minimunValue.Value, decimalPosition, renderingMode)); 
     672            } 
     673 
     674            double? maximunValue = MaximumValue; 
     675            if (maximunValue.HasValue) 
     676            { 
     677                writer.AddAttribute("max", FormatNumber(maximunValue.Value, decimalPosition, renderingMode)); 
     678            } 
     679 
     680            double stepValue = StepValue; 
     681            // ReSharper disable once CompareOfFloatsByEqualityOperator 
     682            if (stepValue != 1) 
     683            { 
     684                writer.AddAttribute("step", FormatNumber(stepValue, decimalPosition, renderingMode)); 
     685            } 
     686        } 
     687 
     688        /// <summary> 
     689        /// 数値を表す文字列に変換して返します。 
     690        /// </summary> 
     691        /// <param name="value">数値。</param> 
     692        /// <param name="decimalPosition">小数点以下の桁数の精度。</param> 
     693        /// <param name="renderingMode">レンダリングモード。</param> 
     694        /// <returns> 
     695        /// <paramref name="value"/> の文字列表現。 
     696        /// </returns> 
     697        private static string FormatNumber(double value, int? decimalPosition, RenderingMode renderingMode) 
     698        { 
     699            CultureInfo cultureInfo 
     700                = renderingMode == RenderingMode.Browser 
     701                    ? CultureInfo.InvariantCulture 
     702                    : CultureInfo.CurrentCulture; 
     703 
     704            return decimalPosition.HasValue 
     705                ? decimal.Round((decimal)value, decimalPosition.Value).ToString(cultureInfo) 
     706                : value.ToString(cultureInfo); 
     707        } 
    490708    } 
    491709} 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/ObjectDataSource.cs

    r1600 r1608  
    2222namespace FCSoft.SilverFrost.Framework.Web.UI.WebControls 
    2323{ 
     24    using System; 
     25    using System.Collections.Generic; 
    2426    using System.ComponentModel; 
    2527    using System.Drawing; 
     28    using System.Reflection; 
     29    using System.Web.Compilation; 
    2630    using System.Web.UI; 
     31    using System.Web.UI.WebControls; 
     32    using FCSoft.SilverFrost.Framework.Reflection; 
    2733 
    2834 
     
    4248    { 
    4349        /// <summary> 
     50        /// <see cref="AutoDetectDataObjectTypeName"/> プロパティ用のキー。 
     51        /// </summary> 
     52        private const string AutoDetectDataObjectTypeNameKey = "AutoDetectDataObjectTypeName"; 
     53 
     54 
     55        /// <summary> 
    4456        /// インスタンスを作成します。 
    4557        /// </summary> 
     
    4759        { 
    4860            ControlInitializer.ApplyProperties(this); 
     61        } 
     62 
     63 
     64        /// <summary> 
     65        /// <see cref="System.Web.UI.WebControls.ObjectDataSource.DataObjectTypeName"/> プロパティが未指定の場合に 
     66        /// <see cref="System.Web.UI.WebControls.ObjectDataSource.SelectMethod"/> 
     67        /// の戻り値の型から推測するかどうかを指定します。 
     68        /// </summary> 
     69        /// <value> 
     70        /// <see cref="System.Web.UI.WebControls.ObjectDataSource.DataObjectTypeName"/> プロパティが未指定の場合に 
     71        /// <see cref="System.Web.UI.WebControls.ObjectDataSource.SelectMethod"/> 
     72        /// の戻り値の型から推測する場合は <see langword="true"/>、 
     73        /// それ以外の場合は <see langword="false"/>。 
     74        /// 既定値は <see langword="false"/> です。 
     75        /// </value> 
     76        [Themeable(false)] 
     77        [DefaultValue(false)] 
     78        [WebCategory("Behavior")] 
     79        [WebDescription("Description_ObjectDataSource_AutoDetectDataObjectTypeName")] 
     80        public virtual bool AutoDetectDataObjectTypeName 
     81        { 
     82            get 
     83            { 
     84                return (bool)(ViewState[AutoDetectDataObjectTypeNameKey] ?? false); 
     85            } 
     86 
     87            set 
     88            { 
     89                ViewState[AutoDetectDataObjectTypeNameKey] = value; 
     90            } 
     91        } 
     92 
     93 
     94 
     95        /// <summary> 
     96        /// <see cref="ObjectDataSource" /> コントロールを格納するページに 
     97        /// <see cref="System.Web.UI.Page.LoadComplete" /> イベント ハンドラーを追加します。 
     98        /// </summary> 
     99        /// <param name="e">イベント データを格納している <see cref="EventArgs" />。</param> 
     100        protected override void OnInit(EventArgs e) 
     101        { 
     102            base.OnInit(e); 
     103 
     104            if (AutoDetectDataObjectTypeName) 
     105            { 
     106                PrepareDataObjectTypeName(); 
     107            } 
     108        } 
     109 
     110        /// <summary> 
     111        /// <see cref="ParameterCollection"/> から名前のハッシュセットを取得します。 
     112        /// </summary> 
     113        /// <param name="parameters"><see cref="ParameterCollection"/>。</param> 
     114        /// <returns> 
     115        /// <paramref name="parameters"/> の名前のハッシュセット。 
     116        /// </returns> 
     117        private static HashSet<string> GetParameterNames(ParameterCollection parameters) 
     118        { 
     119            HashSet<string> names = new HashSet<string>(); 
     120 
     121            foreach (Parameter parameter in parameters) 
     122            { 
     123                names.Add(parameter.Name); 
     124            } 
     125 
     126            return names; 
     127        } 
     128 
     129        /// <summary> 
     130        /// 引数の名前にマッチするメソッドを見つけて返します。 
     131        /// </summary> 
     132        /// <param name="type">型。</param> 
     133        /// <param name="methodName">メソッド名。</param> 
     134        /// <param name="parameterNames">引数の名前。</param> 
     135        /// <param name="methodType">メソッドの種類。</param> 
     136        /// <returns> 
     137        /// 見付かったメソッド情報。 
     138        /// 見付からない場合は <see langword="null"/>。 
     139        /// </returns> 
     140        private static MethodInfo FindMethod( 
     141            Type type, 
     142            string methodName, 
     143            HashSet<string> parameterNames, 
     144            DataObjectMethodType methodType) 
     145        { 
     146            MethodInfo[] methods 
     147                = type.GetMethods( 
     148                    BindingFlags.Public | 
     149                        BindingFlags.Instance | 
     150                        BindingFlags.Static | 
     151                        BindingFlags.FlattenHierarchy); 
     152 
     153            // 見付かったメソッドの優先度 
     154            // -1 - 見付かっていない 
     155            // 0 - パラメータ名のみマッチ 
     156            // 1 - DataObjectMethodAttribute 付き 
     157            // 2 - DataObjectMethodAttribute.IsDefault = true 付き 
     158            int highestConfidence = -1; 
     159            MethodInfo matchedMethodInfo = null; 
     160            bool confidenceConflict = false; 
     161 
     162            int requiredParameterCount = parameterNames.Count; 
     163 
     164            foreach (MethodInfo methodInfo in methods) 
     165            { 
     166                if (!string.Equals(methodName, methodInfo.Name, StringComparison.OrdinalIgnoreCase)) 
     167                { 
     168                    continue; 
     169                } 
     170 
     171                if (methodInfo.IsGenericMethodDefinition) 
     172                { 
     173                    continue; 
     174                } 
     175 
     176                ParameterInfo[] methodParameters = methodInfo.GetParameters(); 
     177                if (methodParameters.Length != requiredParameterCount) 
     178                { 
     179                    continue; 
     180                } 
     181 
     182                // すべてのパラメータが存在するかチェック 
     183                bool parameterMismatch = false; 
     184                foreach (ParameterInfo parameterInfo in methodParameters) 
     185                { 
     186                    if (!parameterNames.Contains(parameterInfo.Name)) 
     187                    { 
     188                        parameterMismatch = true; 
     189                        break; 
     190                    } 
     191                } 
     192 
     193                if (parameterMismatch) 
     194                { 
     195                    continue; 
     196                } 
     197 
     198                // 対象のメソッドが複数ある場合、DataObjectMethodAttribute.IsDefault = true のメソッドを優先 
     199                int confidence = 0; 
     200                DataObjectMethodAttribute attribute 
     201                    = Attribute.GetCustomAttribute( 
     202                        methodInfo, 
     203                        typeof(DataObjectMethodAttribute), 
     204                        true) as DataObjectMethodAttribute; 
     205                if (attribute != null && attribute.MethodType == methodType) 
     206                { 
     207                    confidence = attribute.IsDefault ? 2 : 1; 
     208                } 
     209 
     210                if (confidence == highestConfidence) 
     211                { 
     212                    confidenceConflict = true; 
     213                } 
     214                else if (confidence > highestConfidence) 
     215                { 
     216                    highestConfidence = confidence; 
     217                    confidenceConflict = false; 
     218                    matchedMethodInfo = methodInfo; 
     219                } 
     220            } 
     221 
     222            // 同じ優先度のメソッドが複数ある場合 
     223            if (confidenceConflict) 
     224            { 
     225                return null; 
     226            } 
     227 
     228            return matchedMethodInfo; 
     229        } 
     230 
     231        /// <summary> 
     232        /// 値が空文字列では無い場合にコレクションに追加します。 
     233        /// </summary> 
     234        /// <param name="hashSet">コレクション。</param> 
     235        /// <param name="value">追加する値。</param> 
     236        private static void AddIfNotEmpty(HashSet<string> hashSet, string value) 
     237        { 
     238            if (!string.IsNullOrEmpty(value)) 
     239            { 
     240                hashSet.Add(value); 
     241            } 
     242        } 
     243 
     244        /// <summary> 
     245        /// 推測して <see cref="System.Web.UI.WebControls.ObjectDataSource.DataObjectTypeName"/> 
     246        /// を準備します。 
     247        /// </summary> 
     248        private void PrepareDataObjectTypeName() 
     249        { 
     250            // 既に設定済の場合 
     251            if (!string.IsNullOrEmpty(DataObjectTypeName)) 
     252            { 
     253                return; 
     254            } 
     255 
     256            string typeName = TypeName; 
     257            if (string.IsNullOrEmpty(typeName)) 
     258            { 
     259                return; 
     260            } 
     261 
     262            string selectMethod = SelectMethod; 
     263            if (string.IsNullOrEmpty(selectMethod)) 
     264            { 
     265                return; 
     266            } 
     267 
     268            Type type = BuildManager.GetType(typeName, false, true); 
     269            if (type == null) 
     270            { 
     271                return; 
     272            } 
     273 
     274            MethodInfo methodInfo 
     275                = FindMethod(type, selectMethod, CollectSelectParameterNames(), DataObjectMethodType.Select); 
     276            if (methodInfo == null) 
     277            { 
     278                return; 
     279            } 
     280 
     281            Type dataType = TypeFinder.FindGenericCollectionMemberType(methodInfo.ReturnType, false); 
     282            if (dataType == null) 
     283            { 
     284                return; 
     285            } 
     286 
     287            DataObjectTypeName = dataType.AssemblyQualifiedName; 
     288        } 
     289 
     290        /// <summary> 
     291        /// データの取得に使うパラメータ名を収集します。 
     292        /// </summary> 
     293        /// <returns> 
     294        /// パラメータ名のコレクション。 
     295        /// </returns> 
     296        private HashSet<string> CollectSelectParameterNames() 
     297        { 
     298            HashSet<string> names = GetParameterNames(SelectParameters); 
     299 
     300            AddIfNotEmpty(names, SortParameterName); 
     301 
     302            if (EnablePaging) 
     303            { 
     304                AddIfNotEmpty(names, MaximumRowsParameterName); 
     305                AddIfNotEmpty(names, StartRowIndexParameterName); 
     306            } 
     307 
     308            return names; 
    49309        } 
    50310    } 
  • framework/trunk/WebLibrary/Sources/UI/WebControls/TimeBox.cs

    r864 r1608  
    5353 
    5454        /// <summary> 
     55        /// <see cref="RenderingMode"/> プロパティ用のキー。 
     56        /// </summary> 
     57        private const string RenderingModeKey = "RenderingMode"; 
     58 
     59        /// <summary> 
    5560        /// <see cref="ShowSpinButton"/> プロパティ用のキー。 
    5661        /// </summary> 
     
    9196        } 
    9297 
     98 
     99        /// <summary> 
     100        /// レンダリングモードを取得または設定します。 
     101        /// </summary> 
     102        /// <value> 
     103        /// レンダリングモード。 
     104        /// 既定値は <c>RenderingMode.Default</c> で 
     105        /// <c>RenderingMode.ClientScript</c> と同じ。 
     106        /// </value> 
     107        [Themeable(false)] 
     108        [DefaultValue(RenderingMode.Default)] 
     109        [WebCategory("Appearance")] 
     110        [WebDescription("Description_RenderingMode")] 
     111        public virtual RenderingMode RenderingMode 
     112        { 
     113            get 
     114            { 
     115                return (RenderingMode)(ViewState[RenderingModeKey] ?? RenderingMode.Default); 
     116            } 
     117 
     118            set 
     119            { 
     120                ViewState[RenderingModeKey] = value; 
     121            } 
     122        } 
    93123 
    94124        /// <summary> 
     
    112142            get 
    113143            { 
    114                 return TextBoxMode.SingleLine; 
    115             } 
    116  
    117             set 
    118             { 
    119                 if (value == TextBoxMode.SingleLine) 
     144                return RenderingMode == RenderingMode.Browser 
     145                    ? TextBoxMode.Time 
     146                    : TextBoxMode.SingleLine; 
     147            } 
     148 
     149            set 
     150            { 
     151                if (value == TextBoxMode.Time || value == TextBoxMode.SingleLine) 
    120152                { 
    121153                    base.TextMode = value; 
     
    188220        /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 
    189221        /// </value> 
    190         [Browsable(false)] 
     222        [Bindable(true, BindingDirection.TwoWay)] 
     223        [Themeable(false)] 
     224        [DefaultValue(null)] 
     225        [TypeConverter(typeof(NullableExtendedConverter))] 
    191226        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     227        [WebCategory("Behavior")] 
     228        [WebDescription("Description_TimeBox_Value")] 
    192229        public virtual int? Value 
    193230        { 
     
    200237                } 
    201238 
    202                 return (int)TimeSpan.Parse(text).TotalMinutes; 
     239                TimeSpan value; 
     240                return TimeSpan.TryParse( 
     241                    text, 
     242                    RenderingMode == RenderingMode.Browser 
     243                        ? CultureInfo.InvariantCulture 
     244                        : CultureInfo.CurrentCulture, 
     245                    out value) 
     246                    ? (int)value.TotalMinutes 
     247                    : (int?)null; 
    203248            } 
    204249 
     
    207252                Text 
    208253                    = value.HasValue 
    209                         ? string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}", value.Value / 60, value.Value % 60) 
     254                        ? FormatTime(value.Value) 
    210255                        : string.Empty; 
    211256            } 
     
    220265        /// 既定値は <see langword="true"/> です。 
    221266        /// </value> 
     267        /// <remarks> 
     268        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     269        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     270        /// </remarks> 
    222271        [Themeable(false)] 
    223272        [DefaultValue(true)] 
     
    245294        /// 既定値は <c>500</c> ミリ秒です。 
    246295        /// </value> 
     296        /// <remarks> 
     297        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     298        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     299        /// </remarks> 
    247300        [Themeable(false)] 
    248301        [DefaultValue(500)] 
     
    270323        /// 既定値は <c>100</c> ミリ秒です。 
    271324        /// </value> 
     325        /// <remarks> 
     326        /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 
     327        /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 
     328        /// </remarks> 
    272329        [Themeable(false)] 
    273330        [DefaultValue(100)] 
     
    317374        /// <value> 
    318375        /// 最小値を表す0時0分からの通算の分数。 
    319         /// 未指定の場合は <see langword="null"/> です。 
    320376        /// 既定値は <see langword="null"/> です。 
    321377        /// </value> 
    322378        [Themeable(false)] 
    323         [DefaultValue((object)null)] 
     379        [DefaultValue(null)] 
     380        [TypeConverter(typeof(NullableExtendedConverter))] 
    324381        [WebCategory("Behavior")] 
    325382        [WebDescription("Description_MinimumValue")] 
     
    343400        /// <value> 
    344401        /// 最大値を表す0時0分からの通算の分数。 
    345         /// 未指定の場合は <see langword="null"/> です。 
    346402        /// 既定値は <see langword="null"/> です。 
    347403        /// </value> 
    348404        [Themeable(false)] 
    349         [DefaultValue((object)null)] 
     405        [DefaultValue(null)] 
    350406        [TypeConverter(typeof(NullableExtendedConverter))] 
    351407        [WebCategory("Behavior")] 
     
    389445            // 親を呼び出す 
    390446            base.OnPreRender(e); 
     447 
     448            if (RenderingMode == RenderingMode.Browser) 
     449            { 
     450                return; 
     451            } 
    391452 
    392453            StyleUtility.RegisterJQuerySpinedit(); 
     
    472533                true); 
    473534        } 
     535 
     536        /// <summary> 
     537        /// コントロールについて表示する必要のある HTML 属性およびスタイルを、指定した 
     538        /// <see cref="HtmlTextWriter"/> オブジェクトに追加します。 
     539        /// </summary> 
     540        /// <param name="writer"> 
     541        /// HTML コンテンツをクライアントに表示する出力ストリームを表す 
     542        /// <see cref="HtmlTextWriter"/>。 
     543        /// </param> 
     544        protected override void AddAttributesToRender(HtmlTextWriter writer) 
     545        { 
     546            // 親を呼び出す 
     547            base.AddAttributesToRender(writer); 
     548 
     549            if (RenderingMode != RenderingMode.Browser) 
     550            { 
     551                return; 
     552            } 
     553 
     554            int? minimunValue = MinimumValue; 
     555            if (minimunValue.HasValue && 0 < minimunValue.Value && minimunValue.Value <= 24 * 60) 
     556            { 
     557                writer.AddAttribute("min", FormatTime(minimunValue.Value)); 
     558            } 
     559 
     560            int? maximunValue = MaximumValue; 
     561            if (maximunValue.HasValue && 0 <= maximunValue.Value && maximunValue.Value < 24 * 60) 
     562            { 
     563                writer.AddAttribute("max", FormatTime(maximunValue.Value)); 
     564            } 
     565 
     566            int stepValue = StepValue; 
     567            if (stepValue > 1) 
     568            { 
     569                writer.AddAttribute("step", (stepValue * 60).ToString(CultureInfo.InvariantCulture)); 
     570            } 
     571        } 
     572 
     573        /// <summary> 
     574        /// 時間を表す文字列に変換して返します。 
     575        /// </summary> 
     576        /// <param name="minutes">分を表す値。</param> 
     577        /// <returns> 
     578        /// <paramref name="minutes"/> の文字列表現。 
     579        /// </returns> 
     580        private static string FormatTime(int minutes) 
     581        { 
     582            return string.Format( 
     583                CultureInfo.InvariantCulture, 
     584                "{0:00}:{1:00}", 
     585                minutes / 60, 
     586                minutes % 60); 
     587        } 
    474588    } 
    475589} 
  • framework/trunk/WebLibrary/WebLibrary.csproj

    r1605 r1608  
    164164    <Compile Include="Sources\UI\WebControls\Reloader.cs" /> 
    165165    <Compile Include="Sources\UI\WebControls\DialogOpenButton.cs" /> 
     166    <Compile Include="Sources\UI\WebControls\RenderingMode.cs" /> 
    166167    <Compile Include="Sources\UI\WebControls\RowStyleField.cs" /> 
    167168    <Compile Include="Sources\UI\WebControls\StringLengthValidator.cs" /> 
詳しい使い方は TracChangeset を参照してください。