チェンジセット 1608 (default)
- 日時:
- 2023/09/10 17:08:11 (13ヵ月前)
- 場所:
- framework/trunk
- ファイル:
-
- 4個の追加
- 9個の更新
凡例:
- 未変更
- 追加
- 削除
-
framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx
r1604 r1608 4 4 Inherits="FCSoft.SilverFrost.Framework.Web.UI.WebControls.FormViewBindPage" 5 5 %> 6 <%@ Register 7 tagPrefix="uc" 8 tagName="UserControl1" 9 src="FormViewBindUserControl1.ascx" %> 10 <%@ Import Namespace="System" %> 11 <%@ Import Namespace="FCSoft.SilverFrost.Framework.Web" %> 6 12 7 13 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> … … 9 15 <html xmlns="http://www.w3.org/1999/xhtml"> 10 16 <head runat="server"> 11 <title> SelectFieldTest(in the ASPX)</title>17 <title>FormViewBind (in the ASPX)</title> 12 18 <link rel="stylesheet" href="../../Styles/main.css" type="text/css" /> 13 19 </head> … … 16 22 <div class="test test-webcontrols"> 17 23 18 <h1>UnitTestWeb/UI/WebControls/ SelectFieldPage.aspx</h1>24 <h1>UnitTestWeb/UI/WebControls/FormViewBindPage.aspx</h1> 19 25 20 26 <asp:Button ID="PostBackButton" runat="server" … … 26 32 <div> 27 33 <asp:ValidationSummary runat="server" 34 ValidationGroup="Edit" 28 35 BackColor="Red"/> 29 36 30 37 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" 34 41 SelectMethod="GetData" 35 UpdateMethod="UpdateData"/> 42 InsertMethod="InsertData" 43 UpdateMethod="UpdateData" 44 DeleteMethod="DeleteData"/> 36 45 37 46 <%-- Mode --%> … … 54 63 <asp:FormView runat="server" 55 64 DataSourceID="OuterDataSource" 56 DefaultMode="Edit"57 65 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" 58 78 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 <%-- 編集モード --%> 60 234 <EditItemTemplate> 61 235 236 <h4>Edit Mode</h4> 237 62 238 <%-- Key --%> 63 Key = [<%# Eval("Key") %>] 239 <div> 240 Key = [<%# Eval("Key") %>] 241 </div> 64 242 65 243 <%-- 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> 76 385 77 386 <%-- 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> 104 414 105 415 <%-- 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> 109 428 110 429 </EditItemTemplate> -
framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx.cs
r1604 r1608 26 26 using System.Collections; 27 27 using System.Collections.Generic; 28 using System.Collections.Specialized; 28 29 using System.Diagnostics; 29 using System.Web; 30 using System.Web.UI; 30 using System.Text; 31 31 using System.Web.UI.WebControls; 32 32 using FCSoft.SilverFrost.Framework.ComponentModel; … … 41 41 Page 42 42 { 43 /// <summary>44 /// 更新されたデータを識別するキー。45 /// </summary>46 private static readonly NamedObject UpdatedDataKey = new NamedObject("UpdatedData");47 48 49 43 #pragma warning disable 169 // CS0169 フィールド xxx は使用されませんでした。 50 44 #pragma warning disable 649 // CS0649 xxx は割り当てられません。常に既定値 null を使用します。 … … 69 63 70 64 71 /// <summary> 72 /// <see cref="FormView"/> が使用する <see cref="ObjectDataSource"/> 73 /// の為にデータを取得します。 74 /// </summary> 65 66 /// <summary> 67 /// オブジェクトを文字列表現に変換します。 68 /// </summary> 69 /// <param name="value">オブジェクト。</param> 75 70 /// <returns> 76 /// データの一覧。71 /// <paramref name="value"/> の文字列表現。 77 72 /// </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(); 114 114 } 115 115 … … 161 161 162 162 /// <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> 163 211 /// <see cref="System.Web.UI.WebControls.FormView.ItemUpdating"/> イベントハンドラです。 164 212 /// </summary> … … 168 216 { 169 217 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); 185 221 } 186 222 … … 189 225 /// </summary> 190 226 /// <param name="sender">イベントのソース。</param> 191 /// <param name="e">イベント データを格納している <see cref="FormViewUpdate EventArgs"/>。</param>227 /// <param name="e">イベント データを格納している <see cref="FormViewUpdatedEventArgs"/>。</param> 192 228 protected void OnItemUpdated(object sender, FormViewUpdatedEventArgs e) 193 229 { 194 230 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 212 560 213 561 … … 230 578 231 579 /// <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> 232 652 /// 選択された値のリスト。 233 653 /// </summary> … … 284 704 285 705 /// <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> 286 934 /// 選択された値のリストを取得または設定します。 287 935 /// </summary> … … 368 1016 } 369 1017 } 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; 370 1031 } 371 1032 } -
framework/trunk/WebApplication/UI/WebControls/FormViewBindPage.aspx.designer.cs
r1604 r1608 38 38 /// 変更するには、フィールドの宣言をデザイナー ファイルから分離コード ファイルに移動します。 39 39 /// </remarks> 40 protected global:: System.Web.UI.WebControls.ObjectDataSource OuterDataSource;40 protected global::FCSoft.SilverFrost.Framework.Web.UI.WebControls.ObjectDataSource OuterDataSource; 41 41 42 42 /// <summary> -
framework/trunk/WebApplication/WebApplication.csproj
r1605 r1608 64 64 <Content Include="UI\CulturePage.aspx" /> 65 65 <Content Include="UI\Database\SqlErrorPage.aspx" /> 66 <Content Include="UI\WebControls\FormViewBindUserControl1.ascx" /> 66 67 <Content Include="UI\WebControls\FormViewPage.aspx" /> 67 68 <Content Include="UI\WebControls\TemplateFieldPage.aspx" /> … … 260 261 <Compile Include="UI\WebControls\DialogPage.aspx.designer.cs"> 261 262 <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> 262 270 </Compile> 263 271 <Compile Include="UI\WebControls\FormViewPage.aspx.cs"> -
framework/trunk/WebLibrary/Sources/UI/WebControls/DateBox.cs
r1440 r1608 32 32 using System.Web.UI; 33 33 using System.Web.UI.WebControls; 34 using FCSoft.SilverFrost.Framework.ComponentModel; 34 35 using FCSoft.SilverFrost.Framework.Web.Properties; 35 36 … … 49 50 50 51 /// <summary> 52 /// <see cref="RenderingMode"/> プロパティ用のキー。 53 /// </summary> 54 private const string RenderingModeKey = "RenderingMode"; 55 56 /// <summary> 51 57 /// <see cref="ImageUrl"/> プロパティ用のキー。 52 58 /// </summary> … … 67 73 /// </summary> 68 74 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 }; 69 93 70 94 /// <summary> … … 124 148 } 125 149 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 } 126 175 127 176 /// <summary> … … 145 194 get 146 195 { 147 return TextBoxMode.SingleLine; 196 return RenderingMode == RenderingMode.Browser 197 ? TextBoxMode.Date 198 : TextBoxMode.SingleLine; 148 199 } 149 200 … … 221 272 /// </value> 222 273 /// <remarks> 274 /// <para> 223 275 /// このプロパティを設定すると、カレンダーを表示するイメージが表示されます。 224 276 /// <see cref="ButtonText"/> プロパティが設定されている場合、 225 277 /// <see cref="ImageUrl"/> に指定したイメージがボタン内に表示されますが、テキストは表示されません。 278 /// </para> 279 /// <para> 280 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 281 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 282 /// </para> 226 283 /// </remarks> 227 284 [DefaultValue("")] … … 249 306 /// マウス ポインタがイメージの上を移動したときに表示されるテキスト。 250 307 /// </value> 308 /// <remarks> 309 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 310 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 311 /// </remarks> 251 312 [DefaultValue("")] 252 313 [WebCategory("Behavior")] … … 273 334 /// </value> 274 335 /// <remarks> 336 /// <para> 275 337 /// このプロパティを設定すると、カレンダーを表示するボタンが表示されます。 276 338 /// <see cref="ImageUrl"/> プロパティが設定されている場合、 277 339 /// <see cref="ImageUrl"/> に指定したイメージがボタン内に表示されますが、テキストは表示されません。 340 /// </para> 341 /// <para> 342 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 343 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 344 /// </para> 278 345 /// </remarks> 279 346 [DefaultValue("")] … … 301 368 /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 302 369 /// </value> 303 [Browsable(false)] 370 [Bindable(true, BindingDirection.TwoWay)] 371 [Themeable(false)] 372 [DefaultValue(null)] 373 [TypeConverter(typeof(NullableExtendedConverter))] 304 374 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 375 [WebCategory("Behavior")] 376 [WebDescription("Description_DateBox_Value")] 305 377 public virtual DateTime? Value 306 378 { … … 312 384 && DateTime.TryParseExact( 313 385 text, 314 CreateDateFormats( ),386 CreateDateFormats(RenderingMode), 315 387 CultureInfo.CurrentCulture, 316 388 DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, … … 324 396 Text 325 397 = value.HasValue 326 ? value.Value.ToString("d", CultureInfo.CurrentCulture)398 ? FormatDate(value.Value, RenderingMode) 327 399 : 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; 328 450 } 329 451 } … … 343 465 if (validationExpression == null) 344 466 { 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 } 359 491 } 360 492 … … 386 518 string pattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 387 519 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 } 392 531 } 393 532 … … 429 568 base.OnPreRender(e); 430 569 570 if (RenderingMode == RenderingMode.Browser) 571 { 572 return; 573 } 574 431 575 ClientScriptUtility.RegisterJQueryUI(); 432 576 ClientScriptUtility.RegisterFireEvent(); … … 440 584 imageUrl = null; 441 585 } 586 587 DateTime? minimunValue = MinimumValue; 588 DateTime? maximunValue = MaximumValue; 442 589 443 590 // AgentSmith SpellCheck Disable … … 455 602 buttonImageOnly: " + string.IsNullOrEmpty(buttonText).ToString().ToLowerInvariant() + @", 456 603 buttonText: '" + ClientScriptUtility.EscapeStringForSingleQuotes(imageUrl != null ? imageToolTip : buttonText) + @"', 604 minDate: " + FormatDateScript(minimunValue) + @", 605 maxDate: " + FormatDateScript(maximunValue) + @", 457 606 gotoCurrent: true, 458 607 onSelect: function(dateText) { " + ClientScriptUtility.FireEventReference("this", "change") + @"; } … … 466 615 } 467 616 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 } 468 686 469 687 /// <summary> 470 688 /// 受け付け可能な日付のフォーマットの一覧を取得します。 471 689 /// </summary> 690 /// <param name="renderingMode">レンダリングモード。</param> 472 691 /// <returns> 473 692 /// 受け付け可能な日付のフォーマットの一覧。 474 693 /// </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 477 701 DateTimeFormatInfo dateTimeFormat = Thread.CurrentThread.CurrentCulture.DateTimeFormat; 478 702 -
framework/trunk/WebLibrary/Sources/UI/WebControls/NumericBox.cs
r931 r1608 48 48 49 49 /// <summary> 50 /// <see cref="RenderingMode"/> プロパティ用のキー。 51 /// </summary> 52 private const string RenderingModeKey = "RenderingMode"; 53 54 /// <summary> 50 55 /// <see cref="ShowSpinButton"/> プロパティ用のキー。 51 56 /// </summary> … … 96 101 } 97 102 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 } 98 128 99 129 /// <summary> … … 117 147 get 118 148 { 119 return TextBoxMode.SingleLine; 149 return RenderingMode == RenderingMode.Browser 150 ? TextBoxMode.Number 151 : TextBoxMode.SingleLine; 120 152 } 121 153 … … 197 229 /// プロパティが指定されているとその桁に合わせて四捨五入されれマス。 198 230 /// </remarks> 231 [Bindable(true, BindingDirection.TwoWay)] 232 [Themeable(false)] 199 233 [Browsable(false)] 234 [DefaultValue(null)] 235 [TypeConverter(typeof(NullableExtendedConverter))] 200 236 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 237 [WebCategory("Behavior")] 238 [WebDescription("Description_NumericBox_Value")] 201 239 public virtual double? Value 202 240 { … … 209 247 } 210 248 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)) 217 295 { 218 Text = string.Empty; 219 return; 296 return null; 220 297 } 221 298 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)) 224 345 { 225 Text = value.Value.ToString(CultureInfo.InvariantCulture); 226 return; 346 return null; 227 347 } 228 348 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; 230 367 } 231 368 } … … 239 376 /// 既定値は <see langword="true"/> です。 240 377 /// </value> 378 /// <remarks> 379 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 380 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 381 /// </remarks> 241 382 [Themeable(false)] 242 383 [DefaultValue(true)] … … 264 405 /// 既定値は <c>500</c> ミリ秒です。 265 406 /// </value> 407 /// <remarks> 408 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 409 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 410 /// </remarks> 266 411 [Themeable(false)] 267 412 [DefaultValue(500)] … … 289 434 /// 既定値は <c>100</c> ミリ秒です。 290 435 /// </value> 436 /// <remarks> 437 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 438 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 439 /// </remarks> 291 440 [Themeable(false)] 292 441 [DefaultValue(100)] … … 336 485 /// <value> 337 486 /// 最小値。 338 /// 未指定の場合は <see langword="null"/> です。339 487 /// 既定値は <see langword="null"/> です。 340 488 /// </value> 341 489 [Themeable(false)] 342 [DefaultValue((object)null)] 490 [DefaultValue(null)] 491 [TypeConverter(typeof(NullableExtendedConverter))] 343 492 [WebCategory("Behavior")] 344 493 [WebDescription("Description_MinimumValue")] … … 362 511 /// <value> 363 512 /// 最大値。 364 /// 未指定の場合は <see langword="null"/> です。365 513 /// 既定値は <see langword="null"/> です。 366 514 /// </value> 367 515 [Themeable(false)] 368 [DefaultValue( (object)null)]516 [DefaultValue(null)] 369 517 [TypeConverter(typeof(NullableExtendedConverter))] 370 518 [WebCategory("Behavior")] … … 389 537 /// <value> 390 538 /// 少数以下の桁数の精度を表す <c>0</c> から <c>13</c> の値。 391 /// 未指定の場合は <see langword="null"/> です。 392 /// 既定値は <see langword="null"/> です。 539 /// 既定値は <c>0</c> で、精度の調整が行われません。 393 540 /// </value> 394 541 /// <remarks> 395 542 /// このプロパティを設定しても、すでに <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)] 400 547 [TypeConverter(typeof(NullableExtendedConverter))] 401 548 [WebCategory("Behavior")] … … 422 569 /// 既定値は 「<c>0123456789.-</c>」 です。 423 570 /// </value> 571 /// <remarks> 572 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 573 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 574 /// </remarks> 424 575 [Themeable(false)] 425 576 [DefaultValue("0123456789.-")] … … 464 615 // 親を呼び出す 465 616 base.OnPreRender(e); 617 618 if (RenderingMode == RenderingMode.Browser) 619 { 620 return; 621 } 466 622 467 623 StyleUtility.RegisterJQuerySpinedit(); … … 488 644 true); 489 645 } 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 } 490 708 } 491 709 } -
framework/trunk/WebLibrary/Sources/UI/WebControls/ObjectDataSource.cs
r1600 r1608 22 22 namespace FCSoft.SilverFrost.Framework.Web.UI.WebControls 23 23 { 24 using System; 25 using System.Collections.Generic; 24 26 using System.ComponentModel; 25 27 using System.Drawing; 28 using System.Reflection; 29 using System.Web.Compilation; 26 30 using System.Web.UI; 31 using System.Web.UI.WebControls; 32 using FCSoft.SilverFrost.Framework.Reflection; 27 33 28 34 … … 42 48 { 43 49 /// <summary> 50 /// <see cref="AutoDetectDataObjectTypeName"/> プロパティ用のキー。 51 /// </summary> 52 private const string AutoDetectDataObjectTypeNameKey = "AutoDetectDataObjectTypeName"; 53 54 55 /// <summary> 44 56 /// インスタンスを作成します。 45 57 /// </summary> … … 47 59 { 48 60 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; 49 309 } 50 310 } -
framework/trunk/WebLibrary/Sources/UI/WebControls/TimeBox.cs
r864 r1608 53 53 54 54 /// <summary> 55 /// <see cref="RenderingMode"/> プロパティ用のキー。 56 /// </summary> 57 private const string RenderingModeKey = "RenderingMode"; 58 59 /// <summary> 55 60 /// <see cref="ShowSpinButton"/> プロパティ用のキー。 56 61 /// </summary> … … 91 96 } 92 97 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 } 93 123 94 124 /// <summary> … … 112 142 get 113 143 { 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) 120 152 { 121 153 base.TextMode = value; … … 188 220 /// <see cref="Text"/> プロパティの値が空文字列の場合は <see langword="null"/> 参照。 189 221 /// </value> 190 [Browsable(false)] 222 [Bindable(true, BindingDirection.TwoWay)] 223 [Themeable(false)] 224 [DefaultValue(null)] 225 [TypeConverter(typeof(NullableExtendedConverter))] 191 226 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 227 [WebCategory("Behavior")] 228 [WebDescription("Description_TimeBox_Value")] 192 229 public virtual int? Value 193 230 { … … 200 237 } 201 238 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; 203 248 } 204 249 … … 207 252 Text 208 253 = value.HasValue 209 ? string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}", value.Value / 60, value.Value % 60)254 ? FormatTime(value.Value) 210 255 : string.Empty; 211 256 } … … 220 265 /// 既定値は <see langword="true"/> です。 221 266 /// </value> 267 /// <remarks> 268 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 269 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 270 /// </remarks> 222 271 [Themeable(false)] 223 272 [DefaultValue(true)] … … 245 294 /// 既定値は <c>500</c> ミリ秒です。 246 295 /// </value> 296 /// <remarks> 297 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 298 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 299 /// </remarks> 247 300 [Themeable(false)] 248 301 [DefaultValue(500)] … … 270 323 /// 既定値は <c>100</c> ミリ秒です。 271 324 /// </value> 325 /// <remarks> 326 /// <see cref="RenderingMode"/> が <c>RenderingMode.Browser</c> 327 /// の場合はこのプロパティの値は無視されブラウザの実装に依存します。 328 /// </remarks> 272 329 [Themeable(false)] 273 330 [DefaultValue(100)] … … 317 374 /// <value> 318 375 /// 最小値を表す0時0分からの通算の分数。 319 /// 未指定の場合は <see langword="null"/> です。320 376 /// 既定値は <see langword="null"/> です。 321 377 /// </value> 322 378 [Themeable(false)] 323 [DefaultValue((object)null)] 379 [DefaultValue(null)] 380 [TypeConverter(typeof(NullableExtendedConverter))] 324 381 [WebCategory("Behavior")] 325 382 [WebDescription("Description_MinimumValue")] … … 343 400 /// <value> 344 401 /// 最大値を表す0時0分からの通算の分数。 345 /// 未指定の場合は <see langword="null"/> です。346 402 /// 既定値は <see langword="null"/> です。 347 403 /// </value> 348 404 [Themeable(false)] 349 [DefaultValue( (object)null)]405 [DefaultValue(null)] 350 406 [TypeConverter(typeof(NullableExtendedConverter))] 351 407 [WebCategory("Behavior")] … … 389 445 // 親を呼び出す 390 446 base.OnPreRender(e); 447 448 if (RenderingMode == RenderingMode.Browser) 449 { 450 return; 451 } 391 452 392 453 StyleUtility.RegisterJQuerySpinedit(); … … 472 533 true); 473 534 } 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 } 474 588 } 475 589 } -
framework/trunk/WebLibrary/WebLibrary.csproj
r1605 r1608 164 164 <Compile Include="Sources\UI\WebControls\Reloader.cs" /> 165 165 <Compile Include="Sources\UI\WebControls\DialogOpenButton.cs" /> 166 <Compile Include="Sources\UI\WebControls\RenderingMode.cs" /> 166 167 <Compile Include="Sources\UI\WebControls\RowStyleField.cs" /> 167 168 <Compile Include="Sources\UI\WebControls\StringLengthValidator.cs" />
※ 詳しい使い方は
TracChangeset を参照してください。