From b00e9fd4131f227bf1690c7741fdd16039f6e7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E7=94=9F=E7=9F=B3=E4=B8=8A?= Date: Sun, 10 Jan 2016 01:10:35 -0500 Subject: [PATCH] v4.2.3 --- .../CollapsablePanel.cs | 5 +- .../PanelBase.cs | 100 +- .../BoxComponent.Field/Field.cs | 27 +- .../ControlBase/ControlBase.cs | 8 +- FineUI/Business/Config/ConfigSection.cs | 17 + FineUI/Business/Config/Constants.cs | 5 + FineUI/Business/Config/GlobalConfig.cs | 8 + FineUI/Business/Enums/Grid/FieldType.cs | 7 + FineUI/Business/Enums/Layout.cs | 14 +- .../ResourceManager/CommonResourceHelper.cs | 14 +- .../ResourceManager/ResourceHandler.cs | 93 +- .../ResourceManager/ResourceManager.cs | 4 +- .../ResourceManager/ResponseFilter.cs | 73 +- FineUI/Business/Util/JSONUtil.cs | 15 + FineUI/Business/Util/StringUtil.cs | 129 +- FineUI/Properties/AssemblyInfo.cs | 2 +- FineUI/StaticClass/ActiveWindow.cs | 15 +- FineUI/StaticClass/Alert.cs | 196 +- FineUI/StaticClass/Confirm.cs | 697 +- FineUI/WebControls/Component.Button/Button.cs | 4 +- .../ControlBase.PageManager/PageManager.cs | 142 +- .../FileUpload.cs | 2 +- .../PanelBase.CollapsablePanel.Form/Form.cs | 787 +- .../FormRow/FormRow.cs | 312 +- .../PanelBase.CollapsablePanel.Tree/Tree.cs | 47 +- .../TreeNode/TreeNode.cs | 21 + .../Window.cs | 6 +- .../EventArgs/GridAfterEditEventArgs.cs | 33 +- .../EventArgs/GridCommandEventArgs.cs | 35 +- .../EventArgs/GridPreRowEventArgs.cs | 3 +- .../EventArgs/GridRowClickEventArgs.cs | 16 +- .../EventArgs/GridRowEventArgs.cs | 41 +- .../EventArgs/GridRowSelectEventArgs.cs | 17 +- .../EventArgs/GridSortEventArgs.cs | 19 +- FineUI/WebControls/PanelBase.Grid/Grid.cs | 1383 +- .../GridColumn/CheckBoxField.cs | 2 +- .../GridColumn/GridColumn/GridColumn.cs | 31 +- .../GridColumn/LinkButtonField.cs | 2 +- .../GridColumn/RenderField/RenderBaseField.cs | 69 + .../RenderField/RenderCheckField.cs | 8 +- .../GridColumn/RenderField/RenderField.cs | 33 + .../PanelBase.Grid/GridRow/GridRow.cs | 106 +- FineUI/bin/Release/FineUI.dll | Bin 641024 -> 0 bytes FineUI/bin/Release/FineUI.xml | 21256 ---------------- FineUI/release_history.txt | 130 +- 45 files changed, 3716 insertions(+), 22218 deletions(-) delete mode 100644 FineUI/bin/Release/FineUI.dll delete mode 100644 FineUI/bin/Release/FineUI.xml diff --git a/FineUI/BaseWebControls/BoxComponent.Container.PanelBase.CollapsablePanel/CollapsablePanel.cs b/FineUI/BaseWebControls/BoxComponent.Container.PanelBase.CollapsablePanel/CollapsablePanel.cs index 175c041..a3cb664 100644 --- a/FineUI/BaseWebControls/BoxComponent.Container.PanelBase.CollapsablePanel/CollapsablePanel.cs +++ b/FineUI/BaseWebControls/BoxComponent.Container.PanelBase.CollapsablePanel/CollapsablePanel.cs @@ -355,7 +355,10 @@ namespace FineUI if (ShowHeader) { - OB.AddProperty("title", String.IsNullOrEmpty(Title) ? String.Format("[{0}]", ID) : Title); + //OB.AddProperty("title", String.IsNullOrEmpty(Title) ? String.Format("[{0}]", ID) : Title); + + OB.AddProperty("title", Title); + } else { diff --git a/FineUI/BaseWebControls/BoxComponent.Container.PanelBase/PanelBase.cs b/FineUI/BaseWebControls/BoxComponent.Container.PanelBase/PanelBase.cs index d261e76..81c2a89 100644 --- a/FineUI/BaseWebControls/BoxComponent.Container.PanelBase/PanelBase.cs +++ b/FineUI/BaseWebControls/BoxComponent.Container.PanelBase/PanelBase.cs @@ -122,6 +122,86 @@ namespace FineUI #region Properties + /// + /// 最小高度 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), "")] + [Description("最小高度")] + public Unit MinHeight + { + get + { + object obj = FState["MinHeight"]; + return obj == null ? Unit.Empty : (Unit)obj; + } + set + { + FState["MinHeight"] = value; + } + } + + + /// + /// 最小宽度 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), "")] + [Description("最小宽度")] + public Unit MinWidth + { + get + { + object obj = FState["MinWidth"]; + return obj == null ? Unit.Empty : (Unit)obj; + } + set + { + FState["MinWidth"] = value; + } + } + + + + /// + /// 最大高度 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), "")] + [Description("最大高度")] + public Unit MaxHeight + { + get + { + object obj = FState["MaxHeight"]; + return obj == null ? Unit.Empty : (Unit)obj; + } + set + { + FState["MaxHeight"] = value; + } + } + + + /// + /// 最大宽度 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), "")] + [Description("最大宽度")] + public Unit MaxWidth + { + get + { + object obj = FState["MaxWidth"]; + return obj == null ? Unit.Empty : (Unit)obj; + } + set + { + FState["MaxWidth"] = value; + } + } + /// /// 启用自定义的圆角边框 @@ -776,7 +856,25 @@ namespace FineUI #endregion - #region Width/Height + #region MinHeight/MinHeight + + if (MinHeight != Unit.Empty) + { + OB.AddProperty("minHeight", MinHeight.Value); + } + if (MinWidth != Unit.Empty) + { + OB.AddProperty("minWidth", MinWidth.Value); + } + if (MaxHeight != Unit.Empty) + { + OB.AddProperty("maxHeight", MaxHeight.Value); + } + if (MaxWidth != Unit.Empty) + { + OB.AddProperty("maxWidth", MaxWidth.Value); + } + //// 对于Panel,如果宽度/高度没有定义 //if (Width == Unit.Empty && AutoWidth) diff --git a/FineUI/BaseWebControls/BoxComponent.Field/Field.cs b/FineUI/BaseWebControls/BoxComponent.Field/Field.cs index 645ee7a..66f7c93 100644 --- a/FineUI/BaseWebControls/BoxComponent.Field/Field.cs +++ b/FineUI/BaseWebControls/BoxComponent.Field/Field.cs @@ -343,6 +343,26 @@ namespace FineUI } } + + /// + /// 表单中标签的位置 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(null)] + [Description("表单中标签的位置")] + public LabelAlign? LabelAlign + { + get + { + object obj = FState["LabelAlign"]; + return obj == null ? null : (LabelAlign?)obj; + } + set + { + FState["LabelAlign"] = value; + } + } + #endregion #region OnPreRender @@ -357,7 +377,7 @@ namespace FineUI StringBuilder sb = new StringBuilder(); if (PropertyModified("Readonly")) { - sb.AppendFormat("{0}.setReadOnly({1});", XID, Readonly.ToString().ToLower()); + sb.AppendFormat("{0}.f_setReadOnly();", XID); } if (PropertyModified("Label")) @@ -429,6 +449,11 @@ namespace FineUI OB.AddProperty("labelSeparator", LabelSeparator); } + if (LabelAlign != null) + { + OB.AddProperty("labelAlign", LabelAlignHelper.GetName(LabelAlign.Value)); + } + if (LabelWidth != ConfigPropertyValue.FORM_LABELWIDTH_DEFAULT) { OB.AddProperty("labelWidth", LabelWidth.Value); diff --git a/FineUI/BaseWebControls/ControlBase/ControlBase.cs b/FineUI/BaseWebControls/ControlBase/ControlBase.cs index 70342e0..5f742bf 100644 --- a/FineUI/BaseWebControls/ControlBase/ControlBase.cs +++ b/FineUI/BaseWebControls/ControlBase/ControlBase.cs @@ -978,7 +978,7 @@ namespace FineUI if (currentModifiedProperties.Count > 0) { // 更新当前控件的 F_STATE 状态 - sb.AppendFormat("F.state({0},{1});", XID, ConvertPropertiesToJObject(currentModifiedProperties).ToString(Formatting.None)); + sb.AppendFormat("F.f_state({0},{1});", XID, ConvertPropertiesToJObject(currentModifiedProperties).ToString(Formatting.None)); } sb.Append(GetHiddenPropertyChangedScript()); @@ -1598,18 +1598,18 @@ namespace FineUI if (enableAjax != PageManager.Instance.EnableAjax) { - sb.AppendFormat("F.control_enable_ajax={0};", enableAjax ? "true" : "false"); + sb.AppendFormat("F.controlEnableAjax={0};", enableAjax ? "true" : "false"); } if (EnableAjaxLoading != PageManager.Instance.EnableAjaxLoading) { - sb.AppendFormat("F.control_enable_ajax_loading={0};", EnableAjaxLoading ? "true" : "false"); + sb.AppendFormat("F.controlEnableAjaxLoading={0};", EnableAjaxLoading ? "true" : "false"); } if (AjaxLoadingType != PageManager.Instance.AjaxLoadingType) { - sb.AppendFormat("F.control_ajax_loading_type='{0}';", AjaxLoadingTypeName.GetName(AjaxLoadingType)); + sb.AppendFormat("F.controlAjaxLoadingType='{0}';", AjaxLoadingTypeName.GetName(AjaxLoadingType)); } sb.Append(Page.ClientScript.GetPostBackEventReference(this, eventArgument)); diff --git a/FineUI/Business/Config/ConfigSection.cs b/FineUI/Business/Config/ConfigSection.cs index 232ae93..304840e 100644 --- a/FineUI/Business/Config/ConfigSection.cs +++ b/FineUI/Business/Config/ConfigSection.cs @@ -81,6 +81,23 @@ namespace FineUI } } + /// + /// ֮ļ + /// + [ConfigurationProperty(ConfigPropertyName.FORMROWITEMSSPACE, DefaultValue = ConfigPropertyValue.FORMROW_ITEMSSPACE_DEFAULT)] + public int FormRowItemsSpace + { + get + { + return (int)base[ConfigPropertyName.FORMROWITEMSSPACE]; + } + set + { + base[ConfigPropertyName.FORMROWITEMSSPACE] = value; + } + } + + /// /// бǩλ /// diff --git a/FineUI/Business/Config/Constants.cs b/FineUI/Business/Config/Constants.cs index 6bc8c84..fe4143a 100644 --- a/FineUI/Business/Config/Constants.cs +++ b/FineUI/Business/Config/Constants.cs @@ -119,6 +119,8 @@ namespace FineUI public const string ENABLEFSTATECOMPRESS = "EnableFStateCompress"; public const string IEEDGE = "IEEdge"; public const string ENABLEFORMCHANGECONFIRM = "EnableFormChangeConfirm"; + + public const string FORMROWITEMSSPACE = "FormRowItemsSpace"; } /// @@ -182,6 +184,9 @@ namespace FineUI public const bool ENABLE_FSTATE_COMPRESS = false; public const bool ENABLE_FORMCHANGECONFIRM_DEFAULT = false; + + public const int FORMROW_ITEMSSPACE_DEFAULT = 8; + public const string FORMROW_ITEMSSPACE_DEFAULT_STRING = "8"; } diff --git a/FineUI/Business/Config/GlobalConfig.cs b/FineUI/Business/Config/GlobalConfig.cs index e8c1259..f43246c 100644 --- a/FineUI/Business/Config/GlobalConfig.cs +++ b/FineUI/Business/Config/GlobalConfig.cs @@ -148,6 +148,14 @@ namespace FineUI return (MessageTarget)Enum.Parse(typeof(MessageTarget), section.FormMessageTarget, true); } + /// + /// 表单行子项之间的间距 + /// + public static int GetFormRowItemsSpace() + { + return section.FormRowItemsSpace; + } + /// /// 表单中标签的位置 /// diff --git a/FineUI/Business/Enums/Grid/FieldType.cs b/FineUI/Business/Enums/Grid/FieldType.cs index f8d9321..6bb5edc 100644 --- a/FineUI/Business/Enums/Grid/FieldType.cs +++ b/FineUI/Business/Enums/Grid/FieldType.cs @@ -26,6 +26,10 @@ namespace FineUI /// Float, /// + /// 双精度浮点数(精度为15~16) + /// + Double, + /// /// 布尔型 /// Boolean, @@ -61,6 +65,9 @@ namespace FineUI case FieldType.Boolean: result = "boolean"; break; + case FieldType.Double: + result = "double"; + break; case FieldType.Date: result = "date"; break; diff --git a/FineUI/Business/Enums/Layout.cs b/FineUI/Business/Enums/Layout.cs index 4749a43..a958005 100644 --- a/FineUI/Business/Enums/Layout.cs +++ b/FineUI/Business/Enums/Layout.cs @@ -53,10 +53,10 @@ namespace FineUI /// 手风琴布局(只用于Accordion控件) /// Accordion, - /// - /// 表单布局(用于SimpleForm和Form控件) - /// - Form, + ///// + ///// 表单布局(用于SimpleForm和Form控件) + ///// + //Form, /// /// 卡片布局(只用于TabStrip控件) /// @@ -115,9 +115,9 @@ namespace FineUI case Layout.Fit: result = "fit"; break; - case Layout.Form: - result = "form"; - break; + //case Layout.Form: + // result = "form"; + // break; case Layout.Absolute: result = "absolute"; break; diff --git a/FineUI/Business/ResourceManager/CommonResourceHelper.cs b/FineUI/Business/ResourceManager/CommonResourceHelper.cs index 0d793fa..3e9566a 100644 --- a/FineUI/Business/ResourceManager/CommonResourceHelper.cs +++ b/FineUI/Business/ResourceManager/CommonResourceHelper.cs @@ -97,7 +97,7 @@ namespace FineUI string themeName = PageManager.Instance.CustomTheme; - AddCssPathToHead(page, CONTROL_ID_PREFIX + themeName + ".css", String.Format("{0}/ext-theme-{1}/all.css", page.ResolveUrl(PageManager.Instance.CustomThemeBasePath), themeName)); + AddCssPathToHead(page, CONTROL_ID_PREFIX + themeName + ".css", String.Format("{0}/ext-theme-{1}/all.css?v{2}", page.ResolveUrl(PageManager.Instance.CustomThemeBasePath), themeName, GlobalConfig.ProductVersion)); } else { @@ -108,7 +108,7 @@ namespace FineUI themeName = "classic"; } - AddCssPathToHead(page, CONTROL_ID_PREFIX + themeName + ".css", String.Format("{0}/res/ext-theme-{1}/all.css", extjsBasePath, themeName)); + AddCssPathToHead(page, CONTROL_ID_PREFIX + themeName + ".css", String.Format("{0}/res/ext-theme-{1}/all.css?v{2}", extjsBasePath, themeName, GlobalConfig.ProductVersion)); //AddCssPathToHead(page, CONTROL_ID_PREFIX + "ux.css", String.Format("{0}/res/css/ux.css", extjsBasePath)); } @@ -121,25 +121,25 @@ namespace FineUI if (GlobalConfig.GetDebugMode()) { - AddJavascriptPathToPageBottom(page, "ext-part1.js", String.Format("{0}/ext-part1.js", extjsBasePath)); - AddJavascriptPathToPageBottom(page, "ext-part2.js", String.Format("{0}/ext-part2.js", extjsBasePath)); + AddJavascriptPathToPageBottom(page, "ext-part1.js", String.Format("{0}/ext-part1.js?v{1}", extjsBasePath, GlobalConfig.ProductVersion)); + AddJavascriptPathToPageBottom(page, "ext-part2.js", String.Format("{0}/ext-part2.js?v{1}", extjsBasePath, GlobalConfig.ProductVersion)); } else { - AddJavascriptPathToPageBottom(page, "ext-all.js", String.Format("{0}/ext-all.js", extjsBasePath)); + AddJavascriptPathToPageBottom(page, "ext-all.js", String.Format("{0}/ext-all.js?v{1}", extjsBasePath, GlobalConfig.ProductVersion)); } // Neptune需要额外的JavaScript文件 if (String.IsNullOrEmpty(PageManager.Instance.CustomTheme) && PageManager.Instance.Theme == Theme.Neptune) { - AddJavascriptPathToPageBottom(page, "ext-theme-neptune.js", String.Format("{0}/ext-theme-neptune.js", extjsBasePath)); + AddJavascriptPathToPageBottom(page, "ext-theme-neptune.js", String.Format("{0}/ext-theme-neptune.js?v{1}", extjsBasePath, GlobalConfig.ProductVersion)); } // 语言资源应该放在最后,其中包含对 X.js 的语言定义 string langName = LanguageHelper.GetName(PageManager.Instance.Language); - AddJavascriptPathToPageBottom(page, langName + ".js", String.Format("{0}/lang/{1}.js", extjsBasePath, langName)); + AddJavascriptPathToPageBottom(page, langName + ".js", String.Format("{0}/lang/{1}.js?v{2}", extjsBasePath, langName, GlobalConfig.ProductVersion)); #endregion } diff --git a/FineUI/Business/ResourceManager/ResourceHandler.cs b/FineUI/Business/ResourceManager/ResourceHandler.cs index e6f3a0d..a61c048 100644 --- a/FineUI/Business/ResourceManager/ResourceHandler.cs +++ b/FineUI/Business/ResourceManager/ResourceHandler.cs @@ -22,38 +22,19 @@ namespace FineUI string type = String.Empty; string typeValue = String.Empty; string extjsBasePath = GlobalConfig.GetJSBasePath(); - //resName = "FineUI."; if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["icon"])) { type = "icon"; } - //else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["js"])) - //{ - // type = "js"; - // //resName += "js." + typeValue; - //} - //else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["lang"])) - //{ - // type = "lang"; - // //resName += "js.lang." + typeValue; - //} else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["theme"])) { - // res.axd?theme=default.grid.refresh.gif type = "theme"; - //resName += "res.theme." + typeValue; } - //else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["css"])) - //{ - // type = "css"; - // //resName += "res.css." + typeValue; - //} else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["img"])) { type = "img"; - //resName += "res.img." + typeValue; } else { @@ -61,7 +42,8 @@ namespace FineUI return; } - //byte[] binary; + string filePath = String.Empty; + string fileBasePath = String.Empty; switch (type) { case "icon": @@ -69,23 +51,9 @@ namespace FineUI { typeValue = IconHelper.GetName((Icon)Enum.Parse(typeof(Icon), typeValue)); } - //resName += "res.icon." + typeValue; - string serverPath = String.Format("{0}/{1}", GlobalConfig.GetIconBasePath(), typeValue); - context.Response.WriteFile(context.Server.MapPath(serverPath)); - - context.Response.ContentType = "image/" + GetImageFormat(typeValue); + fileBasePath = GlobalConfig.GetIconBasePath(); + filePath = String.Format("{0}/{1}", fileBasePath, typeValue); break; - //case "js": - // context.Response.Write(ResourceHelper.GetResourceContent(resName)); - // context.Response.ContentType = "text/javascript"; - //case "lang": - // context.Response.Write(ResourceHelper.GetResourceContent(resName)); - // context.Response.ContentType = "text/javascript"; - // break; - //case "css": - // context.Response.Write(ResourceHelper.GetResourceContent(resName)); - // context.Response.ContentType = "text/css"; - // break; case "theme": string themePath = ""; string themeImageFormat = ""; @@ -96,22 +64,39 @@ namespace FineUI themeImageFormat = typeValue.Substring(lastDotIndex + 1); } - context.Response.WriteFile(context.Server.MapPath(String.Format("{0}/res/images/{1}.{2}", extjsBasePath, themePath, themeImageFormat))); - - context.Response.ContentType = "image/" + GetImageFormat(typeValue); + fileBasePath = String.Format("{0}/res/images", extjsBasePath); + filePath = String.Format("{0}/{1}.{2}", fileBasePath, themePath, themeImageFormat); break; case "img": - //binary = ResourceHelper.GetResourceContentAsBinary(resName); - //context.Response.OutputStream.Write(binary, 0, binary.Length); - //context.Response.ContentType = "image/" + GetImageFormat(resName); - - - context.Response.WriteFile(context.Server.MapPath(String.Format("{0}/res/images/{1}", extjsBasePath, typeValue))); - - context.Response.ContentType = "image/" + GetImageFormat(typeValue); + fileBasePath = String.Format("{0}/res/images", extjsBasePath); + filePath = String.Format("{0}/{1}", fileBasePath, typeValue); break; } + string imageType = GetImageFormat(typeValue); + string filePathServer = context.Server.MapPath(filePath); + + // 非法图片后缀 + if (!_allowedImageTypes.Contains(imageType)) + { + return; + } + + // 不是根目录下的文件 + string rootPath = context.Server.MapPath(fileBasePath); + if (!filePathServer.StartsWith(rootPath)) + { + return; + } + + // 不存在此文件 + if (!File.Exists(filePathServer)) + { + return; + } + + context.Response.WriteFile(filePathServer); + context.Response.ContentType = "image/" + imageType; // 缓存一年,只能通过改变 URL 来强制更新缓存 context.Response.Cache.SetExpires(DateTime.Now.AddYears(1)); @@ -136,16 +121,22 @@ namespace FineUI // } //} - private string GetImageFormat(string imageName) + private string GetImageFormat(string fileName) { - int lastDotIndex = imageName.LastIndexOf("."); + string imageFormat = String.Empty; + + int lastDotIndex = fileName.LastIndexOf("."); if (lastDotIndex >= 0) { - return imageName.Substring(lastDotIndex + 1); + imageFormat = fileName.Substring(lastDotIndex + 1); } - return "png"; + return imageFormat; } + + private static readonly List _allowedImageTypes = new List { "bmp", "gif", "jpg", "jpeg", "png", "tiff", "icon" }; + + private string GetImageFormat(ImageFormat format) { if (format == ImageFormat.Bmp) diff --git a/FineUI/Business/ResourceManager/ResourceManager.cs b/FineUI/Business/ResourceManager/ResourceManager.cs index d3c2860..dbf5aab 100644 --- a/FineUI/Business/ResourceManager/ResourceManager.cs +++ b/FineUI/Business/ResourceManager/ResourceManager.cs @@ -61,8 +61,8 @@ namespace FineUI public static readonly string PAGE_STATE_CHANGED_ID = "F_CHANGED"; - // 在FineUI-Utility.js中被使用,不要修改 - public static readonly string DISABLED_CONTROL_BEFORE_POSTBACK = "F_TARGET"; + //// 在FineUI-Utility.js中被使用,不要修改 + //public static readonly string DISABLED_CONTROL_BEFORE_POSTBACK = "F_TARGET"; diff --git a/FineUI/Business/ResourceManager/ResponseFilter.cs b/FineUI/Business/ResourceManager/ResponseFilter.cs index 220b473..987e49f 100644 --- a/FineUI/Business/ResourceManager/ResponseFilter.cs +++ b/FineUI/Business/ResourceManager/ResponseFilter.cs @@ -154,8 +154,8 @@ namespace FineUI #endregion #region 页面上每个控件应该输出的脚本 - // 设置提交表单的按钮等元素可用enable(有可能在后面的被覆盖) - sb.Append(GetEnableTargetControlScript()); + //// 设置提交表单的按钮等元素可用enable(有可能在后面的被覆盖) + //sb.Append(GetEnableTargetControlScript()); // 添加所有需要在AJAX时更新的脚本 StringBuilder ajaxScriptBuilder = new StringBuilder(); @@ -168,6 +168,7 @@ namespace FineUI ajaxScriptBuilder.Append(script); } + /* StringBuilder gridTplsBuilder = new StringBuilder(); StringBuilder shortNameBuilder = new StringBuilder(); Dictionary shortNameDic = ResourceManager.Instance.AjaxShortNameList; @@ -215,9 +216,41 @@ namespace FineUI gridTplsBuilder.AppendFormat("F('{0}').f_updateTpls({1});", clientId, GetGridTpls(doc, clientId)); } } + */ + // 2. 短名称 + string shortNameScript = String.Empty; + List shortNameList = new List(); + Dictionary shortNameDic = ResourceManager.Instance.AjaxShortNameList; + if (shortNameDic.Count > 0) + { + foreach (string clientId in shortNameDic.Keys) + { + string xid = shortNameDic[clientId]; + shortNameList.Add(String.Format("{0}=F('{1}')", xid, clientId)); + } + } + if (shortNameList.Count > 0) + { + shortNameScript = String.Format("var {0};", String.Join(",", shortNameList.ToArray())); + } + + // 3. 表格相关 + StringBuilder gridTplsBuilder = new StringBuilder(); + + // 重新加载表格数据(也就是存在对f_loadData函数的调用) + if (PageManager.Instance.AjaxGridReloadedClientIDs.Count > 0) + { + foreach (string reloadGridClientID in PageManager.Instance.AjaxGridReloadedClientIDs) + { + string xid = shortNameDic[reloadGridClientID]; + gridTplsBuilder.AppendFormat("{0}.f_tpls={1};", xid, GetGridTpls(doc, reloadGridClientID)); + } + } + + // 当前控件 - sb.Append(shortNameBuilder.ToString() + gridTplsBuilder.ToString() + ajaxScriptBuilder.ToString()); + sb.Append(shortNameScript + gridTplsBuilder.ToString() + ajaxScriptBuilder.ToString()); //// 执行 onReady 脚本 @@ -284,19 +317,19 @@ namespace FineUI //} - /// - /// 设置引起本次回发的按钮(或其他控件)可用 - /// - /// - private static string GetEnableTargetControlScript() - { - string targetControlClientID = HttpContext.Current.Request.Form[ResourceManager.DISABLED_CONTROL_BEFORE_POSTBACK]; - if (!String.IsNullOrEmpty(targetControlClientID)) - { - return String.Format("F.enable('{0}');", targetControlClientID); - } - return String.Empty; - } + ///// + ///// 设置引起本次回发的按钮(或其他控件)可用 + ///// + ///// + //private static string GetEnableTargetControlScript() + //{ + // string targetControlClientID = HttpContext.Current.Request.Form[ResourceManager.DISABLED_CONTROL_BEFORE_POSTBACK]; + // if (!String.IsNullOrEmpty(targetControlClientID)) + // { + // return String.Format("F.f_enable('{0}');", targetControlClientID); + // } + // return String.Empty; + //} #endregion @@ -334,7 +367,7 @@ namespace FineUI if (!String.IsNullOrEmpty(newEventValidation) && (oldEventValidation != newEventValidation)) { - sb.Append(String.Format("F.eventValidation('{0}');", newEventValidation)); + sb.Append(String.Format("F.f_eventValidation('{0}');", newEventValidation)); } } @@ -390,7 +423,7 @@ namespace FineUI // 如果只有很少的一些字符没改变(小于等于150个字符),还是返回完整的ViewState if (changeIndex <= 150) { - sb.Append(String.Format("if(!F.viewState(__VIEWSTATE,'{0}'))return;", newViewState)); + sb.Append(String.Format("if(!F.f_viewState(__VIEWSTATE,'{0}'))return;", newViewState)); } else { @@ -400,12 +433,12 @@ namespace FineUI changedStr = newViewState.Substring(changeIndex); } - sb.Append(String.Format("if(!F.viewState(__VIEWSTATE,'{0}',{1}))return;", changedStr, changeIndex)); + sb.Append(String.Format("if(!F.f_viewState(__VIEWSTATE,'{0}',{1}))return;", changedStr, changeIndex)); } } else { - sb.Append("if(!F.viewState(__VIEWSTATE))return;"); + sb.Append("if(!F.f_viewState(__VIEWSTATE))return;"); } } diff --git a/FineUI/Business/Util/JSONUtil.cs b/FineUI/Business/Util/JSONUtil.cs index a7822e2..a5388a2 100644 --- a/FineUI/Business/Util/JSONUtil.cs +++ b/FineUI/Business/Util/JSONUtil.cs @@ -47,6 +47,11 @@ namespace FineUI /// 整型数组 public static int[] IntArrayFromJArray(JArray ja) { + if (ja == null || ja.Count == 0) + { + return new int[0]; + } + int length = ja.Count; int[] array = new int[length]; @@ -64,6 +69,11 @@ namespace FineUI /// 字符串数组 public static string[] StringArrayFromJArray(JArray ja) { + if (ja == null || ja.Count == 0) + { + return new string[0]; + } + int length = ja.Count; string[] array = new string[length]; @@ -81,6 +91,11 @@ namespace FineUI /// 对象数组 public static object[] ObjectArrayFromJArray(JArray ja) { + if (ja == null || ja.Count == 0) + { + return new object[0]; + } + int length = ja.Count; object[] array = new object[length]; diff --git a/FineUI/Business/Util/StringUtil.cs b/FineUI/Business/Util/StringUtil.cs index 094213b..aa5f48b 100644 --- a/FineUI/Business/Util/StringUtil.cs +++ b/FineUI/Business/Util/StringUtil.cs @@ -49,7 +49,7 @@ namespace FineUI /// /// GZIP压缩的ViewState隐藏字段的ID /// - public static readonly string GZIPPED_VIEWSTATE_ID = "__VIEWSTATE_GZ"; + public static readonly string GZIPPED_VIEWSTATE_ID = "__VIEWSTATE_GZ"; #endregion @@ -227,11 +227,24 @@ namespace FineUI /// /// 比较两个整形数组是否相等 + /// 顺序无关,比如 [1,2] 和 [2,1] 被认为是相同的 /// /// 整形数组1 /// 整形数组2 /// 是否相等 public static bool CompareIntArray(int[] array1, int[] array2) + { + return CompareIntArray(array1, array2, false); + } + + /// + /// 比较两个整形数组是否相等 + /// + /// 整形数组1 + /// 整形数组2 + /// 是否保持顺序 + /// 是否相等 + public static bool CompareIntArray(int[] array1, int[] array2, bool keepOrder) { if (array1 == null && array2 == null) { @@ -248,9 +261,31 @@ namespace FineUI return false; } - List list1 = new List(array1); - List list2 = new List(array2); + if (keepOrder) + { + for (int i = 0, count = array1.Length; i < count; i++) + { + if (array1[i] != array2[i]) + { + return false; + } + } + } + else + { + List list1 = new List(array1); + List list2 = new List(array2); + foreach (int item in list1) + { + if (!list2.Contains(item)) + { + return false; + } + } + } + + /* for (int i = 0; i < list1.Count; i++) { if (list1[i] != list2[i]) @@ -258,17 +293,31 @@ namespace FineUI return false; } } + */ return true; } + /// + /// 比较两个字符串数组是否相等 + /// 顺序无关,比如 ["value1","value2"] 和 ["value2","value1"] 被认为是相同的 + /// + /// 字符串数组1 + /// 字符串数组2 + /// 是否相等 + public static bool CompareStringArray(string[] array1, string[] array2) + { + return CompareStringArray(array1, array2, false); + } + /// /// 比较两个字符串数组是否相等 /// /// 字符串数组1 /// 字符串数组2 + /// 是否保持顺序 /// 是否相等 - public static bool CompareStringArray(string[] array1, string[] array2) + public static bool CompareStringArray(string[] array1, string[] array2, bool keepOrder) { if (array1 == null && array2 == null) { @@ -285,9 +334,31 @@ namespace FineUI return false; } - List list1 = new List(array1); - List list2 = new List(array2); + if (keepOrder) + { + for (int i = 0, count = array1.Length; i < count; i++) + { + if (array1[i] != array2[i]) + { + return false; + } + } + } + else + { + List list1 = new List(array1); + List list2 = new List(array2); + foreach (string item in list1) + { + if (!list2.Contains(item)) + { + return false; + } + } + } + + /* for (int i = 0; i < list1.Count; i++) { if (list1[i] != list2[i]) @@ -295,6 +366,7 @@ namespace FineUI return false; } } + */ return true; } @@ -310,17 +382,44 @@ namespace FineUI /// 小数 public static string ConvertPercentageToDecimalString(string percentageStr) { + //string decimalStr = String.Empty; + + //percentageStr = percentageStr.Trim().Replace("%", "%").TrimEnd('%'); + + //try + //{ + // decimalStr = (Convert.ToDouble(percentageStr) * 0.01).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + //} + //catch + //{ + // ; + //} + + //return decimalStr; + string decimalStr = String.Empty; - percentageStr = percentageStr.Trim().Replace("%", "%").TrimEnd('%'); + percentageStr = percentageStr.Trim().ToLower().Replace("%", "%"); + if (percentageStr.EndsWith("%")) + { + percentageStr = percentageStr.TrimEnd('%'); - try - { - decimalStr = (Convert.ToDouble(percentageStr) * 0.01).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + try + { + decimalStr = (Convert.ToDouble(percentageStr) * 0.01).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + } + catch + { + // nothing + } } - catch + else if (percentageStr.EndsWith("px")) { - ; + decimalStr = percentageStr.Substring(0, percentageStr.Length - 2); + } + else + { + decimalStr = percentageStr; } return decimalStr; @@ -370,7 +469,7 @@ namespace FineUI { byte[] toEncodeAsBytes = System.Text.UTF8Encoding.UTF8.GetBytes(toEncode); return System.Convert.ToBase64String(toEncodeAsBytes); - } + } #endregion #region Gzip/Ungzip @@ -424,7 +523,7 @@ namespace FineUI return System.Text.Encoding.UTF8.GetString(memory.ToArray()); } } - } + } #endregion #region LoadGzippedViewState @@ -453,7 +552,7 @@ namespace FineUI formatter.Serialize(writer, viewState); return StringUtil.Gzip(writer.ToString()); } - } + } #endregion } diff --git a/FineUI/Properties/AssemblyInfo.cs b/FineUI/Properties/AssemblyInfo.cs index 182eb55..d630787 100644 --- a/FineUI/Properties/AssemblyInfo.cs +++ b/FineUI/Properties/AssemblyInfo.cs @@ -42,7 +42,7 @@ using System.Web.UI; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.2.0.0")] +[assembly: AssemblyVersion("4.2.3")] diff --git a/FineUI/StaticClass/ActiveWindow.cs b/FineUI/StaticClass/ActiveWindow.cs index 51000e3..ed7ae9c 100644 --- a/FineUI/StaticClass/ActiveWindow.cs +++ b/FineUI/StaticClass/ActiveWindow.cs @@ -101,7 +101,8 @@ namespace FineUI /// 客户端脚本 public static string GetHideReference() { - return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide();}})();"; + //return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide();}})();"; + return "F.activeWnd.hide();"; } /// @@ -112,7 +113,8 @@ namespace FineUI { //return ACTIVE_WINDOW_SCRIPT + "if(aw){eval('aw[1].X.'+aw[0].id+'_hide_refresh();');}"; //return ACTIVE_WINDOW_SCRIPT + "if(aw){aw[0].box_hide_refresh();}"; - return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_refresh();}})();"; + //return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_refresh();}})();"; + return "F.activeWnd.hideRefresh();"; } /// @@ -123,7 +125,8 @@ namespace FineUI { //return ACTIVE_WINDOW_SCRIPT + "if(aw){eval('aw[1].X.'+aw[0].id+'_hide_postback();');}"; //return ACTIVE_WINDOW_SCRIPT + "if(aw){aw[0].box_hide_postback();}"; - return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_postback();}})();"; + //return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_postback();}})();"; + return "F.activeWnd.hidePostBack();"; } /// @@ -137,7 +140,8 @@ namespace FineUI //return ACTIVE_WINDOW_SCRIPT + "if(aw){aw[0].box_hide_postback('" + argument + "');}"; //return "(function(){var aw=F.wnd.getActiveWindow(); if(aw){ aw[0].box_hide_postback('" + argument + "'); }})();"; - return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_postback(" + JsHelper.Enquote(argument) + ");}})();"; + //return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_postback(" + JsHelper.Enquote(argument) + ");}})();"; + return "F.activeWnd.hidePostBack(" + JsHelper.Enquote(argument) + ");"; } @@ -148,7 +152,8 @@ namespace FineUI /// 客户端脚本 public static string GetHideExecuteScriptReference(string argument) { - return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_executescript(" + JsHelper.Enquote(argument) + ");}})();"; + //return "(function(){var aw=F.wnd.getActiveWindow();if(aw){aw.f_hide_executescript(" + JsHelper.Enquote(argument) + ");}})();"; + return "F.activeWnd.hideExecuteScript(" + JsHelper.Enquote(argument) + ");"; } diff --git a/FineUI/StaticClass/Alert.cs b/FineUI/StaticClass/Alert.cs index 25a1916..7d1bdfd 100644 --- a/FineUI/StaticClass/Alert.cs +++ b/FineUI/StaticClass/Alert.cs @@ -49,6 +49,18 @@ namespace FineUI #region class + private string _cssClass; + + /// + /// 样式类名 + /// + public string CssClass + { + get { return _cssClass; } + set { _cssClass = value; } + } + + private string _message; /// @@ -132,7 +144,8 @@ namespace FineUI /// public void Show() { - Show(Message, Title, MessageBoxIcon, OkScript, Target, Icon, IconUrl); + //Show(Message, Title, MessageBoxIcon, OkScript, Target, Icon, IconUrl); + PageContext.RegisterStartupScript(this.GetShowReference()); } /// @@ -141,7 +154,94 @@ namespace FineUI /// 客户端脚本 public string GetShowReference() { - return GetShowReference(Message, Title, MessageBoxIcon, OkScript, Target, Icon, IconUrl); + //return GetShowReference(Message, Title, MessageBoxIcon, OkScript, Target, Icon, IconUrl); + + //if (message == null) + //{ + // message = String.Empty; + //} + //if (title == null) + //{ + // title = String.Empty; + //} + + string message = ""; + string title = ""; + if (!String.IsNullOrEmpty(Message)) + { + message = Message; + } + if (!String.IsNullOrEmpty(Title)) + { + title = Title; + } + + + string addCSSScript = String.Empty; + string iconScriptFragment = String.Empty; + string resolvedIconUrl = IconHelper.GetResolvedIconUrl(Icon, IconUrl); + + Page page = HttpContext.Current.CurrentHandler as Page; + if (page != null) + { + resolvedIconUrl = page.ResolveUrl(resolvedIconUrl); + } + + Target target = Target; + // Icon 或者 IconUrl 不为空 + if (!String.IsNullOrEmpty(resolvedIconUrl)) + { + string className = String.Format("f-{0}-alert-icon", System.Guid.NewGuid().ToString("N")); + + var addCSSPrefix = String.Empty; + if (target == Target.Parent) + { + addCSSPrefix = "parent."; + } + else if (target == Target.Top) + { + addCSSPrefix = "top."; + } + addCSSScript = String.Format("{0}F.addCSS('{1}','{2}');", addCSSPrefix, className, StyleUtil.GetNoRepeatBackgroundStyle("." + className, resolvedIconUrl)); + + iconScriptFragment = String.Format("'{0}'", className); + } + else + { + iconScriptFragment = MessageBoxIconHelper.GetName(MessageBoxIcon); + } + + message = message.Replace("\r\n", "\n").Replace("\n", "
"); + title = title.Replace("\r\n", "\n").Replace("\n", "
"); + string targetScript = "window"; + if (target != Target.Self) + { + targetScript = TargetHelper.GetScriptName(target); + } + + JsObjectBuilder jsob = new JsObjectBuilder(); + if (!String.IsNullOrEmpty(CssClass)) + { + jsob.AddProperty("cls", CssClass); + } + if (!String.IsNullOrEmpty(title)) + { + jsob.AddProperty("title", title); + } + if (!String.IsNullOrEmpty(OkScript)) + { + jsob.AddProperty("ok", JsHelper.GetFunction(OkScript), true); + } + if (!String.IsNullOrEmpty(message)) + { + jsob.AddProperty("message", JsHelper.EnquoteWithScriptTag(message), true); + } + if (!String.IsNullOrEmpty(iconScriptFragment)) + { + jsob.AddProperty("messageIcon", iconScriptFragment, true); + } + + return addCSSScript + String.Format("{0}.F.alert({1});", targetScript, jsob); } #endregion @@ -473,72 +573,34 @@ namespace FineUI /// 客户端脚本 public static string GetShowReference(string message, string title, MessageBoxIcon messageBoxIcon, string okScript, Target target, Icon icon, string iconUrl) { - if (message == null) - { - message = String.Empty; - } - if (title == null) - { - title = String.Empty; - } + Alert alert = new Alert(); + alert.Message = message; + alert.Title = title; + alert.MessageBoxIcon = messageBoxIcon; + alert.OkScript = okScript; + alert.Target = target; + alert.Icon = icon; + alert.IconUrl = iconUrl; + return alert.GetShowReference(); - string addCSSScript = String.Empty; - string iconScriptFragment = String.Empty; - string resolvedIconUrl = IconHelper.GetResolvedIconUrl(icon, iconUrl); - - Page page = HttpContext.Current.CurrentHandler as Page; - if (page != null) - { - resolvedIconUrl = page.ResolveUrl(resolvedIconUrl); - } - - // Icon 或者 IconUrl 不为空 - if (!String.IsNullOrEmpty(resolvedIconUrl)) - { - string className = String.Format("f-{0}-alert-icon", System.Guid.NewGuid().ToString("N")); - - var addCSSPrefix = String.Empty; - if (target == Target.Parent) - { - addCSSPrefix = "parent."; - } - else if (target == Target.Top) - { - addCSSPrefix = "top."; - } - addCSSScript = String.Format("{0}F.addCSS('{1}','{2}');", addCSSPrefix, className, StyleUtil.GetNoRepeatBackgroundStyle("." + className, resolvedIconUrl)); - - iconScriptFragment = String.Format("'{0}'", className); - } - else - { - iconScriptFragment = MessageBoxIconHelper.GetName(messageBoxIcon); - } - - message = message.Replace("\r\n", "\n").Replace("\n", "
"); - title = title.Replace("\r\n", "\n").Replace("\n", "
"); - string targetScript = "window"; - if (target != Target.Self) - { - targetScript = TargetHelper.GetScriptName(target); - } - - if (String.IsNullOrEmpty(title) && - messageBoxIcon == DefaultMessageBoxIcon && - String.IsNullOrEmpty(okScript) && - String.IsNullOrEmpty(resolvedIconUrl)) - { - return addCSSScript + String.Format("{0}.F.alert({1});", targetScript, JsHelper.Enquote(message)); - } - else - { - return addCSSScript + String.Format("{0}.F.alert({1},{2},{3},{4});", - targetScript, - JsHelper.EnquoteWithScriptTag(message), - JsHelper.Enquote(title), - iconScriptFragment, - String.IsNullOrEmpty(okScript) ? "''" : JsHelper.GetFunction(okScript)); - } + + //if (String.IsNullOrEmpty(title) && + // messageBoxIcon == DefaultMessageBoxIcon && + // String.IsNullOrEmpty(okScript) && + // String.IsNullOrEmpty(resolvedIconUrl)) + //{ + // return addCSSScript + String.Format("{0}.F.alert({1});", targetScript, JsHelper.Enquote(message)); + //} + //else + //{ + // return addCSSScript + String.Format("{0}.F.alert({1},{2},{3},{4});", + // targetScript, + // JsHelper.EnquoteWithScriptTag(message), + // JsHelper.Enquote(title), + // iconScriptFragment, + // String.IsNullOrEmpty(okScript) ? "''" : JsHelper.GetFunction(okScript)); + //} + } #endregion diff --git a/FineUI/StaticClass/Confirm.cs b/FineUI/StaticClass/Confirm.cs index 1aba6fa..7e7a2c8 100644 --- a/FineUI/StaticClass/Confirm.cs +++ b/FineUI/StaticClass/Confirm.cs @@ -34,7 +34,7 @@ namespace FineUI /// /// 确认对话框帮助类(静态类) /// - public static class Confirm + public class Confirm { #region public static @@ -43,62 +43,447 @@ namespace FineUI /// /// 确认对话框默认图标 /// - public static MessageBoxIcon DefaultIcon = MessageBoxIcon.Question; + public static MessageBoxIcon DefaultMessageBoxIcon = MessageBoxIcon.Question; + + + ///// + ///// 确认对话框默认图标 + ///// + //public static MessageBoxIcon DefaultIcon = MessageBoxIcon.Question; #endregion - #region Show + #region class + + private string _cssClass; /// - /// 显示消息框 + /// 样式类名 /// - /// + public string CssClass + { + get { return _cssClass; } + set { _cssClass = value; } + } + + + private string _message; + + /// + /// 对话框消息正文 + /// + public string Message + { + get { return _message; } + set { _message = value; } + } + + private string _title; + + /// + /// 对话框标题 + /// + public string Title + { + get { return _title; } + set { _title = value; } + } + + private MessageBoxIcon _messageBoxIcon = DefaultMessageBoxIcon; + + /// + /// 对话框图标 + /// + public MessageBoxIcon MessageBoxIcon + { + get { return _messageBoxIcon; } + set { _messageBoxIcon = value; } + } + + private string _okScript; + + /// + /// 点击确认按钮执行的JavaScript脚本 + /// + public string OkScript + { + get { return _okScript; } + set { _okScript = value; } + } + + + private string _cancelScript; + + /// + /// 点击取消按钮执行的JavaScript脚本 + /// + public string CancelScript + { + get { return _cancelScript; } + set { _cancelScript = value; } + } + + private Target _target; + + /// + /// 对话框的目标位置 + /// + public Target Target + { + get { return _target; } + set { _target = value; } + } + + //private string _iconUrl; + + ///// + ///// 自定义对话框图标地址 + ///// + //public string IconUrl + //{ + // get { return _iconUrl; } + // set { _iconUrl = value; } + //} + + //private Icon _icon = Icon.None; + + ///// + ///// 自定义对话框图标 + ///// + //public Icon Icon + //{ + // get { return _icon; } + // set { _icon = value; } + //} + + + /// + /// 显示对话框 + /// + public void Show() + { + //Show(Message, Title, MessageBoxIcon, OkScript, Target, Icon, IconUrl); + PageContext.RegisterStartupScript(this.GetShowReference()); + } + + /// + /// 获取显示对话框的客户端脚本 + /// + /// 客户端脚本 + public string GetShowReference() + { + string message = ""; + string title = ""; + if (!String.IsNullOrEmpty(Message)) + { + message = Message; + } + if (!String.IsNullOrEmpty(Title)) + { + title = Title; + } + + + JsObjectBuilder jsOB = new JsObjectBuilder(); + + if (!String.IsNullOrEmpty(CancelScript)) + { + jsOB.AddProperty("cancel", CancelScript); + } + + if (!String.IsNullOrEmpty(OkScript)) + { + jsOB.AddProperty("ok", OkScript); + } + + if (Target != Target.Self) + { + jsOB.AddProperty("target", TargetHelper.GetName(Target)); + } + + if (MessageBoxIcon != MessageBoxIcon.Warning) + { + jsOB.AddProperty("messageIcon", MessageBoxIconHelper.GetShortName(MessageBoxIcon)); + } + + if (!String.IsNullOrEmpty(title)) + { + jsOB.AddProperty("title", title.Replace("\r\n", "\n").Replace("\n", "
")); + } + + if (!String.IsNullOrEmpty(message)) + { + jsOB.AddProperty("message", JsHelper.EnquoteWithScriptTag(message.Replace("\r\n", "\n").Replace("\n", "
")), true); + } + + return String.Format("F.confirm({0});", jsOB.ToString()); + } + + #endregion + + + #region static Show + + /// + /// 显示对话框 + /// + /// 消息正文 public static void Show(string message) { - Show(message, null, DefaultIcon); + Show(message, String.Empty, DefaultMessageBoxIcon, String.Empty, String.Empty); } /// - /// 显示消息框 + /// 显示对话框 /// - /// - /// + /// 消息正文 + /// 标题 public static void Show(string message, string title) { - Show(message, title, DefaultIcon); + Show(message, title, DefaultMessageBoxIcon, String.Empty, String.Empty); } /// - /// 显示消息框 + /// 显示对话框 /// - /// - /// + /// 消息正文 + /// 图标 public static void Show(string message, MessageBoxIcon icon) { - Show(message, null, icon); + Show(message, String.Empty, icon, String.Empty, String.Empty); } /// - /// 显示消息框 + /// 显示对话框 /// - /// - /// - /// + /// 对话框消息 + /// 对话框标题 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void Show(string message, string title, string okScript, string cancelScript) + { + Show(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 public static void Show(string message, string title, MessageBoxIcon icon) { - PageContext.RegisterStartupScript(GetShowReference(message, title, icon)); + Show(message, title, icon, String.Empty, String.Empty); } + + /// + /// 显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void Show(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + PageContext.RegisterStartupScript(GetShowReference(message, title, icon, okScript, cancelScript)); + } + + /// + /// 显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 显示对话框的目标页面 + public static void Show(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript, Target target) + { + PageContext.RegisterStartupScript(GetShowReference(message, title, icon, okScript, cancelScript, target)); + } + + #endregion + + #region static ShowInParent + + /// + /// 在父页面中显示对话框 + /// + /// 消息正文 + public static void ShowInParent(string message) + { + ShowInParent(message, String.Empty, DefaultMessageBoxIcon, String.Empty, String.Empty); + } + + /// + /// 在父页面中显示对话框 + /// + /// 消息正文 + /// 标题 + public static void ShowInParent(string message, string title) + { + ShowInParent(message, title, DefaultMessageBoxIcon, String.Empty, String.Empty); + } + + /// + /// 在父页面中显示对话框 + /// + /// 消息正文 + /// 图标 + public static void ShowInParent(string message, MessageBoxIcon icon) + { + ShowInParent(message, String.Empty, icon, String.Empty, String.Empty); + } + + /// + /// 在父页面中显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void ShowInParent(string message, string title, string okScript, string cancelScript) + { + ShowInParent(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 在父页面中显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + public static void ShowInParent(string message, string title, MessageBoxIcon icon) + { + ShowInParent(message, title, icon, String.Empty, String.Empty); + } + + /// + /// 在父页面中显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void ShowInParent(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + PageContext.RegisterStartupScript(GetShowInParentReference(message, title, icon, okScript, cancelScript)); + } + + #endregion + + #region static ShowInTop + + /// + /// 在顶层窗口中显示对话框 + /// + /// 消息正文 + public static void ShowInTop(string message) + { + ShowInTop(message, String.Empty, DefaultMessageBoxIcon, String.Empty, String.Empty); + } + + /// + /// 在顶层窗口中显示对话框 + /// + /// 消息正文 + /// 对话框标题 + public static void ShowInTop(string message, string title) + { + ShowInTop(message, title, DefaultMessageBoxIcon, String.Empty, String.Empty); + } + + /// + /// 在顶层窗口中显示对话框 + /// + /// 消息正文 + /// 对话框消息图标 + public static void ShowInTop(string message, MessageBoxIcon icon) + { + ShowInTop(message, String.Empty, icon, String.Empty, String.Empty); + } + + /// + /// 在顶层窗口中显示对话框 + /// + /// 消息正文 + /// 对话框标题 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void ShowInTop(string message, string title, string okScript, string cancelScript) + { + ShowInTop(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 在顶层窗口中显示对话框 + /// + /// 消息正文 + /// 对话框标题 + /// 对话框消息图标 + public static void ShowInTop(string message, string title, MessageBoxIcon icon) + { + ShowInTop(message, title, icon, String.Empty, String.Empty); + } + + /// + /// 在顶层窗口中显示对话框 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + public static void ShowInTop(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + PageContext.RegisterStartupScript(GetShowInTopReference(message, title, icon, okScript, cancelScript)); + } + #endregion #region GetShowReference /// - /// 获取显示确认对话框的客户端脚本 + /// 获取显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 客户端脚本 + public static string GetShowReference(string message) + { + return GetShowReference(message, String.Empty, DefaultMessageBoxIcon); + } + + /// + /// 获取显示对话框的客户端脚本 /// /// 对话框消息 /// 对话框标题 - /// 对话框图标 + /// 客户端脚本 + public static string GetShowReference(string message, string title) + { + return GetShowReference(message, title, DefaultMessageBoxIcon); + } + + /// + /// 获取显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框消息图标 + /// 客户端脚本 + public static string GetShowReference(string message, MessageBoxIcon icon) + { + return GetShowReference(message, String.Empty, icon); + } + + /// + /// 获取显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 /// 客户端脚本 public static string GetShowReference(string message, string title, MessageBoxIcon icon) { @@ -106,17 +491,30 @@ namespace FineUI } /// - /// 获取显示确认对话框的客户端脚本 + /// 获取显示对话框的客户端脚本 /// /// 对话框消息 /// 对话框标题 - /// 对话框图标 - /// 点击确定按钮执行的客户端脚本 + /// 点击确定按钮执行的客户端脚本 /// 点击取消按钮执行的客户端脚本 /// 客户端脚本 - public static string GetShowReference(string message, string title, MessageBoxIcon icon, string okScriptstring, string cancelScript) + public static string GetShowReference(string message, string title, string okScript, string cancelScript) { - return GetShowReference(message, title, icon, okScriptstring, cancelScript, Target.Self); + return GetShowReference(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 获取显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 客户端脚本 + public static string GetShowReference(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + return GetShowReference(message, title, icon, okScript, cancelScript, Target.Self); } /// @@ -131,6 +529,16 @@ namespace FineUI /// 客户端脚本 public static string GetShowReference(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript, Target target) { + Confirm confirm = new Confirm(); + confirm.Message = message; + confirm.Title = title; + confirm.MessageBoxIcon = icon; + confirm.OkScript = okScript; + confirm.CancelScript = cancelScript; + confirm.Target = target; + + return confirm.GetShowReference(); + /* if (String.IsNullOrEmpty(title)) { @@ -157,46 +565,217 @@ namespace FineUI } return String.Format("{0}.Ext.MessageBox.show({1});", targetName, ob.ToString()); */ - string scriptTitle = "''"; - if (!String.IsNullOrEmpty(title)) - { - scriptTitle = JsHelper.Enquote(title.Replace("\r\n", "\n").Replace("\n", "
")); - } - string scriptMessage = JsHelper.EnquoteWithScriptTag(message.Replace("\r\n", "\n").Replace("\n", "
")); + //string scriptTitle = "''"; + //if (!String.IsNullOrEmpty(title)) + //{ + // scriptTitle = JsHelper.Enquote(title.Replace("\r\n", "\n").Replace("\n", "
")); + //} + //string scriptMessage = JsHelper.EnquoteWithScriptTag(message.Replace("\r\n", "\n").Replace("\n", "
")); - string scriptIconName = "''"; - if (icon != MessageBoxIcon.Warning) - { - scriptIconName = String.Format("'{0}'", MessageBoxIconHelper.GetShortName(icon)); - } + //string scriptIconName = "''"; + //if (icon != MessageBoxIcon.Warning) + //{ + // scriptIconName = String.Format("'{0}'", MessageBoxIconHelper.GetShortName(icon)); + //} - string scriptTargetName = "''"; - if (target != Target.Self) - { - scriptTargetName = String.Format("'{0}'", TargetHelper.GetName(target)); - } - string scriptCancel = JsHelper.Enquote(cancelScript); - string scriptOK = JsHelper.Enquote(okScript); + //string scriptTargetName = "''"; + //if (target != Target.Self) + //{ + // scriptTargetName = String.Format("'{0}'", TargetHelper.GetName(target)); + //} + //string scriptCancel = JsHelper.Enquote(cancelScript); + //string scriptOK = JsHelper.Enquote(okScript); - if (scriptIconName == "''") - { - if (scriptCancel == "''") - { - return String.Format("F.confirm({0},{1},{2},{3});", scriptTargetName, scriptTitle, scriptMessage, scriptOK); - } - else - { - return String.Format("F.confirm({0},{1},{2},{3},{4});", scriptTargetName, scriptTitle, scriptMessage, scriptOK, scriptCancel); - } - } - else - { - return String.Format("F.confirm({0},{1},{2},{3},{4},{5});", scriptTargetName, scriptTitle, scriptMessage, scriptOK, scriptCancel, scriptIconName); - } + + //JsObjectBuilder jsOB = new JsObjectBuilder(); + + //if (!String.IsNullOrEmpty(cancelScript)) + //{ + // jsOB.AddProperty("cancel", cancelScript); + //} + + //if (!String.IsNullOrEmpty(okScript)) + //{ + // jsOB.AddProperty("ok", okScript); + //} + + //if (target != Target.Self) + //{ + // jsOB.AddProperty("target", TargetHelper.GetName(target)); + //} + + //if (icon != MessageBoxIcon.Warning) + //{ + // jsOB.AddProperty("messageIcon", MessageBoxIconHelper.GetShortName(icon)); + //} + + //if (!String.IsNullOrEmpty(title)) + //{ + // jsOB.AddProperty("title", title.Replace("\r\n", "\n").Replace("\n", "
")); + //} + + //if (!String.IsNullOrEmpty(message)) + //{ + // jsOB.AddProperty("message", JsHelper.EnquoteWithScriptTag(message.Replace("\r\n", "\n").Replace("\n", "
")), true); + //} + + //return String.Format("F.confirm({0});", jsOB.ToString()); + + } #endregion + + #region static GetShowInParentReference + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 客户端脚本 + public static string GetShowInParentReference(string message) + { + return GetShowInParentReference(message, String.Empty, DefaultMessageBoxIcon); + } + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 客户端脚本 + public static string GetShowInParentReference(string message, string title) + { + return GetShowInParentReference(message, title, DefaultMessageBoxIcon); + } + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框消息图标 + /// 客户端脚本 + public static string GetShowInParentReference(string message, MessageBoxIcon icon) + { + return GetShowInParentReference(message, String.Empty, icon); + } + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 客户端脚本 + public static string GetShowInParentReference(string message, string title, MessageBoxIcon icon) + { + return GetShowInParentReference(message, title, icon, String.Empty, String.Empty); + } + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 客户端脚本 + public static string GetShowInParentReference(string message, string title, string okScript, string cancelScript) + { + return GetShowInParentReference(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 获取在父页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 客户端脚本 + public static string GetShowInParentReference(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + return GetShowReference(message, title, icon, okScript, cancelScript, Target.Parent); + } + + #endregion + + #region static GetShowInTopReference + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 客户端脚本 + public static string GetShowInTopReference(string message) + { + return GetShowInTopReference(message, String.Empty, DefaultMessageBoxIcon); + } + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 客户端脚本 + public static string GetShowInTopReference(string message, string title) + { + return GetShowInTopReference(message, title, DefaultMessageBoxIcon); + } + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框消息图标 + /// 客户端脚本 + public static string GetShowInTopReference(string message, MessageBoxIcon icon) + { + return GetShowInTopReference(message, String.Empty, icon); + } + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 客户端脚本 + public static string GetShowInTopReference(string message, string title, MessageBoxIcon icon) + { + return GetShowInTopReference(message, title, icon, String.Empty, String.Empty); + } + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 客户端脚本 + public static string GetShowInTopReference(string message, string title, string okScript, string cancelScript) + { + return GetShowInTopReference(message, title, DefaultMessageBoxIcon, okScript, cancelScript); + } + + /// + /// 获取在最上层页面中显示对话框的客户端脚本 + /// + /// 对话框消息 + /// 对话框标题 + /// 对话框消息图标 + /// 点击确定按钮执行的客户端脚本 + /// 点击取消按钮执行的客户端脚本 + /// 客户端脚本 + public static string GetShowInTopReference(string message, string title, MessageBoxIcon icon, string okScript, string cancelScript) + { + return GetShowReference(message, title, icon, okScript, cancelScript, Target.Top); + } + + #endregion } } diff --git a/FineUI/WebControls/Component.Button/Button.cs b/FineUI/WebControls/Component.Button/Button.cs index d6bb886..d235cde 100644 --- a/FineUI/WebControls/Component.Button/Button.cs +++ b/FineUI/WebControls/Component.Button/Button.cs @@ -47,7 +47,7 @@ namespace FineUI [ParseChildren(true)] [PersistChildren(false)] [ControlBuilder(typeof(NotAllowWhitespaceLiteralsBuilder))] - public class Button : Component, IPostBackEventHandler, IPostBackDataHandler + public class Button : BoxComponent, IPostBackEventHandler, IPostBackDataHandler { #region Constructor @@ -826,7 +826,7 @@ namespace FineUI { if (!String.IsNullOrEmpty(disableControlJavascriptID)) { - postBackScript += String.Format("F.disable('{0}');", disableControlJavascriptID); + postBackScript += String.Format("F.f_disable('{0}');", disableControlJavascriptID); } postBackScript += postBackEventReference; } diff --git a/FineUI/WebControls/ControlBase.PageManager/PageManager.cs b/FineUI/WebControls/ControlBase.PageManager/PageManager.cs index 086f5c1..b06aac1 100644 --- a/FineUI/WebControls/ControlBase.PageManager/PageManager.cs +++ b/FineUI/WebControls/ControlBase.PageManager/PageManager.cs @@ -361,31 +361,28 @@ namespace FineUI } - private List _ajaxGridClientIDs = new List(); - - /// - /// 本次AJAX请求过程中需要更新TemplateField的表格 - /// - internal List AjaxGridClientIDs - { - get - { - return _ajaxGridClientIDs; - } - set - { - _ajaxGridClientIDs = value; - } - } - - - internal void AddAjaxGridClientID(string clientID) - { - if (!_ajaxGridClientIDs.Contains(clientID)) - { - _ajaxGridClientIDs.Add(clientID); - } - } + //private List _ajaxGridClientIDs = new List(); + ///// + ///// 本次AJAX请求过程中需要更新TemplateField的表格 + ///// + //internal List AjaxGridClientIDs + //{ + // get + // { + // return _ajaxGridClientIDs; + // } + // set + // { + // _ajaxGridClientIDs = value; + // } + //} + //internal void AddAjaxGridClientID(string clientID) + //{ + // if (!_ajaxGridClientIDs.Contains(clientID)) + // { + // _ajaxGridClientIDs.Add(clientID); + // } + //} private List _ajaxGridReloadedClientIDs = new List(); @@ -886,6 +883,37 @@ namespace FineUI } } + /// + /// 表单行子项之间的间距 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), ConfigPropertyValue.FORMROW_ITEMSSPACE_DEFAULT_STRING)] + [Description("表单行子项之间的间距")] + public Unit FormRowItemsSpace + { + get + { + object obj = FState["FormRowItemsSpace"]; + if (obj == null) + { + if (DesignMode) + { + return (Unit)ConfigPropertyValue.FORMROW_ITEMSSPACE_DEFAULT; + } + else + { + return (Unit)GlobalConfig.GetFormRowItemsSpace(); + } + } + return (Unit)obj; + } + set + { + FState["FormRowItemsSpace"] = value; + } + } + + /// /// 表单中标签的位置 @@ -1220,7 +1248,7 @@ namespace FineUI } - string createScript = String.Format("F.pagemanager={1};", XID, job); + string createScript = String.Format("F.f_pagemanager={1};", XID, job); AddStartupScript(createScript); } @@ -1339,7 +1367,7 @@ namespace FineUI #endregion - #region GetIFramePostBackEventReference + #region GetCustomEventReference /// /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) @@ -1351,6 +1379,17 @@ namespace FineUI return GetCustomEventReference(eventArgument, false); } + /// + /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) + /// + /// 当前请求是否启用AJAX + /// 事件参数 + /// 客户端脚本 + public string GetCustomEventReference(bool enableAjax, string eventArgument) + { + return GetCustomEventReference(enableAjax, eventArgument, false); + } + /// /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) /// @@ -1359,7 +1398,54 @@ namespace FineUI /// 客户端脚本 public string GetCustomEventReference(string eventArgument, bool validateForms) { - return String.Format("F.customEvent({0}, {1});", JsHelper.Enquote(eventArgument), validateForms.ToString().ToLower()); + return GetCustomEventReference(eventArgument, validateForms, false); + } + + /// + /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) + /// + /// 当前请求是否启用AJAX + /// 事件参数 + /// 是否在回发前验证表单(在PageManager上进行表单配置) + /// 客户端脚本 + public string GetCustomEventReference(bool enableAjax, string eventArgument, bool validateForms) + { + return GetCustomEventReference(enableAjax, eventArgument, validateForms, false); + } + + /// + /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) + /// + /// 事件参数 + /// 是否在回发前验证表单(在PageManager上进行表单配置) + /// 保持eventArgument参数原样输出 + /// 客户端脚本 + public string GetCustomEventReference(string eventArgument, bool validateForms, bool persistOriginal) + { + string arg = eventArgument; + if (!persistOriginal) + { + arg = JsHelper.Enquote(arg); + } + return String.Format("F.f_customEvent({0},{1});", arg, validateForms.ToString().ToLower()); + } + + /// + /// 获取回发的客户端脚本(触发PageManager的CustomEvent事件) + /// + /// 当前请求是否启用AJAX + /// 事件参数 + /// 是否在回发前验证表单(在PageManager上进行表单配置) + /// 保持eventArgument参数原样输出 + /// 客户端脚本 + public string GetCustomEventReference(bool enableAjax, string eventArgument, bool validateForms, bool persistOriginal) + { + string arg = eventArgument; + if (!persistOriginal) + { + arg = JsHelper.Enquote(arg); + } + return String.Format("F.f_customEvent({0},{1},{2});", enableAjax.ToString().ToLower(), arg, validateForms.ToString().ToLower()); } #endregion diff --git a/FineUI/WebControls/Field.TextField.RealTextField.FileUpload/FileUpload.cs b/FineUI/WebControls/Field.TextField.RealTextField.FileUpload/FileUpload.cs index 1718446..2098e37 100644 --- a/FineUI/WebControls/Field.TextField.RealTextField.FileUpload/FileUpload.cs +++ b/FineUI/WebControls/Field.TextField.RealTextField.FileUpload/FileUpload.cs @@ -291,7 +291,7 @@ namespace FineUI base.OnFirstPreRender(); - AddStartupAbsoluteScript("F.form_upload_file=true;"); + //AddStartupAbsoluteScript("F.form_upload_file=true;"); if (!String.IsNullOrEmpty(ButtonText)) diff --git a/FineUI/WebControls/PanelBase.CollapsablePanel.Form/Form.cs b/FineUI/WebControls/PanelBase.CollapsablePanel.Form/Form.cs index 3a4604c..c7f868d 100644 --- a/FineUI/WebControls/PanelBase.CollapsablePanel.Form/Form.cs +++ b/FineUI/WebControls/PanelBase.CollapsablePanel.Form/Form.cs @@ -119,6 +119,40 @@ namespace FineUI #endregion + #region FormRowItemsSpace + + /// + /// 表单行子项之间的间距 + /// + [Category(CategoryName.LAYOUT)] + [DefaultValue(typeof(Unit), ConfigPropertyValue.FORMROW_ITEMSSPACE_DEFAULT_STRING)] + [Description("表单行子项之间的间距")] + public Unit FormRowItemsSpace + { + get + { + object obj = FState["FormRowItemsSpace"]; + if (obj == null) + { + if (DesignMode) + { + return ConfigPropertyValue.FORMROW_ITEMSSPACE_DEFAULT; + } + else + { + return PageManager.Instance.FormRowItemsSpace; + } + } + return (Unit)obj; + } + set + { + FState["FormRowItemsSpace"] = value; + } + } + + #endregion + #region Rows private FormRowCollection _rows; @@ -180,404 +214,411 @@ namespace FineUI #region ResolveRows - // 包含行的列脚本 - string rowScriptStr = String.Empty; - // 行的集合 - string rowItemScriptStr = String.Empty; + //// 包含行的列脚本 + //string rowScriptStr = String.Empty; + //// 行的集合 + //string rowItemScriptStr = String.Empty; - // 如果存在Rows集合 - if (Rows.Count > 0) - { - // rowScriptStr - // rowItemScriptStr: [X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row0,X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row2] - ResolveRows(ref rowScriptStr, ref rowItemScriptStr); + //// 如果存在Rows集合 + //if (Rows.Count > 0) + //{ + // // rowScriptStr + // // rowItemScriptStr: [X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row0,X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row2] + // ResolveRows(ref rowScriptStr, ref rowItemScriptStr); - // 添加Items - OB.RemoveProperty("items"); - OB.AddProperty("items", rowItemScriptStr, true); - } + // // 添加Items + // OB.RemoveProperty("items"); + // OB.AddProperty("items", rowItemScriptStr, true); + //} - //rowScriptStr += "\r\n"; + ////rowScriptStr += "\r\n"; #endregion - //OptionBuilder defaultsOB = new OptionBuilder(); - //defaultsOB.Listeners.AddProperty("change", JsHelper.GetFunction("F.util.setPageStateChanged();"), true); - //OB.AddProperty("defaults", defaultsOB); + #region Rows + + if (Rows.Count > 0) + { + JsArrayBuilder ab = new JsArrayBuilder(); + foreach (FormRow row in Rows) + { + if (row.Visible) + { + ab.AddProperty(String.Format("{0}", row.XID), true); + } + } + + OB.AddProperty("items", ab.ToString(), true); + } + + #endregion + - //OB.Listeners.AddProperty("change", JsHelper.GetFunction("F.util.setPageStateChanged();"), true); - //OB.Listeners.AddProperty("dirtychange", JsHelper.GetFunction("F.util.setPageStateChanged(dirty);", "form", "dirty"), true); AddListener("dirtychange", "F.util.setPageStateChanged(dirty);", "form", "dirty"); - //if (!String.IsNullOrEmpty(SubmitButton)) - //{ - // Control control = ControlUtil.FindControl(SubmitButton); - // if (control != null && control is ControlBase) - // { - // OB.Listeners.AddProperty("render", JsHelper.GetFunction("F.util.formEnterKey(form,'" + control.ClientID + "');", "form"), true); - // } - //} + string formPanelScript = String.Format("var {0}=Ext.create('Ext.form.Panel',{1});", XID, OB.ToString()); - //AddStartupScript(this, rowScriptStr + formPanelScript); - - string jsContent = rowScriptStr + formPanelScript; - AddStartupScript(jsContent); - } - - /// - /// 处理列 - /// - /// - private void ResolveRows(ref string rowScriptsStr, ref string rowIdsStr) - { - JsArrayBuilder rowIdsBuilder = new JsArrayBuilder(); - - // 上一行的列数 - int lastRowColumnCount = 1; - // 上一行的列数 - string lastRowColumnWidths = String.Empty; - // 是否已经开始多列 - bool isMultiColumnStarted = false; - // 多列的开始行的序号 - int multiColumnStartLineIndex = 0; - - for (int i = 0, rowCount = Rows.Count; i < rowCount; i++) - { - FormRow currentRow = Rows[i]; - int currentRowColumnCount = GetRowColumnCount(currentRow); - string currentRowColumnWidths = currentRow.ColumnWidths; - - if (currentRowColumnCount == 0) - { - // 如果当前行为空,则跳过此行 - continue; - } - else if (currentRowColumnCount == 1) - { - if (isMultiColumnStarted) - { - // 如果上一行是多列行,则添加本行之上的所有行 - rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, i - 1, lastRowColumnCount); - //rowScriptsStr += "\r\n"; - - // 开始重置记录本行为多列的开始 - isMultiColumnStarted = false; - multiColumnStartLineIndex = 0; - } - - // 如果当前行的列数为1,则直接添加Field元素 - //AddItemScript(ab, currentRow.Fields[0].ClientID); - ControlBase component = GetRowColumnControl(currentRow, 0); - if (component != null) - { - rowIdsBuilder.AddProperty(String.Format("{0}", component.XID), true); - } - } - else - { - // 如果本行是多列 - if (!isMultiColumnStarted) - { - // 如果上一行还是单列的话,则开始多列 - isMultiColumnStarted = true; - multiColumnStartLineIndex = i; - } - else - { - if (lastRowColumnCount == currentRowColumnCount && lastRowColumnWidths == currentRowColumnWidths) - { - // 如果上一行的列数和本行的列数相同(并且上一行每列的宽度和本行的每列宽度也一样),则继续下一行 - } - else - { - // 如果上一行的列数和本行的列数不相同,则添加本行之上的所有行 - rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, i - 1, lastRowColumnCount); - //rowScriptsStr += "\r\n"; - - // 开始重新记录本行为多列的开始 - isMultiColumnStarted = true; - multiColumnStartLineIndex = i; - } - } - } - - - lastRowColumnCount = currentRowColumnCount; - lastRowColumnWidths = currentRowColumnWidths; - } - - - // 还要判断一下(如果最后一行是两列的情况) - if (isMultiColumnStarted) - { - rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, Rows.Count - 1, lastRowColumnCount); - //rowScriptsStr += "\r\n"; - } - - rowIdsStr = rowIdsBuilder.ToString(); - } - - /// - /// 添加列 - /// - /// 行ID集合 - /// 开始行的索引(包含) - /// 结束行的索引(包含) - /// 行的列数 - private string AddColumnScript(JsArrayBuilder rowIdsBuilder, int startLineIndex, int endLineIndex, int columnCount) - { - // 注意,注册脚本的控件应该是最后一个 Row - // 假如有从上之下这些控件: Row1(Field1,Field2), Row2(Field3,Field4),Row3(Field5) - // 则渲染时,JS脚本的执行顺序为:Field1,Field2,Row1,Field3,Field4,Row2,Field5,Row3 - // 所以,如果column Panel的脚本注册为控件 Row3,则能保证所有的子控件已经初始化 - // 需要注意的是:在此设置脚本内容到 Row3 控件 - // 现在已经不是这样的了!!!,Row不在是一个控件 - - #region examples - - - // { - // layout: 'column', - // border:false, - // items:[{ - // columnWidth: .5, - // layout: 'form', - // border:false, - // items:[{ - // xtype:'combo', - // store: nextStepStore, - // displayField:'text', - // valueField:'value', - // typeAhead: true, - // mode: 'local', - // triggerAction: 'all', - // value:'1', - // emptyText:'请选择下一步', - // selectOnFocus:true, - // allowBlank:false, - // fieldLabel: '下一步', - // labelSeparator:' *', - // name: 'nextStep', - // anchor:'95%' - // }] - // },{ - // columnWidth: .5, - // layout: 'form', - // border:false, - // items:[{ - // xtype:'combo', - // store: executePersonStore, - // displayField:'text', - // valueField:'value', - // typeAhead: true, - // mode: 'local', - // triggerAction: 'all', - // value:'1', - // emptyText:'请选择执行人', - // selectOnFocus:true, - // allowBlank:false, - // fieldLabel: '执行人', - // labelSeparator:' *', - // name: 'executePerson', - // anchor:'95%' - // }] - // }] - // } - - - #endregion - - - // 最后一行 - FormRow endLineRow = Rows[endLineIndex]; - string rowId = String.Format("{0}_row{1}", XID, endLineIndex); - - - - string defaultColumnWidthStr = (1.0 / columnCount).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); - string[] columnWidths = ResolveColumnWidths(columnCount, Rows[startLineIndex].ColumnWidths, defaultColumnWidthStr); - - // row_column - JsArrayBuilder rowColumnScriptsBuilder = new JsArrayBuilder(); - for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) - { - #region 计算每一列的值 - - // 循环每一列 - JsArrayBuilder fieldsAB = new JsArrayBuilder(); - for (int rowIndex = startLineIndex; rowIndex <= endLineIndex; rowIndex++) - { - FormRow currentRow = Rows[rowIndex]; - - if (columnIndex <= GetRowColumnCount(currentRow) - 1) - { - ControlBase component = GetRowColumnControl(currentRow, columnIndex); - if (component != null) - { - fieldsAB.AddProperty(String.Format("{0}", component.XID), true); - } - } - } - - // 当前列的创建JS - JsObjectBuilder columnOB = new JsObjectBuilder(); - string columnWidth = columnWidths[columnIndex]; - if (Convert.ToDouble(columnWidth) <= 1.0) - { - columnOB.AddProperty("columnWidth", columnWidths[columnIndex], true); - } - else - { - columnOB.AddProperty("width", columnWidths[columnIndex], true); - } - - columnOB.AddProperty("layout", "anchor"); - columnOB.AddProperty("border", false); - columnOB.AddProperty("id", rowId + "_column" + columnIndex.ToString()); - - // 如果不是最后一列,则默认距离右侧 5px - if (columnIndex != columnCount - 1) - { - columnOB.AddProperty("margin", "0 5 0 0"); - } - - // 有可能为空 - if (fieldsAB.Count > 0) - { - columnOB.AddProperty("items", fieldsAB.ToString(), true); - } - - - rowColumnScriptsBuilder.AddProperty(columnOB.ToString(), true); - - // 现在采取的是安全的ajax,不会出现下面的情况 - //// 所有Layout=form的地方必须用Ext.FormPanel,否则删除时不会把FieldLabek删除掉 - //rowColumnScriptsBuilder.AddProperty(String.Format("new Ext.FormPanel({0})", columnOB.ToString()), true); - - #endregion - } - - // 外面的JS(X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row0) - JsObjectBuilder rowBuilder = new JsObjectBuilder(); - rowBuilder.AddProperty("layout", "column"); - rowBuilder.AddProperty("border", false); - - - // 有可能为空 - if (rowColumnScriptsBuilder.Count > 0) - { - rowBuilder.AddProperty("items", rowColumnScriptsBuilder.ToString(), true); - } - - - // 把当前节点添加到结果集合中 - rowIdsBuilder.AddProperty(String.Format("{0}", rowId), true); - rowBuilder.AddProperty("id", rowId); - - // 注意要注册 最后 一个 Row的脚本 - return String.Format("var {0}=Ext.create('Ext.panel.Panel',{1});", rowId, rowBuilder.ToString()); + //string jsContent = rowScriptStr + formPanelScript; + AddStartupScript(formPanelScript); } - /// - /// 添加Items变量 - /// - /// - /// - /// - private void AddItemScript(JsArrayBuilder ab, string id) - { - ab.AddProperty(String.Format("{0}", id), true); - } + #region oldcode + ///// + ///// 处理列 + ///// + ///// + //private void ResolveRows(ref string rowScriptsStr, ref string rowIdsStr) + //{ + // JsArrayBuilder rowIdsBuilder = new JsArrayBuilder(); - /// - /// 取得当前行的列数 - /// - /// - /// - private int GetRowColumnCount(FormRow row) - { - int fieldCount = 0; + // // 上一行的列数 + // int lastRowColumnCount = 1; + // // 上一行的列数 + // string lastRowColumnWidths = String.Empty; + // // 是否已经开始多列 + // bool isMultiColumnStarted = false; + // // 多列的开始行的序号 + // int multiColumnStartLineIndex = 0; - foreach (Control c in row.Controls) - { - if (c is ControlBase) - { - fieldCount++; - } - } + // for (int i = 0, rowCount = Rows.Count; i < rowCount; i++) + // { + // FormRow currentRow = Rows[i]; + // int currentRowColumnCount = GetRowColumnCount(currentRow); + // string currentRowColumnWidths = currentRow.ColumnWidths; - #region old code - //if (row.ColumnCount == null) - //{ - // return fieldCount; - //} - //else - //{ - // if (row.ColumnCount.Value > fieldCount) - // { - // return row.ColumnCount.Value; - // } - // else - // { - // return fieldCount; - // } - //} - #endregion + // if (currentRowColumnCount == 0) + // { + // // 如果当前行为空,则跳过此行 + // continue; + // } + // else if (currentRowColumnCount == 1) + // { + // if (isMultiColumnStarted) + // { + // // 如果上一行是多列行,则添加本行之上的所有行 + // rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, i - 1, lastRowColumnCount); + // //rowScriptsStr += "\r\n"; - return fieldCount; - } + // // 开始重置记录本行为多列的开始 + // isMultiColumnStarted = false; + // multiColumnStartLineIndex = 0; + // } - /// - /// 取得当前行 columnIndex 列的控件 - /// - /// - /// - /// - private ControlBase GetRowColumnControl(FormRow row, int columnIndex) - { - int index = 0; - foreach (Control c in row.Controls) - { - if (c is ControlBase) - { - if (columnIndex == index) - { - return c as ControlBase; - } + // // 如果当前行的列数为1,则直接添加Field元素 + // //AddItemScript(ab, currentRow.Fields[0].ClientID); + // ControlBase component = GetRowColumnControl(currentRow, 0); + // if (component != null) + // { + // rowIdsBuilder.AddProperty(String.Format("{0}", component.XID), true); + // } + // } + // else + // { + // // 如果本行是多列 + // if (!isMultiColumnStarted) + // { + // // 如果上一行还是单列的话,则开始多列 + // isMultiColumnStarted = true; + // multiColumnStartLineIndex = i; + // } + // else + // { + // if (lastRowColumnCount == currentRowColumnCount && lastRowColumnWidths == currentRowColumnWidths) + // { + // // 如果上一行的列数和本行的列数相同(并且上一行每列的宽度和本行的每列宽度也一样),则继续下一行 + // } + // else + // { + // // 如果上一行的列数和本行的列数不相同,则添加本行之上的所有行 + // rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, i - 1, lastRowColumnCount); + // //rowScriptsStr += "\r\n"; - index++; - } - } + // // 开始重新记录本行为多列的开始 + // isMultiColumnStarted = true; + // multiColumnStartLineIndex = i; + // } + // } + // } - return null; - } - private string[] ResolveColumnWidths(int columnCount, string columnWidths, string defaultColumnWidthStr) - { - string[] results = null; - if (!String.IsNullOrEmpty(columnWidths)) - { - string[] columnWidthArray = columnWidths.Split(' '); - if (columnWidthArray.Length == columnCount) - { - results = columnWidthArray; - } - } + // lastRowColumnCount = currentRowColumnCount; + // lastRowColumnWidths = currentRowColumnWidths; + // } - if (results == null) - { - results = new string[columnCount]; - for (int i = 0; i < columnCount; i++) - { - results[i] = defaultColumnWidthStr; - } - } - return results; - } + // // 还要判断一下(如果最后一行是两列的情况) + // if (isMultiColumnStarted) + // { + // rowScriptsStr += AddColumnScript(rowIdsBuilder, multiColumnStartLineIndex, Rows.Count - 1, lastRowColumnCount); + // //rowScriptsStr += "\r\n"; + // } + + // rowIdsStr = rowIdsBuilder.ToString(); + //} + + ///// + ///// 添加列 + ///// + ///// 行ID集合 + ///// 开始行的索引(包含) + ///// 结束行的索引(包含) + ///// 行的列数 + //private string AddColumnScript(JsArrayBuilder rowIdsBuilder, int startLineIndex, int endLineIndex, int columnCount) + //{ + // // 注意,注册脚本的控件应该是最后一个 Row + // // 假如有从上之下这些控件: Row1(Field1,Field2), Row2(Field3,Field4),Row3(Field5) + // // 则渲染时,JS脚本的执行顺序为:Field1,Field2,Row1,Field3,Field4,Row2,Field5,Row3 + // // 所以,如果column Panel的脚本注册为控件 Row3,则能保证所有的子控件已经初始化 + // // 需要注意的是:在此设置脚本内容到 Row3 控件 + // // 现在已经不是这样的了!!!,Row不在是一个控件 + + // #region examples + + + // // { + // // layout: 'column', + // // border:false, + // // items:[{ + // // columnWidth: .5, + // // layout: 'form', + // // border:false, + // // items:[{ + // // xtype:'combo', + // // store: nextStepStore, + // // displayField:'text', + // // valueField:'value', + // // typeAhead: true, + // // mode: 'local', + // // triggerAction: 'all', + // // value:'1', + // // emptyText:'请选择下一步', + // // selectOnFocus:true, + // // allowBlank:false, + // // fieldLabel: '下一步', + // // labelSeparator:' *', + // // name: 'nextStep', + // // anchor:'95%' + // // }] + // // },{ + // // columnWidth: .5, + // // layout: 'form', + // // border:false, + // // items:[{ + // // xtype:'combo', + // // store: executePersonStore, + // // displayField:'text', + // // valueField:'value', + // // typeAhead: true, + // // mode: 'local', + // // triggerAction: 'all', + // // value:'1', + // // emptyText:'请选择执行人', + // // selectOnFocus:true, + // // allowBlank:false, + // // fieldLabel: '执行人', + // // labelSeparator:' *', + // // name: 'executePerson', + // // anchor:'95%' + // // }] + // // }] + // // } + + + // #endregion + + + // // 最后一行 + // FormRow endLineRow = Rows[endLineIndex]; + // string rowId = String.Format("{0}_row{1}", XID, endLineIndex); + + + + // string defaultColumnWidthStr = (1.0 / columnCount).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + // string[] columnWidths = ResolveColumnWidths(columnCount, Rows[startLineIndex].ColumnWidths, defaultColumnWidthStr); + + // // row_column + // JsArrayBuilder rowColumnScriptsBuilder = new JsArrayBuilder(); + // for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) + // { + // #region 计算每一列的值 + + // // 循环每一列 + // JsArrayBuilder fieldsAB = new JsArrayBuilder(); + // for (int rowIndex = startLineIndex; rowIndex <= endLineIndex; rowIndex++) + // { + // FormRow currentRow = Rows[rowIndex]; + + // if (columnIndex <= GetRowColumnCount(currentRow) - 1) + // { + // ControlBase component = GetRowColumnControl(currentRow, columnIndex); + // if (component != null) + // { + // fieldsAB.AddProperty(String.Format("{0}", component.XID), true); + // } + // } + // } + + // // 当前列的创建JS + // JsObjectBuilder columnOB = new JsObjectBuilder(); + // string columnWidth = columnWidths[columnIndex]; + // if (Convert.ToDouble(columnWidth) <= 1.0) + // { + // columnOB.AddProperty("columnWidth", columnWidths[columnIndex], true); + // } + // else + // { + // columnOB.AddProperty("width", columnWidths[columnIndex], true); + // } + + // columnOB.AddProperty("layout", "anchor"); + // columnOB.AddProperty("border", false); + // columnOB.AddProperty("id", rowId + "_column" + columnIndex.ToString()); + + // // 如果不是最后一列,则默认距离右侧 5px + // if (columnIndex != columnCount - 1) + // { + // columnOB.AddProperty("margin", "0 5 0 0"); + // } + + // // 有可能为空 + // if (fieldsAB.Count > 0) + // { + // columnOB.AddProperty("items", fieldsAB.ToString(), true); + // } + + + // rowColumnScriptsBuilder.AddProperty(columnOB.ToString(), true); + + // // 现在采取的是安全的ajax,不会出现下面的情况 + // //// 所有Layout=form的地方必须用Ext.FormPanel,否则删除时不会把FieldLabek删除掉 + // //rowColumnScriptsBuilder.AddProperty(String.Format("new Ext.FormPanel({0})", columnOB.ToString()), true); + + // #endregion + // } + + // // 外面的JS(X.__Panel1_UpdatePanelConnector1_Panel7_Form5_row0) + // JsObjectBuilder rowBuilder = new JsObjectBuilder(); + // rowBuilder.AddProperty("layout", "column"); + // rowBuilder.AddProperty("border", false); + + + + // // 有可能为空 + // if (rowColumnScriptsBuilder.Count > 0) + // { + // rowBuilder.AddProperty("items", rowColumnScriptsBuilder.ToString(), true); + // } + + + // // 把当前节点添加到结果集合中 + // rowIdsBuilder.AddProperty(String.Format("{0}", rowId), true); + // rowBuilder.AddProperty("id", rowId); + + // // 注意要注册 最后 一个 Row的脚本 + // return String.Format("var {0}=Ext.create('Ext.panel.Panel',{1});", rowId, rowBuilder.ToString()); + //} + + ///// + ///// 添加Items变量 + ///// + ///// + ///// + ///// + //private void AddItemScript(JsArrayBuilder ab, string id) + //{ + // ab.AddProperty(String.Format("{0}", id), true); + //} + + ///// + ///// 取得当前行的列数 + ///// + ///// + ///// + //private int GetRowColumnCount(FormRow row) + //{ + // int fieldCount = 0; + + // foreach (Control c in row.Controls) + // { + // if (c is ControlBase) + // { + // fieldCount++; + // } + // } + + // #region old code + // //if (row.ColumnCount == null) + // //{ + // // return fieldCount; + // //} + // //else + // //{ + // // if (row.ColumnCount.Value > fieldCount) + // // { + // // return row.ColumnCount.Value; + // // } + // // else + // // { + // // return fieldCount; + // // } + // //} + // #endregion + + // return fieldCount; + //} + + ///// + ///// 取得当前行 columnIndex 列的控件 + ///// + ///// + ///// + ///// + //private ControlBase GetRowColumnControl(FormRow row, int columnIndex) + //{ + // int index = 0; + // foreach (Control c in row.Controls) + // { + // if (c is ControlBase) + // { + // if (columnIndex == index) + // { + // return c as ControlBase; + // } + + // index++; + // } + // } + + // return null; + //} + + //private string[] ResolveColumnWidths(int columnCount, string columnWidths, string defaultColumnWidthStr) + //{ + // string[] results = null; + // if (!String.IsNullOrEmpty(columnWidths)) + // { + // string[] columnWidthArray = columnWidths.Split(' '); + // if (columnWidthArray.Length == columnCount) + // { + // results = columnWidthArray; + // } + // } + + // if (results == null) + // { + // results = new string[columnCount]; + // for (int i = 0; i < columnCount; i++) + // { + // results[i] = defaultColumnWidthStr; + // } + // } + + // return results; + //} + #endregion #endregion diff --git a/FineUI/WebControls/PanelBase.CollapsablePanel.Form/FormRow/FormRow.cs b/FineUI/WebControls/PanelBase.CollapsablePanel.Form/FormRow/FormRow.cs index cfa018b..3cbb7c5 100644 --- a/FineUI/WebControls/PanelBase.CollapsablePanel.Form/FormRow/FormRow.cs +++ b/FineUI/WebControls/PanelBase.CollapsablePanel.Form/FormRow/FormRow.cs @@ -50,18 +50,55 @@ namespace FineUI [ParseChildren(true)] [PersistChildren(false)] [ControlBuilder(typeof(NotAllowWhitespaceLiteralsBuilder))] - public class FormRow : ControlBase + public class FormRow : Container { + #region Unsupported Properties + + /// + /// 不支持此属性 + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public override Layout Layout + { + get + { + return Layout.Column; + } + } + + + #endregion #region Properties + ///// + ///// 各列的宽度,空格分割 + ///// + //[Category(CategoryName.OPTIONS)] + //[NotifyParentProperty(true)] + //[DefaultValue("")] + //[Description("各列的宽度,空格分割")] + //public string ColumnWidths + //{ + // get + // { + // object obj = FState["ColumnWidths"]; + // return obj == null ? "" : (string)obj; + // } + // set + // { + // FState["ColumnWidths"] = ResolveColumnWidths(value); + // } + //} + /// - /// 各列的宽度,空格分割 + /// 以空格分开的各列宽度(可以是像素数或者百分比,比如200px 50% 50%) /// [Category(CategoryName.OPTIONS)] [NotifyParentProperty(true)] [DefaultValue("")] - [Description("各列的宽度,空格分割")] + [Description("以空格分开的各列宽度(可以是像素数或者百分比,比如200px 50% 50%)")] public string ColumnWidths { get @@ -71,7 +108,7 @@ namespace FineUI } set { - FState["ColumnWidths"] = ResolveColumnWidths(value); + FState["ColumnWidths"] = value; } } @@ -128,59 +165,246 @@ namespace FineUI base.OnFirstPreRender(); + OB.AddProperty("border", false); + OB.AddProperty("header", false); + Form parentForm = Parent as Form; + if (parentForm == null) + { + return; + } + + int formrowItemsSpace = Convert.ToInt32(parentForm.FormRowItemsSpace.Value); + + + if (Items.Count > 0) + { + #region oldcode + /* + * 增加中间的分割面板,会对显示隐藏表单字段造成影响 + int currentItemCount = 0; + JsArrayBuilder ab = new JsArrayBuilder(); + foreach (ControlBase item in Items) + { + if (item.Visible) + { + if (currentItemCount > 0) + { + OptionBuilder separatorOB = new OptionBuilder(); + separatorOB.AddProperty("type", "panelbase"); + separatorOB.AddProperty("width", 8); + ab.AddProperty(String.Format("{0}", separatorOB), true); + } + ab.AddProperty(String.Format("{0}", item.XID), true); + currentItemCount++; + } + } + OB.AddProperty("items", ab.ToString(), true); + */ + + #endregion + + // 为子项添加布局属性 + int columnCount = Items.Count; + string defaultColumnWidthStr = (1.0 / columnCount).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + List columnWidths = GetTrimedColumnWidths(); + + // 用户自定义ColumnWidths是否和Items的个数匹配 + bool isColumnWidthsMatch = false; + if (columnWidths.Count == columnCount) + { + isColumnWidthsMatch = true; + } + + Dictionary buttonOptions = new Dictionary(); + for (int i = 0; i < columnCount; i++) + { + var comp = Items[i] as Component; + + // 如果FormRow的子项是 Button,则用一个面板将其包裹起来,否则按钮的宽度会很长 + bool isbutton = false; + JsObjectBuilder buttonPanelOB = new JsObjectBuilder(); + if (comp is Button) + { + isbutton = true; + + buttonPanelOB.AddProperty("xtype", "panel"); + buttonPanelOB.AddProperty("header", false); + buttonPanelOB.AddProperty("border", false); + + buttonPanelOB.AddProperty("items", String.Format("[{0}]", comp.XID), true); + } + + #region Component + if (comp != null) + { + // 不是最后一列的话,加上空白间隔 + if (columnCount > 1 && i != columnCount - 1) + { + if (isbutton) + { + //buttonOB.AddProperty("marginRight", formrowItemsSpace); + buttonPanelOB.AddProperty("style", String.Format("margin-right:{0}px;", formrowItemsSpace)); + } + else + { + //// 如果尚未设置 MarginRight + //if (comp.MarginRight == Unit.Empty) + //{ + // comp.MarginRight = Unit.Pixel(formrowItemsSpace); + //} + //if (String.IsNullOrEmpty(comp.Margin)) + //{ + // comp.Margin = String.Format("0 {0} 0 0", formrowItemsSpace); + //} + comp.CssStyle += String.Format("margin-right:{0}px;", formrowItemsSpace); + } + } + } + #endregion + + #region BoxComponent + var boxcomp = comp as BoxComponent; + if (boxcomp != null) + { + if (isColumnWidthsMatch) + { + string columnWidth = StringUtil.ConvertPercentageToDecimalString(columnWidths[i]); + if (Convert.ToDouble(columnWidth) <= 1.0) + { + if (isbutton) + { + buttonPanelOB.AddProperty("columnWidth", columnWidth, true); + } + else + { + boxcomp.ColumnWidth = columnWidth; + } + } + else + { + Unit unitColumnWidth = Unit.Parse(columnWidth); + + if (isbutton) + { + buttonPanelOB.AddProperty("width", unitColumnWidth.Value); + } + else + { + boxcomp.Width = unitColumnWidth; + } + } + } + else + { + if (isbutton) + { + buttonPanelOB.AddProperty("columnWidth", defaultColumnWidthStr, true); + } + else + { + boxcomp.ColumnWidth = defaultColumnWidthStr; + } + } + } + #endregion + + if (isbutton) + { + buttonOptions.Add(comp.XID, buttonPanelOB); + } + } + + + JsArrayBuilder ab = new JsArrayBuilder(); + foreach (ControlBase item in Items) + { + if (item.Visible) + { + string itemXID = item.XID; + if (buttonOptions.ContainsKey(itemXID)) + { + itemXID = buttonOptions[itemXID].ToString(); + } + + ab.AddProperty(itemXID, true); + } + } + OB.AddProperty("items", ab.ToString(), true); + } + + // 自定义样式 + OB.AddProperty("cls", "f-formrow"); + + string jsContent = String.Format("var {0}=Ext.create('Ext.panel.Panel',{1});", XID, OB.ToString()); + AddStartupScript(jsContent); - //// 目的:子控件的JS代码在父控件的前面 - //AddStartupScript(this, String.Empty); - AddStartupScript(String.Empty); + ////// 目的:子控件的JS代码在父控件的前面 + ////AddStartupScript(this, String.Empty); + //AddStartupScript(String.Empty); + } + + + private List GetTrimedColumnWidths() + { + List widths = new List(); + foreach (string width in ColumnWidths.Split(' ')) + { + string trimedWith = width.Trim(); + if (!String.IsNullOrEmpty(trimedWith)) + { + widths.Add(trimedWith); + } + } + return widths; } #endregion #region private ResolveColumnWidths - /// - /// 格式化widths - /// - /// - /// - private string ResolveColumnWidths(string widths) - { - List widthList = new List(); + ///// + ///// 格式化widths + ///// + ///// + ///// + //private string ResolveColumnWidths(string widths) + //{ + // List widthList = new List(); - string[] widthArray = widths.Split(' '); - foreach (string s in widthArray) - { - string tmp = s.Trim(); - if (!String.IsNullOrEmpty(tmp)) - { - widthList.Add(ResolveColumnWidth(tmp)); - } - } + // string[] widthArray = widths.Split(' '); + // foreach (string s in widthArray) + // { + // string tmp = s.Trim(); + // if (!String.IsNullOrEmpty(tmp)) + // { + // widthList.Add(ResolveColumnWidth(tmp)); + // } + // } - StringBuilder sb = new StringBuilder(); - foreach (string s in widthList) - { - sb.AppendFormat("{0} ", s); - } + // StringBuilder sb = new StringBuilder(); + // foreach (string s in widthList) + // { + // sb.AppendFormat("{0} ", s); + // } - return sb.ToString().TrimEnd(); - } + // return sb.ToString().TrimEnd(); + //} - private string ResolveColumnWidth(string width) - { - string result = width; - if (result.EndsWith("%")) - { - result = (Convert.ToInt32(width.TrimEnd('%')) * 0.01).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); - } - else if (result.ToLower().EndsWith("px")) - { - result = result.ToLower().Substring(0, result.Length - 2); - } + //private string ResolveColumnWidth(string width) + //{ + // string result = width; + // if (result.EndsWith("%")) + // { + // result = (Convert.ToInt32(width.TrimEnd('%')) * 0.01).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + // } + // else if (result.ToLower().EndsWith("px")) + // { + // result = result.ToLower().Substring(0, result.Length - 2); + // } - return result; - } + // return result; + //} #endregion diff --git a/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/Tree.cs b/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/Tree.cs index 8b5ee45..dc3ccaf 100644 --- a/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/Tree.cs +++ b/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/Tree.cs @@ -316,6 +316,26 @@ namespace FineUI } } + /// + /// 启用树中的文字选择 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(false)] + [Description("启用树中的文字选择")] + public bool EnableTextSelection + { + get + { + object obj = FState["EnableTextSelection"]; + return obj == null ? false : (bool)obj; + } + set + { + FState["EnableTextSelection"] = value; + } + } + + #endregion #region DataSource @@ -598,10 +618,10 @@ namespace FineUI treeNode.EnableExpandEvent = ja2[19].Value() == 1 ? true : false; treeNode.EnableCollapseEvent = ja2[20].Value() == 1 ? true : false; - + treeNode.CssClass = ja2[21].Value(); - JArray childNodes = ja2[21].Value(); + JArray childNodes = ja2[22].Value(); if (childNodes != null && childNodes.Count > 0) { FromNodesJArray(childNodes, treeNode.Nodes); @@ -639,7 +659,9 @@ namespace FineUI // 19 - EnableExpandEvent // 20 - EnableCollapseEvent - // 21 - Nodes + // 21 - CssClass + + // 22 - Nodes ja2.Add(node.Text); ja2.Add(node.Leaf ? 1 : 0); ja2.Add(node.NodeID); @@ -668,7 +690,8 @@ namespace FineUI ja2.Add(node.EnableExpandEvent ? 1 : 0); ja2.Add(node.EnableCollapseEvent ? 1 : 0); - + + ja2.Add(node.CssClass); if (node.Nodes != null && node.Nodes.Count > 0) { @@ -1034,6 +1057,22 @@ namespace FineUI //ResourceManager.Instance.AddJavaScriptComponent("tree"); + #region viewConfig + + JsObjectBuilder viewBuilder = new JsObjectBuilder(); + + if (EnableTextSelection) + { + viewBuilder.AddProperty("enableTextSelection", true); + } + + if (viewBuilder.Count > 0) + { + OB.AddProperty("viewConfig", viewBuilder); + } + + #endregion + #region options OB.AddProperty("useArrows", EnableArrows); diff --git a/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/TreeNode/TreeNode.cs b/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/TreeNode/TreeNode.cs index 1f41e77..7d61c1c 100644 --- a/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/TreeNode/TreeNode.cs +++ b/FineUI/WebControls/PanelBase.CollapsablePanel.Tree/TreeNode/TreeNode.cs @@ -309,6 +309,27 @@ namespace FineUI #region Properties + private string _cssClass = String.Empty; + /// + /// ڵʽ + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue("")] + [Description("ڵʽ")] + public string CssClass + { + get + { + return _cssClass; + } + set + { + _cssClass = value; + } + } + + + private string _text = String.Empty; /// /// ı diff --git a/FineUI/WebControls/PanelBase.CollapsablePanel.Window/Window.cs b/FineUI/WebControls/PanelBase.CollapsablePanel.Window/Window.cs index d6b6ece..a4a35d0 100644 --- a/FineUI/WebControls/PanelBase.CollapsablePanel.Window/Window.cs +++ b/FineUI/WebControls/PanelBase.CollapsablePanel.Window/Window.cs @@ -430,7 +430,7 @@ namespace FineUI [Category(CategoryName.OPTIONS)] [DefaultValue(typeof(Unit), "100")] [Description("最小高度")] - public Unit MinHeight + public new Unit MinHeight { get { @@ -450,7 +450,7 @@ namespace FineUI [Category(CategoryName.OPTIONS)] [DefaultValue(typeof(Unit), "200")] [Description("最小宽度")] - public Unit MinWidth + public new Unit MinWidth { get { @@ -1493,7 +1493,7 @@ namespace FineUI /// 客户端脚本 public string GetIFrameCustomEventReference(string eventArgument, bool validateForms) { - return String.Format("F.wnd.getIFrameWindowObject({0}).F.customEvent({1}, {2});", ScriptID, JsHelper.Enquote(eventArgument), validateForms.ToString().ToLower()); + return String.Format("F.wnd.getIFrameWindowObject({0}).F.f_customEvent({1}, {2});", ScriptID, JsHelper.Enquote(eventArgument), validateForms.ToString().ToLower()); } #endregion diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridAfterEditEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridAfterEditEventArgs.cs index fc6261e..c02405b 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridAfterEditEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridAfterEditEventArgs.cs @@ -45,7 +45,17 @@ namespace FineUI public int RowIndex { get { return _rowIndex; } - set { _rowIndex = value; } + } + + + private int _columnIndex; + + /// + /// + /// + public int ColumnIndex + { + get { return _columnIndex; } } private string _columnID; @@ -56,18 +66,33 @@ namespace FineUI public string ColumnID { get { return _columnID; } - set { _columnID = value; } + } + + private string _rowID; + + /// + /// ID + /// + public string RowID + { + get { return _rowID; } } /// /// 캯 /// /// - /// /// ID - public GridAfterEditEventArgs(int rowIndex, string columnID) + /// ID + /// + /// ID + public GridAfterEditEventArgs(int rowIndex, string rowID, int columnIndex, string columnID) { _rowIndex = rowIndex; + _rowID = rowID; + + _columnIndex = columnIndex; _columnID = columnID; + } } diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridCommandEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridCommandEventArgs.cs index 6fac0a6..392b4a8 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridCommandEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridCommandEventArgs.cs @@ -45,9 +45,20 @@ namespace FineUI public int RowIndex { get { return _rowIndex; } - set { _rowIndex = value; } } + private string _rowID; + + /// + /// ID + /// + public string RowID + { + get { return _rowID; } + } + + + private int _columnIndex; /// @@ -56,10 +67,22 @@ namespace FineUI public int ColumnIndex { get { return _columnIndex; } - set { _columnIndex = value; } } + + private string _columnID; + + /// + /// ID + /// + public string ColumnID + { + get { return _columnID; } + } + + + private string _commandName; /// @@ -68,7 +91,6 @@ namespace FineUI public string CommandName { get { return _commandName; } - set { _commandName = value; } } @@ -80,7 +102,6 @@ namespace FineUI public string CommandArgument { get { return _commandArgument; } - set { _commandArgument = value; } } @@ -88,13 +109,17 @@ namespace FineUI /// 캯 /// /// + /// ID /// + /// ID /// /// - public GridCommandEventArgs(int rowIndex, int columnIndex, string commandName, string commandArgument) + public GridCommandEventArgs(int rowIndex, string rowID, int columnIndex, string columnID, string commandName, string commandArgument) { _rowIndex = rowIndex; + _rowID = rowID; _columnIndex = columnIndex; + _columnID = columnID; _commandName = commandName; _commandArgument = commandArgument; } diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridPreRowEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridPreRowEventArgs.cs index ab95a2d..d8851ec 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridPreRowEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridPreRowEventArgs.cs @@ -56,7 +56,6 @@ namespace FineUI public object DataItem { get { return _dataItem; } - set { _dataItem = value; } } @@ -68,9 +67,9 @@ namespace FineUI public int RowIndex { get { return _rowIndex; } - set { _rowIndex = value; } } + /// /// 캯 /// diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowClickEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowClickEventArgs.cs index 01d16a0..bb934db 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowClickEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowClickEventArgs.cs @@ -45,16 +45,28 @@ namespace FineUI public int RowIndex { get { return _rowIndex; } - set { _rowIndex = value; } } + private string _rowID; + + /// + /// ID + /// + public string RowID + { + get { return _rowID; } + } + + /// /// 캯 /// /// - public GridRowClickEventArgs(int rowIndex) + /// ID + public GridRowClickEventArgs(int rowIndex, string rowID) { _rowIndex = rowIndex; + _rowID = rowID; } } diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowEventArgs.cs index 4cf6418..8d64b99 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowEventArgs.cs @@ -37,53 +37,58 @@ namespace FineUI public class GridRowEventArgs : EventArgs { - private object[] _values; + private GridRow _row; + + /// + /// ǰ + /// + public GridRow Row + { + get { return _row; } + } /// /// иеֵȾHTMLƬΣ /// public object[] Values { - get { return _values; } - set { _values = value; } + get { return _row.Values; } } - private object _dataItem; - /// /// Դ /// public object DataItem { - get { return _dataItem; } - set { _dataItem = value; } + get { return _row.DataItem; } } - private int _rowIndex; - /// /// /// public int RowIndex { - get { return _rowIndex; } - set { _rowIndex = value; } + get { return _row.RowIndex; } + } + + /// + /// ID + /// + public string RowID + { + get { return _row.RowID; } } /// /// 캯 /// - /// Դ - /// - /// иеֵ - public GridRowEventArgs(object dataItem, int rowIndex, object[] values) + /// + public GridRowEventArgs(GridRow row) { - _dataItem = dataItem; - _values = values; - _rowIndex = rowIndex; + _row = row; } } diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowSelectEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowSelectEventArgs.cs index 4f244b5..d9557cf 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowSelectEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridRowSelectEventArgs.cs @@ -45,16 +45,29 @@ namespace FineUI public int RowIndex { get { return _rowIndex; } - set { _rowIndex = value; } + //set { _rowIndex = value; } } + private string _rowID; + + /// + /// ID + /// + public string RowID + { + get { return _rowID; } + } + + /// /// 캯 /// /// - public GridRowSelectEventArgs(int rowIndex) + /// ID + public GridRowSelectEventArgs(int rowIndex, string rowID) { _rowIndex = rowIndex; + _rowID = rowID; } } diff --git a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridSortEventArgs.cs b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridSortEventArgs.cs index 9b302ab..db818c9 100644 --- a/FineUI/WebControls/PanelBase.Grid/EventArgs/GridSortEventArgs.cs +++ b/FineUI/WebControls/PanelBase.Grid/EventArgs/GridSortEventArgs.cs @@ -41,7 +41,6 @@ namespace FineUI public string SortField { get { return _sortField; } - set { _sortField = value; } } @@ -53,7 +52,6 @@ namespace FineUI public string SortDirection { get { return _sortDirection; } - set { _sortDirection = value; } } private int _columnIndex; @@ -64,21 +62,34 @@ namespace FineUI public int ColumnIndex { get { return _columnIndex; } - set { _columnIndex = value; } } + private string _columnID; + + /// + /// 列ID + /// + public string ColumnID + { + get { return _columnID; } + } + + + /// /// 构造函数 /// /// 排序字段 /// 排序方向 /// 列索引 - public GridSortEventArgs(string sortField, string sortDirection, int columnIndex) + /// 列 + public GridSortEventArgs(string sortField, string sortDirection, int columnIndex, string columnID) { _sortField = sortField; _sortDirection = sortDirection; _columnIndex = columnIndex; + _columnID = columnID; } } diff --git a/FineUI/WebControls/PanelBase.Grid/Grid.cs b/FineUI/WebControls/PanelBase.Grid/Grid.cs index 9aa8f33..7a56d1d 100644 --- a/FineUI/WebControls/PanelBase.Grid/Grid.cs +++ b/FineUI/WebControls/PanelBase.Grid/Grid.cs @@ -76,7 +76,7 @@ namespace FineUI // 严格的说,PageIndex、SortField、SortDirection这三个属性不可能在客户端被改变,而是向服务器发出改变的请求,然后服务器处理。 // 因为这些属性的改变不会影响客户端的UI,必须服务器端发出UI改变的指令才行,所以它们算是服务器端属性。 AddServerAjaxProperties("PageIndex", "PageSize", "RecordCount", "SortField", "SortDirection", "SummaryData", "SummaryHidden"); - AddClientAjaxProperties("F_Rows", "HiddenColumns", "SelectedRowIndexArray", "SelectedCell", "ExpandAllRowExpanders"); + AddClientAjaxProperties("F_Rows", "HiddenColumns", "SelectedRowIDArray", "SelectedCell", "ExpandAllRowExpanders"); AddGzippedAjaxProperties("F_Rows"); } @@ -177,6 +177,26 @@ namespace FineUI #region AllowCellEditing + /// + /// 行数据标识字段名 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue("")] + [Description("行数据标识字段名")] + public string DataIDField + { + get + { + object obj = FState["DataIDField"]; + return obj == null ? String.Empty : (string)obj; + } + set + { + FState["DataIDField"] = value; + } + } + + /// /// 允许单元格编辑 /// @@ -648,6 +668,25 @@ namespace FineUI #region Properties + /// + /// 多选时保持当前已选中行 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(false)] + [Description("多选时保持当前已选中行")] + public bool KeepCurrentSelection + { + get + { + object obj = FState["KeepCurrentSelection"]; + return obj == null ? false : (bool)obj; + } + set + { + FState["KeepCurrentSelection"] = value; + } + } + /// /// 数据为空时显示在内容区域的文本,可以是HTML标签 /// @@ -943,6 +982,46 @@ namespace FineUI // } //} + /// + /// 是否启用列宽度调整 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(true)] + [Description("是否启用列宽度调整")] + public bool EnableColumnResize + { + get + { + object obj = FState["EnableColumnResize"]; + return obj == null ? true : (bool)obj; + } + set + { + FState["EnableColumnResize"] = value; + } + } + + + ///// + ///// 是否启用列移动 + ///// + //[Category(CategoryName.OPTIONS)] + //[DefaultValue(false)] + //[Description("是否启用列移动")] + //public bool EnableColumnMove + //{ + // get + // { + // object obj = FState["EnableColumnMove"]; + // return obj == null ? false : (bool)obj; + // } + // set + // { + // FState["EnableColumnMove"] = value; + // } + //} + + /// /// 启用表格列分隔线(默认为false) /// @@ -1123,6 +1202,25 @@ namespace FineUI } } + /// + /// 取消选中行是否自动回发 + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(false)] + [Description("取消选中行是否自动回发")] + public bool EnableRowDeselectEvent + { + get + { + object obj = FState["EnableRowDeselectEvent"]; + return obj == null ? false : (bool)obj; + } + set + { + FState["EnableRowDeselectEvent"] = value; + } + } + /// /// 点击行是否自动回发 @@ -1403,6 +1501,34 @@ namespace FineUI } } + + /// + /// [AJAX属性]选中的单元格([行ID,列ID]) + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public string[] SelectedCell + { + get + { + object obj = FState["SelectedCell"]; + return obj == null ? null : (string[])obj; + } + set + { + if (value == null || value.Length != 2) + { + FState["SelectedCell"] = null; + } + else + { + FState["SelectedCell"] = value; + } + } + } + + + /* /// /// [AJAX属性]选中行的索引(列表中的第一项) /// @@ -1427,31 +1553,6 @@ namespace FineUI } } - /// - /// [AJAX属性]选中的单元格([行索引,列索引]) - /// - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int[] SelectedCell - { - get - { - object obj = FState["SelectedCell"]; - return obj == null ? null : (int[])obj; - } - set - { - if (value == null || value.Length != 2) - { - FState["SelectedCell"] = null; - } - else - { - FState["SelectedCell"] = value; - } - } - } - /// /// [AJAX属性]选中行的索引列表 @@ -1481,6 +1582,7 @@ namespace FineUI } return list; } + * */ ///// ///// Whether this property changed. @@ -1588,6 +1690,147 @@ namespace FineUI #endregion + #region SelectedRowIDArray + + + /// + /// [AJAX属性]选中行的索引(列表中的第一项) + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public int SelectedRowIndex + { + get + { + if (SelectedRowIndexArray.Length > 0) + { + return SelectedRowIndexArray[0]; + } + else + { + return -1; + } + } + set + { + SelectedRowIndexArray = new int[] { value }; + } + } + + + /// + /// [AJAX属性]选中行的索引列表 + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public int[] SelectedRowIndexArray + { + get + { + if (SelectedRowIDArray == null || SelectedRowIDArray.Length == 0) + { + return new int[] { }; + } + + // 如果是内存分页,当前是第2页,每页5条数据,则这个值是 startRowIndex == 5 + int startRowIndex = GetStartRowIndex(); + + List selectedRowIds = new List(SelectedRowIDArray); + List selectedRowIndexs = new List(); + foreach (GridRow row in Rows) + { + if (selectedRowIds.Contains(row.RowID)) + { + selectedRowIndexs.Add(row.RowIndex - startRowIndex); + } + } + + return selectedRowIndexs.ToArray(); + } + set + { + if (value == null || value.Length == 0) + { + SelectedRowIDArray = new string[0]; + return; + } + + // 如果是内存分页,当前是第2页,每页5条数据,则这个值是 startRowIndex == 5 + int startRowIndex = GetStartRowIndex(); + + List selectedRowIds = new List(); + List selectedRowIndexs = new List(value); + foreach (GridRow row in Rows) + { + if (selectedRowIndexs.Contains(row.RowIndex - startRowIndex)) + { + selectedRowIds.Add(row.RowID); + } + } + + SelectedRowIDArray = selectedRowIds.ToArray(); + } + } + + /// + /// 选中的行 + /// + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public GridRow SelectedRow + { + get + { + return FindRow(SelectedRowID); + } + } + + /// + /// [AJAX属性]选中的行ID + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue("")] + [Description("[AJAX属性]选中的行ID")] + public string SelectedRowID + { + get + { + if (SelectedRowIDArray != null && SelectedRowIDArray.Length > 0) + { + return SelectedRowIDArray[0]; + } + else + { + return String.Empty; + } + } + set + { + SelectedRowIDArray = new string[] { value }; + } + } + + /// + /// [AJAX属性]选中的行ID列表 + /// + [Category(CategoryName.OPTIONS)] + [Description("[AJAX属性]选中的行节点ID列表")] + [TypeConverter(typeof(StringArrayConverter))] + public string[] SelectedRowIDArray + { + get + { + object obj = FState["SelectedRowIDArray"]; + return obj == null ? new string[0] : (string[])obj; + } + set + { + FState["SelectedRowIDArray"] = value; + } + } + + #endregion + #region DataSource/DataKeyNames/DataKeys private object _dataSource = null; @@ -1833,54 +2076,121 @@ namespace FineUI /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public JObject F_Rows + public JArray F_Rows { get { - JObject jo = new JObject(); + //JObject jo = new JObject(); + + //JArray valuesJA = new JArray(); + //JArray datakeysJA = new JArray(); + //JArray statesJA = new JArray(); + //foreach (GridRow row in Rows) + //{ + // valuesJA.Add(new JArray(row.Values)); + // datakeysJA.Add(new JArray(row.DataKeys)); + // statesJA.Add(new JArray(row.ToShortStates())); + //} + //jo.Add("Values", valuesJA); + //jo.Add("DataKeys", datakeysJA); + //jo.Add("States", statesJA); + + //return jo; + + JArray ja = new JArray(); - JArray valuesJA = new JArray(); - JArray datakeysJA = new JArray(); - JArray statesJA = new JArray(); foreach (GridRow row in Rows) { - valuesJA.Add(new JArray(row.Values)); - datakeysJA.Add(new JArray(row.DataKeys)); - statesJA.Add(new JArray(row.ToShortStates())); - } - jo.Add("Values", valuesJA); - jo.Add("DataKeys", datakeysJA); - jo.Add("States", statesJA); + JObject jo = new JObject(); - return jo; + jo.Add("0", new JArray(row.Values)); + jo.Add("1", new JArray(row.DataKeys)); + + if (row.HasStates()) + { + jo.Add("2", new JArray(row.States)); + } + + + jo.Add("6", new JValue(row.RowID)); + + + //if (!String.IsNullOrEmpty(DataTextField)) + //{ + // jo.Add("7", new JValue(row.RowText)); + //} + + ja.Add(jo); + } + + return ja; } set { + //// 注意,此时不能清空 SelectedRowIndexArray + //// 现在只是从FState中恢复数据,如果清空 SelectedRowIndexArray ,可能会导致 SelectedRowIndexArray 状态不对 + //ClearRows(); + + //JArray valuesArray = value.Value("Values"); // value.getJArray("Values"); + //JArray dataKeysArray = value.Value("DataKeys"); //value.getJArray("DataKeys"); + //JArray statesArray = value.Value("States"); //value.getJArray("States"); + //for (int i = 0, length = valuesArray.Count; i < length; i++) + //{ + // GridRow row = new GridRow(this, null, i); + + // // row.Values + // row.Values = JSONUtil.ObjectArrayFromJArray(valuesArray[i].Value()); // .getJArray(i)); + + // // row.DataKeys + // row.DataKeys = JSONUtil.ObjectArrayFromJArray(dataKeysArray[i].Value()); //.getJArray(i)); + + // // row.States + // row.FromShortStates(JSONUtil.ObjectArrayFromJArray(statesArray[i].Value())); + + // Rows.Add(row); + // //Controls.Add(row); + + // //row.InitTemplateContainers(); + //} + // 注意,此时不能清空 SelectedRowIndexArray - // 现在只是从FState中恢复数据,如果清空 SelectedRowIndexArray ,可能会导致 SelectedRowIndexArray 状态不对 + // 现在只是从FState中恢复数据,如果清空 SelectedRowIndexArray ,可能会导致 SelectedRowIndexArray 状态不对c ClearRows(); - JArray valuesArray = value.Value("Values"); // value.getJArray("Values"); - JArray dataKeysArray = value.Value("DataKeys"); //value.getJArray("DataKeys"); - JArray statesArray = value.Value("States"); //value.getJArray("States"); - for (int i = 0, length = valuesArray.Count; i < length; i++) + for (int i = 0, length = value.Count; i < length; i++) { + JObject rowValue = value[i] as JObject; + GridRow row = new GridRow(this, null, i); // row.Values - row.Values = JSONUtil.ObjectArrayFromJArray(valuesArray[i].Value()); // .getJArray(i)); + row.Values = JSONUtil.ObjectArrayFromJArray(rowValue["0"] as JArray); + // row.DataKeys - row.DataKeys = JSONUtil.ObjectArrayFromJArray(dataKeysArray[i].Value()); //.getJArray(i)); + row.DataKeys = JSONUtil.ObjectArrayFromJArray(rowValue["1"] as JArray); + // row.States - row.FromShortStates(JSONUtil.ObjectArrayFromJArray(statesArray[i].Value())); + row.RecoverStates(JSONUtil.ObjectArrayFromJArray(rowValue["2"] as JArray)); + + + var dataID = rowValue["6"]; + if (dataID != null) + { + row.RowID = dataID.Value(); + } + + //var dataText = rowValue["7"]; + //if (dataText != null) + //{ + // row.RowText = dataText.Value(); + //} + Rows.Add(row); - //Controls.Add(row); - - //row.InitTemplateContainers(); } + } } @@ -2000,14 +2310,24 @@ namespace FineUI [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - private string SelectedRowIndexArrayHiddenFieldID + private string SelectedRowsHiddenFieldID { get { - return String.Format("{0}_SelectedRowIndexArray", ClientID); + return String.Format("{0}_SelectedRows", ClientID); } } + //[Browsable(false)] + //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + //private string SelectedRowIndexArrayHiddenFieldID + //{ + // get + // { + // return String.Format("{0}_SelectedRowIndexArray", ClientID); + // } + //} + [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] private string HiddenColumnsHiddenFieldID @@ -2199,7 +2519,7 @@ namespace FineUI if (PropertyModified("PageIndex", "PageSize", "RecordCount")) { sb.AppendFormat("{0}.f_getPaging().f_update({1});", XID, GetPagingBuilder()); - sb.AppendFormat("{0}.f_loadData();", XID); + //sb.AppendFormat("{0}.f_loadData();", XID); //needUpdateSortIcon = true; @@ -2209,23 +2529,33 @@ namespace FineUI if (PropertyModified("F_Rows")) { - //if (ClientPropertyModifiedInServer("F_Rows")) - if (!dataReloaded) - { - sb.AppendFormat("{0}.f_loadData();", XID); + dataReloaded = true; - //needUpdateSortIcon = true; + ////if (ClientPropertyModifiedInServer("F_Rows")) + //if (!dataReloaded) + //{ + // sb.AppendFormat("{0}.f_loadData();", XID); - dataReloaded = true; - } + // //needUpdateSortIcon = true; - // 如果F_Rows改变了,则每行的模版列内容应该也要变化 - PageManager.Instance.AddAjaxGridClientID(ClientID); + // dataReloaded = true; + //} + + //// 如果F_Rows改变了,则每行的模版列内容应该也要变化 + //PageManager.Instance.AddAjaxGridClientID(ClientID); + } + + // 如果需要更新 模板列,则简单的重新加载表格即可 + if (_needUpdateTemplateFields) + { + dataReloaded = true; } // 本次AJAX请求重新加载的表格 if (dataReloaded) { + sb.AppendFormat("{0}.f_loadData();", XID); + PageManager.Instance.AddAjaxGridReloadedClientID(ClientID); } else @@ -2238,22 +2568,22 @@ namespace FineUI } - bool selectRowsScriptRegistered = false; - if (AllowCellEditing) - { - if (PropertyModified("SelectedCell")) - { - sb.AppendFormat("{0}.f_selectCell();", XID); - } - } - else - { - if (PropertyModified("SelectedRowIndexArray")) - { - sb.AppendFormat("{0}.f_selectRows();", XID); - selectRowsScriptRegistered = true; - } - } + //bool selectRowsScriptRegistered = false; + //if (AllowCellEditing) + //{ + // if (PropertyModified("SelectedCell")) + // { + // sb.AppendFormat("{0}.f_selectCell();", XID); + // } + //} + //else + //{ + // if (PropertyModified("SelectedRowIndexArray")) + // { + // sb.AppendFormat("{0}.f_selectRows();", XID); + // selectRowsScriptRegistered = true; + // } + //} if (PropertyModified("HiddenColumns")) @@ -2262,8 +2592,73 @@ namespace FineUI } - bool rowExpandersScriptRegistered = false; - if (PropertyModified("ExpandAllRowExpanders") || _registerScriptRowExpanders) + // 如果 SelectedCell 属性改变 或者 数据重新加载了 + if (PropertyModified("SelectedCell") || dataReloaded) + { + sb.AppendFormat("{0}.f_selectCell();", XID); + } + + // 如果 SelectedRowIndexArray 属性改变 或者 数据重新加载了 + if (PropertyModified("SelectedRowIDArray") || dataReloaded) + { + sb.AppendFormat("{0}.f_selectRows();", XID); + } + + // 如果 ExpandAllRowExpanders 属性改变 或者 数据重新加载了 或者 在后台手工操作了展开折叠属性 + if (PropertyModified("ExpandAllRowExpanders") || dataReloaded || _registerScriptRowExpanders) + { + RegisterRowExpanderScript(sb); + } + + //bool rowExpandersScriptRegistered = false; + //if (PropertyModified("ExpandAllRowExpanders") || _registerScriptRowExpanders) + //{ + // if (ExpandAllRowExpanders) + // { + // sb.AppendFormat("{0}.f_expandAllRows();", XID); + // } + // else + // { + // sb.AppendFormat("{0}.f_collapseAllRows();", XID); + // } + // rowExpandersScriptRegistered = true; + //} + + //// 如果数据重新加载了,即每行的数据都更新了 + //if (dataReloaded) + //{ + // if (!rowExpandersScriptRegistered) + // { + // // 数据重新加载了,如果没有注册行扩展列的脚本,需要注册展开所有行扩展列的脚本 + // if (ExpandAllRowExpanders) + // { + // sb.AppendFormat("{0}.f_expandAllRows();", XID); + // } + // else + // { + // sb.AppendFormat("{0}.f_collapseAllRows();", XID); + // } + // } + + + // if (!AllowCellEditing) + // { + // // 数据重新加载了,如果没有注册选中行的脚本,需要注册重新选中行的脚本 + // if (!selectRowsScriptRegistered) + // { + // sb.AppendFormat("{0}.f_selectRows();", XID); + // } + // } + + //} + + AddAjaxScript(sb); + } + + private void RegisterRowExpanderScript(StringBuilder sb) + { + GridColumn rowExpanderColumn = GetRowExpanderColumn(); + if (rowExpanderColumn != null) { if (ExpandAllRowExpanders) { @@ -2273,38 +2668,25 @@ namespace FineUI { sb.AppendFormat("{0}.f_collapseAllRows();", XID); } - rowExpandersScriptRegistered = true; } + } - // 如果数据重新加载了,即每行的数据都更新了 - if (dataReloaded) + /// + /// 获取行扩展列 + /// + /// + internal GridColumn GetRowExpanderColumn() + { + GridColumn expanderColumn = null; + foreach (GridColumn column in Columns) { - if (!rowExpandersScriptRegistered) + if (column is TemplateField && (column as TemplateField).RenderAsRowExpander) { - // 数据重新加载了,如果没有注册行扩展列的脚本,需要注册展开所有行扩展列的脚本 - if (ExpandAllRowExpanders) - { - sb.AppendFormat("{0}.f_expandAllRows();", XID); - } - else - { - sb.AppendFormat("{0}.f_collapseAllRows();", XID); - } + expanderColumn = column; + break; } - - - if (!AllowCellEditing) - { - // 数据重新加载了,如果没有注册选中行的脚本,需要注册重新选中行的脚本 - if (!selectRowsScriptRegistered) - { - sb.AppendFormat("{0}.f_selectRows();", XID); - } - } - } - - AddAjaxScript(sb); + return expanderColumn; } /// @@ -2314,6 +2696,14 @@ namespace FineUI { // 确保 F_Rows 在页面第一次加载时都存在于f_state中 FState.AddModifiedProperty("F_Rows"); + if (EnableSummary) + { + FState.AddModifiedProperty("SummaryData"); + } + if (SelectedRowIDArray.Length > 0) + { + FState.AddModifiedProperty("SelectedRowIDArray"); + } // 不需要手工添加 SelectedRowIndexArray 属性,是因为只能通过代码设置此属性 // 只要通过代码设置了 SelectedRowIndexArray 属性,则一定会存在于 F_States @@ -2414,6 +2804,13 @@ namespace FineUI #region Properties + if (!String.IsNullOrEmpty(DataIDField)) + { + OB.AddProperty("f_idField", DataIDField); + } + + + if (EnableColumnLines) { OB.AddProperty("columnLines", true); @@ -2424,7 +2821,7 @@ namespace FineUI OB.AddProperty("rowLines", false); } - + if (ForceFit) { @@ -2468,7 +2865,7 @@ namespace FineUI if (EnableRowClickEvent) { - string validateScript = "var args='RowClick$'+index;"; + string validateScript = "var args='RowClick$'+record.getId();"; validateScript += GetPostBackEventReference("#RowClick#").Replace("'#RowClick#'", "args"); //string rowClickScript = JsHelper.GetFunction(validateScript, "grid", "record", "item", "index"); // String.Format("function(grid,rowIndex,e){{{0}}}", validateScript); @@ -2479,7 +2876,7 @@ namespace FineUI if (EnableRowDoubleClickEvent) { - string validateScript = "var args='RowDoubleClick$'+index;"; + string validateScript = "var args='RowDoubleClick$'+record.getId();"; validateScript += GetPostBackEventReference("#RowDoubleClick#").Replace("'#RowDoubleClick#'", "args"); //string rowClickScript = JsHelper.GetFunction(validateScript, "grid", "record", "item", "index"); //String.Format("function(grid,rowIndex,e){{{0}}}", validateScript); @@ -2545,9 +2942,14 @@ namespace FineUI #region remove fx OB.AddProperty("draggable", false); - OB.AddProperty("enableColumnMove", false); + //OB.AddProperty("enableColumnMove", false); OB.AddProperty("enableDragDrop", false); + if (!EnableColumnResize) + { + OB.AddProperty("enableColumnResize", false); + } + #endregion #region AllowSorting @@ -2635,14 +3037,18 @@ namespace FineUI { // 必须延时调用 doLayout,否则显示不正常 viewreadySB.Append("cmp.doLayout();"); - } - string viewreadyScript = "window.setTimeout(function(){" + viewreadySB.ToString() + "},200);"; + string viewreadyScript = viewreadySB.ToString(); - // viewready在enableLocking时不会触发,只好改成afterrender - //OB.Listeners.AddProperty("afterrender", JsHelper.GetFunction(viewreadyScript, "cmp"), true); - AddListener("afterrender", viewreadyScript, "cmp"); + if (!String.IsNullOrEmpty(viewreadyScript)) + { + viewreadyScript = "window.setTimeout(function(){" + viewreadyScript + "},200);"; + + // viewready在enableLocking时不会触发,只好改成afterrender + //OB.Listeners.AddProperty("afterrender", JsHelper.GetFunction(viewreadyScript, "cmp"), true); + AddListener("afterrender", viewreadyScript, "cmp"); + } #endregion @@ -2699,7 +3105,7 @@ namespace FineUI if (EnableAfterEditEvent) { - string validateScript = "var args='AfterEdit$'+e.rowIdx+'$'+e.field;"; + string validateScript = "var args='AfterEdit$'+e.record.getId()+'$'+e.column.id;"; validateScript += GetPostBackEventReference("#AfterEdit#").Replace("'#AfterEdit#'", "args"); //string rowClickScript = String.Format("function(editor,e){{{0}}}", validateScript); @@ -2996,7 +3402,14 @@ namespace FineUI if (EnableMultiSelect) { - selectOB.AddProperty("mode", "MULTI"); + if (KeepCurrentSelection) + { + selectOB.AddProperty("mode", "SIMPLE"); + } + else + { + selectOB.AddProperty("mode", "MULTI"); + } } else { @@ -3013,13 +3426,21 @@ namespace FineUI if (EnableRowSelectEvent) { - string validateScript = "var args='RowSelect$'+index;"; + string validateScript = "var args='RowSelect$'+record.getId();"; validateScript += GetPostBackEventReference("#RowSelect#").Replace("'#RowSelect#'", "args"); string rowSelectScript = JsHelper.GetFunction(validateScript, "model", "record", "index"); //String.Format("function(model,rowIndex){{{0}}}", validateScript); selectOB.Listeners.AddProperty("select", rowSelectScript, true); - + } + if (EnableRowDeselectEvent) + { + string validateScript = "var args='RowDeselect$'+record.getId();"; + validateScript += GetPostBackEventReference("#RowDeselect#").Replace("'#RowDeselect#'", "args"); + + string rowSelectScript = JsHelper.GetFunction(validateScript, "model", "record", "index"); //String.Format("function(model,rowIndex){{{0}}}", validateScript); + + selectOB.Listeners.AddProperty("deselect", rowSelectScript, true); } if (EnableCheckBoxSelect) @@ -3073,9 +3494,23 @@ namespace FineUI } fieldsBuidler.AddProperty(fieldBuilder); } + + // 增加 idProperty + //JsObjectBuilder idFieldBuilder = new JsObjectBuilder(); + //idFieldBuilder.AddProperty("name", "__id"); + fieldsBuidler.AddProperty("__id"); + string fieldsScript = String.Format("var {0}={1};", Render_GridFieldsID, fieldsBuidler); - storeBuilder.AddProperty("fields", Render_GridFieldsID, true); + + // 自定义Model + JsObjectBuilder modelOB = new JsObjectBuilder(); + modelOB.AddProperty("extend", "Ext.data.Model"); + modelOB.AddProperty("idProperty", "__id"); + modelOB.AddProperty("fields", Render_GridFieldsID, true); + storeBuilder.AddProperty("model", String.Format("Ext.define(null,{0})", modelOB), true); + + //storeBuilder.AddProperty("fields", Render_GridFieldsID, true); storeBuilder.AddProperty("remoteSort", true); @@ -3262,6 +3697,16 @@ namespace FineUI /// internal void ResolveStartEndRowIndex(out int startRowIndex, out int endRowIndex) { + startRowIndex = GetStartRowIndex(); + endRowIndex = Rows.Count - 1; + + // 内存分页 + if (AllowPaging && !IsDatabasePaging) + { + endRowIndex = (PageIndex + 1) * PageSize - 1; + endRowIndex = (endRowIndex < RecordCount - 1) ? endRowIndex : RecordCount - 1; + } + /* startRowIndex = 0; endRowIndex = Rows.Count - 1; @@ -3281,8 +3726,71 @@ namespace FineUI endRowIndex = endRowIndex < RecordCount - 1 ? endRowIndex : RecordCount - 1; } } + * */ } + /// + /// 获取当前分页的起始行序号(不分页或者数据库分页时,返回零) + /// + /// + public int GetStartRowIndex() + { + int startRowIndex = 0; + + // 如果是内存分页 + if (AllowPaging && !IsDatabasePaging) + { + startRowIndex = PageSize * PageIndex; + } + + return startRowIndex; + } + + /// + /// 通过行ID获取行对象 + /// + /// 行ID + /// 行对象 + public GridRow FindRow(string rowID) + { + GridRow result = null; + + foreach (GridRow row in Rows) + { + if (rowID == row.RowID) + { + result = row; + break; + } + } + + return result; + } + + + /// + /// 通过行序号获取行对象 + /// + /// 行序号 + /// 行对象 + public GridRow FindRow(int rowIndex) + { + GridRow row = null; + + int startRowIndex = GetStartRowIndex(); + + int currentRowIndex = rowIndex + startRowIndex; + + if (currentRowIndex >= 0 && currentRowIndex < Rows.Count) + { + row = Rows[currentRowIndex]; + } + + return row; + } + + + #endregion #endregion @@ -3315,19 +3823,26 @@ namespace FineUI #region UpdateTemplateFields + private bool _needUpdateTemplateFields = false; + + /// /// 当在客户端修改了模板列中的值,调用此函数来告诉表格控件需要更新这些值; /// 如果对表格重新进行了数据绑定,则不需要调用此函数,因为重新绑定后会更新表格的全部内容 /// public void UpdateTemplateFields() { - PageManager.Instance.AddAjaxGridClientID(ClientID); + _needUpdateTemplateFields = true; + //PageManager.Instance.AddAjaxGridClientID(ClientID); } #endregion #region DataBind + // 当前表格是否调用了 DataBind() 函数 + private bool _dataBinded = false; + internal Dictionary cellEditingDataKeyNameField = new Dictionary(); /// @@ -3337,9 +3852,17 @@ namespace FineUI { //base.DataBind(); + // 调用了本函数 + _dataBinded = true; + + // 重新绑定数据后,GetMergedData要重新计算了,并且清空已更改数据记录 + _mergedData = null; + // 如果重新绑定数据,则每行的模版列内容有可能发生变化,就需要更新 // 因为目前,没有判断模板列是否改变的机制,所以只要可能导致模板列的动作都要更新模板列 - PageManager.Instance.AddAjaxGridClientID(ClientID); + //PageManager.Instance.AddAjaxGridClientID(ClientID); + _needUpdateTemplateFields = true; + // 如果重新绑定数据,则取消之前的编辑状态提示 if (IsFineUIAjaxPostBack && AllowCellEditing) @@ -3473,7 +3996,7 @@ namespace FineUI //row.DataBindRow(); row.DataBindRow(); - OnRowDataBound(new GridRowEventArgs(rowObj, rowIndex, row.Values)); + OnRowDataBound(new GridRowEventArgs(row)); } } @@ -3577,6 +4100,128 @@ namespace FineUI #region GetModifiedCells + private JArray _mergedData; + + /// + /// 获取合并后的表格数据(包含修改和未修改的数据,不包含已经删除的行数据) + /// + /// 合并后的表格数据 + public JArray GetMergedData() + { + // 不允许单元格编辑,则返回null + if (!AllowCellEditing) + { + return null; + } + + + // 已经计算过了 + if (_mergedData != null) + { + return _mergedData; + } + + + _mergedData = new JArray(); + + // 当前处理的原始索引 + int currentOriginalIndex = GetStartRowIndex(); + + // 没有调用 DataBind 函数,并且前台改变的数据不为空 + if (!_dataBinded && _modifiedData != null) + { + foreach (JObject modifiedItem in _modifiedData) + { + // 修改的数据在新集合中的行索引 + int rowIndex = modifiedItem.Value("index"); // modifiedItem[0].ToObject(); + // 修改的数据在原始集合中的行索引,如果是新增行则小于0 + int originalRowIndex = modifiedItem.Value("originalIndex"); //modifiedItem[1].ToObject(); + string status = modifiedItem.Value("status"); + + + if (status == "newadded") + { + // 新增的行 + _mergedData.Add(modifiedItem.DeepClone()); + } + else + { + // 中间一些原始数据没有变化,这里要添加进来 + if (originalRowIndex > currentOriginalIndex) + { + AddUnchangedData(_mergedData, currentOriginalIndex, originalRowIndex); + } + + + // 删除的行,原始数据行被删除了 + if (status == "deleted") + { + // nothing + } + else + { + // 修改的行 + var currentModifiedItem = modifiedItem.DeepClone(); + JObject currentModifiedValues = currentModifiedItem.Value("values"); + var originalValues = Rows[originalRowIndex].Values; + + foreach (GridColumn column in AllColumns) + { + if (column is RenderBaseField) + { + RenderBaseField field = column as RenderBaseField; + if (currentModifiedValues.Property(field.ColumnID) == null) + { + currentModifiedValues.Add(field.ColumnID, JToken.FromObject(originalValues[field.ColumnIndex])); + } + } + } + _mergedData.Add(currentModifiedItem); + } + + + // 原始索引向下移动一位 + currentOriginalIndex = originalRowIndex + 1; + } + } + } + + if (currentOriginalIndex < Rows.Count) + { + AddUnchangedData(_mergedData, currentOriginalIndex, Rows.Count); + } + + return _mergedData; + } + + private void AddUnchangedData(JArray mergedData, int currentOriginalIndex, int originalRowIndex) + { + for (int i = currentOriginalIndex; i < originalRowIndex; i++) + { + // 未改变的行 + var iModifiedItem = new JObject(); + JObject iModifiedValues = new JObject(); + var iRow = Rows[i]; + var iOriginalValues = iRow.Values; + + foreach (GridColumn column in AllColumns) + { + if (column is RenderBaseField) + { + RenderBaseField field = column as RenderBaseField; + iModifiedValues.Add(field.ColumnID, JToken.FromObject(iOriginalValues[field.ColumnIndex])); + } + } + iModifiedItem.Add("values", iModifiedValues); + iModifiedItem.Add("status", "unchanged"); + iModifiedItem.Add("originalIndex", i); + iModifiedItem.Add("index", mergedData.Count); + iModifiedItem.Add("id", iRow.RowID); + mergedData.Add(iModifiedItem); + } + } + + private JArray _modifiedData = new JArray(); /// @@ -3688,13 +4333,13 @@ namespace FineUI // 启用单元格编辑 if (AllowCellEditing) { - // 删除的行索引列表 - string paramDeletedRows = postCollection[DeletedRowsHiddenFieldID]; - _deletedList = new List(); - if (!String.IsNullOrEmpty(paramDeletedRows)) - { - _deletedList = StringUtil.GetIntListFromString(paramDeletedRows, true); - } + //// 删除的行索引列表 + //string paramDeletedRows = postCollection[DeletedRowsHiddenFieldID]; + //_deletedList = new List(); + //if (!String.IsNullOrEmpty(paramDeletedRows)) + //{ + // _deletedList = StringUtil.GetIntListFromString(paramDeletedRows, true); + //} //// 新增的行索引列表 //string paramNewAddedRows = postCollection[NewAddedRowsHiddenFieldID]; @@ -3710,7 +4355,8 @@ namespace FineUI dataKeyNames = new List(DataKeyNames); } - // 根据用户的输入修改每个单元格的Values + // 修改的单元格 + _deletedList = new List(); _modifiedDict = new Dictionary>(); _newAddedList = new List>(); _modifiedData = new JArray(); @@ -3719,6 +4365,94 @@ namespace FineUI { _modifiedData = JArray.Parse(editorDataStr); + foreach (JObject modifiedItem in _modifiedData) + { + // 修改的数据在新集合中的行索引 + int rowIndex = modifiedItem.Value("index"); // modifiedItem[0].ToObject(); + // 修改的数据在原始集合中的行索引,如果是新增行则小于0 + int originalRowIndex = modifiedItem.Value("originalIndex"); //modifiedItem[1].ToObject(); + string status = modifiedItem.Value("status"); + + if (status == "deleted") + { + // 删除的行 + _deletedList.Add(originalRowIndex); + continue; + } + + + // 获取本行(Record)中所有修改的记录(Field),并保存到字典中(rowModifiedDic) + Dictionary rowModifiedDic = new Dictionary(); + + JObject rowModifiedData = modifiedItem.Value("values"); //modifiedItem[2].ToObject(); + foreach (JProperty propertyObj in rowModifiedData.Properties()) + { + string columnID = propertyObj.Name; + object cellValue = rowModifiedData.Value(columnID).Value; + // 启用单元格编辑,所以这里的列一定是RenderBaseField + GridColumn column = FindColumn(columnID); + int columnIndex = column.ColumnIndex; + + if (column is RenderField) + { + RenderField renderColumn = column as RenderField; + + // 数字类型的列,如果值为 空字符串,则更新为 null + if (renderColumn.FieldType == FieldType.Int || + renderColumn.FieldType == FieldType.Float || + renderColumn.FieldType == FieldType.Double) + { + if (cellValue.Equals(String.Empty)) + { + cellValue = DBNull.Value; + } + } + } + + rowModifiedDic.Add(columnID, cellValue); + + // 更新Values和DataKeys - 虽然本次回发可能不保存单元格的值,但是通过到服务器端也没什么错 + // 注意:删除行和新增行都无法同步到Values和DataKeys,必须重新DataBind才行 + // 如果本行已经存在,还需要更新行的Values属性 + if (status == "modified") + { + // 更新行的Values + Rows[originalRowIndex].Values[columnIndex] = cellValue; + + // 更新行的DataKeys + if (dataKeyNames != null) + { + RenderBaseField renderField = column as RenderBaseField; + if (renderField != null) + { + int dataKeyIndex = dataKeyNames.IndexOf(renderField.DataField); + if (dataKeyIndex >= 0) + { + Rows[originalRowIndex].DataKeys[dataKeyIndex] = cellValue; + } + } + } + } + + + } + + if (status == "modified") + { + // 已经存在的行 + _modifiedDict.Add(originalRowIndex, rowModifiedDic); + } + else + { + // 新增行 + _newAddedList.Add(rowModifiedDic); + } + } + + + //// 删除行或者新增行,都无法将客户端F_Rows的更改同步到服务器端控件,需要在服务器端重新加载数据 + FState.BackupPostDataProperty("F_Rows"); + /* foreach (JArray modifiedItem in _modifiedData) { // 修改的数据在新集合中的行索引 @@ -3777,12 +4511,27 @@ namespace FineUI } FState.BackupPostDataProperty("F_Rows"); + */ } - // 选中的单元格(数组中元素的顺序是固定的,不能排序) - int[] selectedCell = StringUtil.GetIntListFromString(postCollection[SelectedCellHiddenFieldID], false).ToArray(); - if (!StringUtil.CompareIntArray(SelectedCell, selectedCell)) + //// 选中的单元格(数组中元素的顺序是固定的,不能排序) + //int[] selectedCell = StringUtil.GetIntListFromString(postCollection[SelectedCellHiddenFieldID], false).ToArray(); + //if (!StringUtil.CompareIntArray(SelectedCell, selectedCell)) + //{ + // SelectedCell = selectedCell; + // FState.BackupPostDataProperty("SelectedCell"); + //} + + // 客户端传入的是 [rowid, columnid] + string[] selectedCell = null; + string selectedCellPostValue = postCollection[SelectedCellHiddenFieldID]; + if (!String.IsNullOrEmpty(selectedCellPostValue)) + { + selectedCell = JSONUtil.StringArrayFromJArray(JArray.Parse(selectedCellPostValue)); + } + // 比较时要保持顺序 + if (!StringUtil.CompareStringArray(SelectedCell, selectedCell, true)) { SelectedCell = selectedCell; FState.BackupPostDataProperty("SelectedCell"); @@ -3793,11 +4542,23 @@ namespace FineUI { // 选中的行 - int[] selectedRowIndexArray = StringUtil.GetIntListFromString(postCollection[SelectedRowIndexArrayHiddenFieldID], true).ToArray(); - if (!StringUtil.CompareIntArray(SelectedRowIndexArray, selectedRowIndexArray)) + //int[] selectedRowIndexArray = StringUtil.GetIntListFromString(postCollection[SelectedRowIndexArrayHiddenFieldID], true).ToArray(); + //if (!StringUtil.CompareIntArray(SelectedRowIndexArray, selectedRowIndexArray)) + //{ + // SelectedRowIndexArray = selectedRowIndexArray; + // FState.BackupPostDataProperty("SelectedRowIndexArray"); + //} + + string[] selectedRows = null; + string selectedRowsPostValue = postCollection[SelectedRowsHiddenFieldID]; + if (!String.IsNullOrEmpty(selectedRowsPostValue)) { - SelectedRowIndexArray = selectedRowIndexArray; - FState.BackupPostDataProperty("SelectedRowIndexArray"); + selectedRows = JSONUtil.StringArrayFromJArray(JArray.Parse(selectedRowsPostValue)); + } + if (!StringUtil.CompareStringArray(SelectedRowIDArray, selectedRows)) + { + SelectedRowIDArray = selectedRows; + FState.BackupPostDataProperty("SelectedRowIDArray"); } } @@ -3890,6 +4651,18 @@ namespace FineUI } + /// + /// 添加一条新纪录 + /// + /// 缺省值 + /// 是否添加到末尾 + /// 添加后使某列处于编辑状态 + public void AddNewRecord(JObject defaultObject, bool appendToEnd, string editColumnID) + { + PageContext.RegisterStartupScript(GetAddNewRecordReference(defaultObject, appendToEnd, editColumnID)); + } + + /// /// 获取添加一条新纪录的客户端脚本 /// @@ -3909,27 +4682,101 @@ namespace FineUI /// 客户端脚本 public string GetAddNewRecordReference(JObject defaultObject, bool appendToEnd) { - return String.Format("{0}.f_addNewRecord({1},{2});", ScriptID, defaultObject.ToString(Formatting.None), appendToEnd.ToString().ToLower()); + return GetAddNewRecordReference(defaultObject, appendToEnd, null); + } + + + /// + /// 获取添加一条新纪录的客户端脚本 + /// + /// 缺省值 + /// 是否添加到末尾 + /// 添加后使某列处于编辑状态 + /// 客户端脚本 + public string GetAddNewRecordReference(JObject defaultObject, bool appendToEnd, string editColumnID) + { + string objstr = defaultObject.ToString(Formatting.None); + string appendstr = appendToEnd.ToString().ToLower(); + + if (String.IsNullOrEmpty(editColumnID)) + { + return String.Format("{0}.f_addNewRecord({1},{2});", ScriptID, objstr, appendstr); + } + else + { + return String.Format("{0}.f_addNewRecord({1},{2},{3});", ScriptID, objstr, appendstr, JsHelper.Enquote(editColumnID)); + } + } + + ///// + ///// 获取添加一条新纪录的客户端脚本 + ///// + ///// 缺省值 + ///// 是否添加到末尾 + ///// 客户端脚本 + //public string GetAddNewRecordReference(JObject defaultObject, bool appendToEnd) + //{ + // return String.Format("{0}.f_addNewRecord({1},{2});", ScriptID, defaultObject.ToString(Formatting.None), appendToEnd.ToString().ToLower()); + //} + + + ///// + ///// 删除选中行(或者单元格) + ///// + //public void DeleteSelected() + //{ + // PageContext.RegisterStartupScript(GetDeleteSelectedReference()); + //} + + ///// + ///// 获取删除选中行(或者单元格)的客户端脚本 + ///// + ///// 客户端脚本 + //public string GetDeleteSelectedReference() + //{ + // return String.Format("{0}.f_deleteSelected();", ScriptID); + //} + + + /// + /// 删除选中行(或者单元格) + /// + [Obsolete("请使用DeleteSelectedRows")] + public void DeleteSelected() + { + PageContext.RegisterStartupScript(GetDeleteSelectedRowsReference()); + } + + + /// + /// 获取删除选中行(或者单元格)的客户端脚本 + /// + /// 客户端脚本 + [Obsolete("请使用GetDeleteSelectedRowsReference")] + public string GetDeleteSelectedReference() + { + return GetDeleteSelectedRowsReference(); } /// /// 删除选中行(或者单元格) /// - public void DeleteSelected() + public void DeleteSelectedRows() { - PageContext.RegisterStartupScript(GetDeleteSelectedReference()); + PageContext.RegisterStartupScript(GetDeleteSelectedRowsReference()); } /// /// 获取删除选中行(或者单元格)的客户端脚本 /// /// 客户端脚本 - public string GetDeleteSelectedReference() + public string GetDeleteSelectedRowsReference() { - return String.Format("{0}.f_deleteSelected();", ScriptID); + return String.Format("{0}.f_deleteSelectedRows();", ScriptID); } + #endregion #region GetHasSelectionReference GetSelectCountReference @@ -4161,69 +5008,87 @@ namespace FineUI { base.RaisePostBackEvent(eventArgument); + //if (eventArgument.StartsWith("Sort$")) + //{ + // string[] sortArgs = eventArgument.Split('$'); + // if (sortArgs.Length == 3) + // { + // // 格式为 "Sort$Grid1_ctl03$ASC" + // string sortDir = sortArgs[2]; + // string columnId = sortArgs[1]; + + // int columnIndex = 0; + // foreach (GridColumn column in AllColumns) + // { + // if (column.ColumnID == columnId) + // { + // break; + // } + // columnIndex++; + // } + + // // 当前列的排序字段和排序方向 + // string sortField = AllColumns[columnIndex].SortField; + // string sortDirection = sortDir.ToUpper() == "ASC" ? "ASC" : "DESC"; + + // SortDirection = sortDirection; + // SortField = sortField; + + // OnSort(new GridSortEventArgs(sortField, sortDirection, columnIndex)); + // } + + //} if (eventArgument.StartsWith("Sort$")) { - #region Sort - string[] sortArgs = eventArgument.Split('$'); - //if (sortArgs.Length == 2) - //{ - // // 格式为 "Sort$2",其中columnIndex = 2,这个是把前面的RowNumber,CheckBox列也算上去的,应该减掉 - // // 所在的列 - // int columnIndex = Convert.ToInt32(sortArgs[1]); - // columnIndex -= GetPrefixColumnNumber(); - - // // 当前列的排序字段和排序方向 - // string sortDirection = "ASC"; - // string sortField = AllColumns[columnIndex].SortField; - - // // Sort column index not changed in current postback. - // if (columnIndex == SortColumnIndex) - // { - // sortDirection = SortDirection == "ASC" ? "DESC" : "ASC"; - // } - - // // 为了和之前的兼容,还是先把表格的这两个属性设置好 - // SortDirection = sortDirection; - // SortColumnIndex = columnIndex; - - // OnSort(new GridSortEventArgs(sortField, sortDirection, columnIndex)); - //} if (sortArgs.Length == 3) { // 格式为 "Sort$Grid1_ctl03$ASC" - string sortDir = sortArgs[2]; - string columnId = sortArgs[1]; + string sortDirection = sortArgs[2]; + string columnID = sortArgs[1]; - int columnIndex = 0; - foreach (GridColumn column in AllColumns) + GridColumn column = FindColumn(columnID); + if (column != null) { - if (column.ColumnID == columnId) - { - break; - } - columnIndex++; + // 当前列的排序字段和排序方向 + string sortField = column.SortField; + + SortDirection = sortDirection; + SortField = sortField; + + OnSort(new GridSortEventArgs(sortField, sortDirection, column.ColumnIndex, columnID)); } - - // 当前列的排序字段和排序方向 - string sortField = AllColumns[columnIndex].SortField; - string sortDirection = sortDir.ToUpper() == "ASC" ? "ASC" : "DESC"; - - SortDirection = sortDirection; - SortField = sortField; - - OnSort(new GridSortEventArgs(sortField, sortDirection, columnIndex)); } - #endregion } + //else if (eventArgument.StartsWith("Command$")) + //{ + // string[] commandArgs = eventArgument.Split('$'); + // if (commandArgs.Length == 5) + // { + // OnRowCommand(new GridCommandEventArgs(Convert.ToInt32(commandArgs[1]), Convert.ToInt32(commandArgs[2]), commandArgs[3], commandArgs[4])); + // } + //} else if (eventArgument.StartsWith("Command$")) { string[] commandArgs = eventArgument.Split('$'); if (commandArgs.Length == 5) { - OnRowCommand(new GridCommandEventArgs(Convert.ToInt32(commandArgs[1]), Convert.ToInt32(commandArgs[2]), commandArgs[3], commandArgs[4])); + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + string columnID = commandArgs[2]; + GridColumn column = FindColumn(columnID); + + OnRowCommand(new GridCommandEventArgs(rowIndex, rowID, column.ColumnIndex, columnID, commandArgs[3], commandArgs[4])); + } } else if (eventArgument.StartsWith("Page$")) @@ -4243,12 +5108,53 @@ namespace FineUI SelectedCell = null; } } + //else if (eventArgument.StartsWith("RowClick$")) + //{ + // string[] commandArgs = eventArgument.Split('$'); + // if (commandArgs.Length == 2) + // { + // int rowIndex = Convert.ToInt32(commandArgs[1]); + + // // 内存分页 + // if (AllowPaging && !IsDatabasePaging) + // { + // rowIndex += PageSize * PageIndex; + // } + + // OnRowClick(new GridRowClickEventArgs(rowIndex)); + // } + //} + //else if (eventArgument.StartsWith("RowDoubleClick$")) + //{ + // string[] commandArgs = eventArgument.Split('$'); + // if (commandArgs.Length == 2) + // { + // int rowIndex = Convert.ToInt32(commandArgs[1]); + + // // 内存分页 + // if (AllowPaging && !IsDatabasePaging) + // { + // rowIndex += PageSize * PageIndex; + // } + + // OnRowDoubleClick(new GridRowClickEventArgs(rowIndex)); + // } + //} else if (eventArgument.StartsWith("RowClick$")) { string[] commandArgs = eventArgument.Split('$'); if (commandArgs.Length == 2) { - OnRowClick(new GridRowClickEventArgs(Convert.ToInt32(commandArgs[1]))); + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + OnRowClick(new GridRowClickEventArgs(rowIndex, rowID)); + } } else if (eventArgument.StartsWith("RowDoubleClick$")) @@ -4256,7 +5162,16 @@ namespace FineUI string[] commandArgs = eventArgument.Split('$'); if (commandArgs.Length == 2) { - OnRowDoubleClick(new GridRowClickEventArgs(Convert.ToInt32(commandArgs[1]))); + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + OnRowDoubleClick(new GridRowClickEventArgs(rowIndex, rowID)); + } } else if (eventArgument.StartsWith("RowSelect$")) @@ -4264,15 +5179,63 @@ namespace FineUI string[] commandArgs = eventArgument.Split('$'); if (commandArgs.Length == 2) { - OnRowSelect(new GridRowSelectEventArgs(Convert.ToInt32(commandArgs[1]))); + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + OnRowSelect(new GridRowSelectEventArgs(rowIndex, rowID)); + } + } + else if (eventArgument.StartsWith("RowDeselect$")) + { + string[] commandArgs = eventArgument.Split('$'); + if (commandArgs.Length == 2) + { + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + OnRowDeselect(new GridRowSelectEventArgs(rowIndex, rowID)); } } else if (eventArgument.StartsWith("AfterEdit$")) { + //string[] commandArgs = eventArgument.Split('$'); + //if (commandArgs.Length == 3) + //{ + // int rowIndex = Convert.ToInt32(commandArgs[1]); + + // // 内存分页 + // if (AllowPaging && !IsDatabasePaging) + // { + // rowIndex += PageSize * PageIndex; + // } + + // OnAfterEdit(new GridAfterEditEventArgs(rowIndex, commandArgs[2].ToString())); + //} string[] commandArgs = eventArgument.Split('$'); if (commandArgs.Length == 3) { - OnAfterEdit(new GridAfterEditEventArgs(Convert.ToInt32(commandArgs[1]), commandArgs[2].ToString())); + string rowID = commandArgs[1]; + GridRow row = FindRow(rowID); + int rowIndex = -1; // -1 表示新增行 + if (row != null) + { + rowIndex = row.RowIndex; // -GetStartRowIndex(); + } + + string columnID = commandArgs[2]; + GridColumn column = FindColumn(columnID); + + OnAfterEdit(new GridAfterEditEventArgs(rowIndex, rowID, column.ColumnIndex, columnID)); } } } @@ -4622,6 +5585,42 @@ namespace FineUI #endregion + #region OnRowDeselect + + private static readonly object _rowDeselectHandlerKey = new object(); + + /// + /// 行取消选中事件(需要启用EnableRowDeselect) + /// + [Category(CategoryName.ACTION)] + [Description("行取消选中事件(需要启用EnableRowDeselect)")] + public event EventHandler RowDeselect + { + add + { + Events.AddHandler(_rowDeselectHandlerKey, value); + } + remove + { + Events.RemoveHandler(_rowDeselectHandlerKey, value); + } + } + + /// + /// 触发行取消选中事件 + /// + /// 事件参数 + protected virtual void OnRowDeselect(GridRowSelectEventArgs e) + { + EventHandler handler = Events[_rowDeselectHandlerKey] as EventHandler; + if (handler != null) + { + handler(this, e); + } + } + + #endregion + #region OnAfterEdit private static readonly object _afterEditHandlerKey = new object(); diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/CheckBoxField.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/CheckBoxField.cs index b1defb8..f894131 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/CheckBoxField.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/CheckBoxField.cs @@ -328,7 +328,7 @@ namespace FineUI } else { - string paramStr = String.Format("Command${0}${1}${2}${3}", row.RowIndex, ColumnIndex, CommandName.Replace("'", "\""), CommandArgument.Replace("'", "\"")); + string paramStr = String.Format("Command${0}${1}${2}${3}", row.RowID, ColumnID, CommandName.Replace("'", "\""), CommandArgument.Replace("'", "\"")); // ӳִУȷǰѡ״̬Ѿı string postBackReference = JsHelper.GetDeferScript(Grid.GetPostBackEventReference(paramStr, EnableAjax), 0); diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/GridColumn/GridColumn.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/GridColumn/GridColumn.cs index f41d6a8..aeb240c 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/GridColumn/GridColumn.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/GridColumn/GridColumn.cs @@ -337,7 +337,27 @@ namespace FineUI } } + private Unit _minWidth = Unit.Empty; + /// + /// Сп + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(typeof(Unit), "")] + [Description("Сп")] + public virtual Unit MinWidth + { + get + { + return _minWidth; + } + set + { + _minWidth = value; + } + } + + private int _boxFlex = 0; /// /// ӿؼijߴ磨ʹHBox֣ /// @@ -348,18 +368,16 @@ namespace FineUI { get { - object obj = FState["BoxFlex"]; - return obj == null ? 0 : (int)obj; + return _boxFlex; } set { - FState["BoxFlex"] = value; + _boxFlex = value; } } private bool _expandUnusedSpace = false; - /// /// лչδʹõĿ /// @@ -647,6 +665,11 @@ namespace FineUI OB.AddProperty("flex", BoxFlex); } + if (MinWidth != Unit.Empty) + { + OB.AddProperty("minWidth", MinWidth.Value); + } + if (ExpandUnusedSpace) { OB.AddProperty("flex", 1); diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/LinkButtonField.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/LinkButtonField.cs index fa88fb8..3b16c2d 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/LinkButtonField.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/LinkButtonField.cs @@ -598,7 +598,7 @@ namespace FineUI nb.SetProperty("href", "javascript:;"); // click - string paramStr = String.Format("Command${0}${1}${2}${3}", row.RowIndex, ColumnIndex, CommandName.Replace("'", "\""), CommandArgument.Replace("'", "\"")); + string paramStr = String.Format("Command${0}${1}${2}${3}", row.RowID, ColumnID, CommandName.Replace("'", "\""), CommandArgument.Replace("'", "\"")); string postBackReference = Grid.GetPostBackEventReference(paramStr, EnableAjax); string clientScript = Button.ResolveClientScript(ValidateForms, ValidateTarget, ValidateMessageBox, EnablePostBack, postBackReference, diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderBaseField.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderBaseField.cs index 9114cc8..d48034d 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderBaseField.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderBaseField.cs @@ -69,9 +69,78 @@ namespace FineUI } } + /// + /// ñеĵԪ༭ + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(true)] + [Description("ñеĵԪ༭")] + public virtual bool EnableColumnEdit + { + get + { + object obj = FState["EnableColumnEdit"]; + return obj == null ? true : (bool)obj; + } + set + { + FState["EnableColumnEdit"] = value; + } + } + #endregion + #region OnAjaxPreRender + /// + /// Ⱦ HTML ֮ǰãAJAXط + /// + protected override void OnAjaxPreRender() + { + // base.OnAjaxPreRender Hidden Ըıͼ¼ GridColumn У Grid еAJAX HiddenColumns + base.OnAjaxPreRender(); + + + //// пؼӲԵĸı + //StringBuilder sb = new StringBuilder(); + + //if (PropertyModified("EnableColumnEdit")) + //{ + // sb.AppendFormat("{0}.f_setEditable();", XID); + //} + + //AddAjaxScript(sb); + + + + //if (sb.Length > 0) + //{ + // // Ķƣ f_loadData + // ResourceManager.Instance.AddAjaxShortName(Grid.ClientID, Grid.XID); + + // // ResponseFilterҪ f_loadDataΪԸı + // PageManager.Instance.AddAjaxGridColumnChangedGridClientID(Grid.ClientID); + //} + + } + + #endregion + + #region OnFirstPreRender + + /// + /// Ⱦ HTML ֮ǰãҳһμػͨط + /// + protected override void OnFirstPreRender() + { + base.OnFirstPreRender(); + + OB.AddProperty("f_editable", EnableColumnEdit); + + } + + + #endregion } } diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderCheckField.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderCheckField.cs index 5626441..9619b64 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderCheckField.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderCheckField.cs @@ -85,18 +85,22 @@ namespace FineUI { base.OnFirstPreRender(); + OB.AddProperty("f_columnType", "rendercheckfield"); + + if (Grid.AllowCellEditing) { OB.AddProperty("xtype", "checkcolumn"); if (Grid.EnableAfterEditEvent) { - string validateScript = "var args='AfterEdit$'+rowIndex+'$" + ColumnID + "';"; + string rowIdScript = String.Format("var rowId=F('{0}').getStore().getAt(rowIndex).getId();", Grid.ClientID); + string validateScript = "var args='AfterEdit$'+rowId+'$" + ColumnID + "';"; validateScript += Grid.GetPostBackEventReference("#AfterEdit#").Replace("'#AfterEdit#'", "args"); //string checkchangeScript = String.Format("function(checkcolumn,rowIndex,checked){{{0}}}", validateScript); //OB.Listeners.AddProperty("checkchange", checkchangeScript, true); - AddListener("checkchange", validateScript, "checkcolumn", "rowIndex", "checked"); + AddListener("checkchange", rowIdScript + validateScript, "checkcolumn", "rowIndex", "checked"); } } diff --git a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderField.cs b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderField.cs index 375fb15..67af9f6 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderField.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridColumn/RenderField/RenderField.cs @@ -222,6 +222,32 @@ namespace FineUI } } + /// + /// ñеĵԪ༭ܣδEditorΪfalse + /// + [Category(CategoryName.OPTIONS)] + [DefaultValue(true)] + [Description("ñеĵԪ༭ܣδEditorΪfalse")] + public override bool EnableColumnEdit + { + get + { + if (Editor.Count > 0) + { + object obj = FState["EnableColumnEdit"]; + return obj == null ? true : (bool)obj; + } + else + { + // δ EditorΪfalse + return false; + } + } + set + { + FState["EnableColumnEdit"] = value; + } + } #endregion @@ -253,6 +279,10 @@ namespace FineUI { result = Convert.ToSingle(value); } + else if (FieldType == FieldType.Double) + { + result = Convert.ToDouble(value); + } else if (FieldType == FieldType.Date) { // http://www.dotnetperls.com/datetime-format @@ -352,6 +382,9 @@ namespace FineUI { base.OnFirstPreRender(); + OB.AddProperty("f_columnType", "renderfield"); + + string renderer = GetRenderer(); if (!String.IsNullOrEmpty(renderer)) { diff --git a/FineUI/WebControls/PanelBase.Grid/GridRow/GridRow.cs b/FineUI/WebControls/PanelBase.Grid/GridRow/GridRow.cs index 4a30cd3..adc0500 100644 --- a/FineUI/WebControls/PanelBase.Grid/GridRow/GridRow.cs +++ b/FineUI/WebControls/PanelBase.Grid/GridRow/GridRow.cs @@ -149,6 +149,23 @@ namespace FineUI } } + private string _rowID = String.Empty; + + /// + /// DataIDFieldֶεֵ + /// + public string RowID + { + get + { + return _rowID; + } + internal set + { + _rowID = value; + } + } + private object[] _states = null; /// @@ -187,29 +204,84 @@ namespace FineUI #region ToShortStates/FromShortStates /// - /// ǰ״̬б + /// Ƿ״̬б /// /// - internal object[] ToShortStates() + internal bool HasStates() { - List shortStates = new List(); - Collection columns = _grid.AllColumns; - for (int i = 0, count = columns.Count; i < count; i++) + bool defined = false; + + foreach (object state in _states) { - if (columns[i].PersistState) + if (state != null) { - shortStates.Add(States[i]); + defined = true; + break; } } - return shortStates.ToArray(); + + return defined; } + + /// + /// ָǰ״̬б + /// + /// + internal void RecoverStates(object[] states) + { + if (states == null || states.Length == 0) + { + Collection columns = _grid.AllColumns; + _states = new object[columns.Count]; + } + else + { + _states = states; + + // Ѿ˵ǰеStatesStatesָӦԪValueCheckBoxFieldGetColumnValueǴStatesȡֵ + int columnIndex = 0; + foreach (object state in _states) + { + if (state != null) + { + UpdateValuesAt(columnIndex); + } + + columnIndex++; + } + } + } + + ///// + ///// ǰ״̬б + ///// + ///// + //internal object[] ToShortStates() + //{ + // List shortStates = new List(); + // Collection columns = _grid.AllColumns; + // for (int i = 0, count = columns.Count; i < count; i++) + // { + // if (columns[i].PersistState) + // { + // shortStates.Add(States[i]); + // } + // } + // return shortStates.ToArray(); + //} + /// /// ָǰ״̬бͬʱӦValuesֵ /// /// internal void FromShortStates(object[] shortStates) { + if (shortStates == null || shortStates.Length == 0) + { + return; + } + Collection columns = _grid.AllColumns; States = new object[columns.Count]; int shortStateIndex = 0; @@ -328,6 +400,24 @@ namespace FineUI /// internal void DataBindRow() { + // DataIDField + if (!String.IsNullOrEmpty(Grid.DataIDField)) + { + RowID = GetPropertyValue(Grid.DataIDField).ToString(); + } + else + { + // δ DataIDFieldԶһ RowId + //RowID = GridRowIDManager.Instance.GetNextGridRowID(); + + // δ DataIDFieldԶһ RowId + // ʹ rowIndex װ RowIdҳطԱȽȶ + RowID = String.Format("frow{0}", RowIndex); + } + + + + foreach (GridTemplateContainer tplCtrl in TemplateContainers) { if (tplCtrl != null) diff --git a/FineUI/bin/Release/FineUI.dll b/FineUI/bin/Release/FineUI.dll deleted file mode 100644 index 076836213fc6c73b240bd41db198d1d0e04d27b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641024 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�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 diff --git a/FineUI/bin/Release/FineUI.xml b/FineUI/bin/Release/FineUI.xml deleted file mode 100644 index 47d050a..0000000 --- a/FineUI/bin/Release/FineUI.xml +++ /dev/null @@ -1,21256 +0,0 @@ - - - - FineUI - - - -

- 表单容器控件基类 - - - - - 可折叠面板控件基类(抽象类) - - - - - 面板控件基类(抽象类) - - - - - 容器控件基类(抽象类) - - - - - 控件基类(抽象类) - - - - - 控件基类(抽象类) - - - - - 控件基类(抽象类) - - - - - 构造函数 - - - - - 添加服务器AJAX属性 - - 属性列表 - - - - 添加客户端AJAX属性 - - 属性列表 - - - - 添加Gzip压缩属性 - - 属性列表 - - - - 标示是否初始化完成 - - - - - 页面初始化事件 - - - - - - 在备份初始化属性之前修改属性值 - - 此时对控件的属性做修改是安全的: - 1. 页面第一次加载时,运行到这里 ASPX 上面的标签已经初始化完毕 - 2. 页面回发时(包括正常回发或者AJAX回发),此时请求表单中 F_STATE 已经恢复完毕 - - - - - 重载 RenderControl,为了向子控件公开 RenderBeginTag 和 RenderEndTag 两个方法 - - 服务器控件输出流 - - - - 渲染控件的开始标签 - - 输出流 - - - - 渲染控件的结束标签 - - 输出流 - - - - 渲染 HTML 之前调用 - - - - - - 渲染 HTML 之前调用(计算被修改属性列表之前调用,可以在此修改属性) - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取FState的JS变量 - - - - - - 回发过程中此属性是否被改变 - 如果是客户端可以改变的属性,仅在服务器端改变时才返回 true, - (如果仅是客户端改变,则返回 false,因为客户端改变的属性不需要再输出相应的 JavaScript 脚本) - - - - - - - 回发过程中这些属性是否被改变 - 只要任何属性被改变,就返回 true - - - - - - - 从JObject恢复控件的属性 - - 对象属性的JObject形式 - - - - 将控件的属性列表转化为JObject对象 - - 属性列表 - 属性列表的JObject形式 - - - - AJAX 回发阶段,添加反映属性改变的 JavaScript 脚本 - - - - - - AJAX 回发阶段,添加反映属性改变的 JavaScript 脚本 - - - - - - 添加CSS样式 - - 键 - CSS内容 - - - - 删除CSS样式 - - 键 - - - - 向页面添加控件无关脚本 - - 客户端脚本 - - - - 向页面添加控件无关脚本 - - 客户端脚本 - 脚本层级 - - - - 添加控件相关脚本 - - 客户端脚本 - - - - 获取 Hidden 属性改变的 JavaScript 脚本 - 有些控件可能需要特别的逻辑,因此这里为虚函数(比如 Window 控件、Tab 控件) - - 客户端脚本 - - - - 获取 Enabled 属性改变的 JavaScript 脚本 - 有些控件可能需要特别的逻辑,因此这里为虚函数 - - 客户端脚本 - - - - 获取回发页面的客户端脚本(比如:__doPostBack('btnChangeEnable','');) - - 客户端脚本 - - - - 获取回发页面的客户端脚本(比如:__doPostBack('btnChangeEnable','true');) - - 事件参数 - 客户端脚本 - - - - 获取回发页面的客户端脚本(比如:__doPostBack('btnChangeEnable','true');) - - 事件参数 - 是否启用AJAX - 客户端脚本 - - - - 获取修改隐藏表单字段值的脚本(如果此隐藏表单字段不存在,则添加) - - 隐藏字段ID - 隐藏字段值 - - - - - 获取修改隐藏表单字段值的脚本(如果此隐藏表单字段不存在,则添加) - - 隐藏字段ID - 隐藏字段值 - 隐藏字段所在的页面对象(JavaScript实例window) - 客户端脚本 - - - - 添加Attributes中的属性值 - - HtmlNodeBuilder对象 - - - - 获取客户端事件处理函数 - - - - - - - - - 向 OB 中添加客户端事件处理函数 - - - - - - - - FState用来在服务器和客户端之间持久化控件状态。 - - - - - 目前Gzippped的属性支持JObject/JArray/String类型 - - - - - JavaScript中使用ID(比如:x0, x1) - - - - - 获取控件实例的JavaScript代码(比如:F('RegionPanel1_Button1')) - - - - - 是否向页面输出控件的外部容器(默认:true) - 否:只创建Javascript对象而不添加到页面中 - 是:创建Javascript对象,并添加到页面中,页面上添加占位符 - - - - - 参数对象创建器 - - - - - 从 HTTP 请求中恢复当前控件的状态 - 比如当前请求 Request.Form["F_STATE"] = {"btnClientClick":{"OnClientClick":"F.util.alert(\"This is an alert dialog\",\"\",Ext.MessageBox.INFO,'');"},"btnPressed":{"Pressed":false}} - 并且当前控件的 ClientID 是 "btnPressed",则返回值为 JObject 对象 {"Pressed":false} - - - - - 此控件所在的集合分组,只在BaseCollection中使用 - - - - - 不支持此属性(禁用控件默认的ViewState) - - - - - 控件的客户端ID(比如:RegionPanel1_Button1) - - - - - 控件外部容器的客户端ID(比如:Button1_wrapper) - - - - - 产品名称 - - - - - 产品版本 - - - - - HTML标签属性 - - - - - 控件ID - - - - - [AJAX属性]是否可用 - - - - - 指示控件是否被渲染出来(显示隐藏控件,请使用Hidden属性) - - - - - 只读属性,指示控件是否被渲染出来(显示隐藏控件,请使用Hidden属性) - - - - - [AJAX属性]是否隐藏控件 - - - - - 隐藏模式 - - - - - 是否启用AJAX - - - - - 是否启用FState压缩(默认为false) - - - - - 是否启用Ajax正在加载提示 - - - - - Ajax正在加载提示的类型 - - - - - 是否处于FineUI的AJAX回发过程 - - - - - 客户端事件列表 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 使控件获得焦点 - - - - - 使控件获得焦点,并选中控件中的文本内容 - - 是否选中控件中的文本内容 - - - - 使控件获得焦点,并选中控件中的文本内容 - - 是否选中控件中的文本内容 - 使控件获得焦点前延迟的毫秒数 - - - - 获得使控件获得焦点的脚本 - - JS脚本 - - - - 获得使控件获得焦点,并选中控件中的文本内容的脚本 - - 是否选中控件中的文本内容 - JS脚本 - - - - 获得使控件获得焦点,并选中控件中的文本内容的脚本 - - 是否选中控件中的文本内容 - 使控件获得焦点前延迟的毫秒数 - JS脚本 - - - - 为已经添加到OB中的Style增加新的样式 - 注意:这个key-value不会保存到属性CssStyle中 - - - - - - - 页面加载后立即获得焦点 - - - - - [AJAX属性]控件样式类名 - - - - - [AJAX属性]控件样式 - - - - - 外边距 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取当前控件的父容器 - - - - - - 宽度 - - - - - 高度 - - - - - 锚点值(当父容器的Layout=Anchor时有效) - - - - - 列的宽度(当父容器的Layout=Column时有效) - - - - - 行的宽度(当父容器的Layout=Row时有效) - - - - - 绝对定位的X坐标(当父容器的Layout=Absolute时有效) - - - - - 绝对定位的Y坐标(当父容器的Layout=Absolute时有效) - - - - - 表格列数(当父容器的Layout=Table时有效) - - - - - 表格合并行(当父容器的Layout=Table时有效) - - - - - 表格合并列(当父容器的Layout=Table时有效) - - - - - 控制子控件的位置(当本容器的Layout=VBox或者HBox时有效) - - - - - 控制子控件的位置(当本容器的Layout=VBox或者HBox时有效) - - - - - 内边距(当本容器的Layout=VBox或者HBox时有效) - - - - - 子控件的外边距(当本容器的Layout=VBox或者HBox时有效) - - - - - 控制子控件的尺寸(当父容器的Layout=VBox或者HBox时有效) - - - - - 是否显示分隔条 - - - - - 区域所在的位置 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 构造函数 - - - - - 渲染控件的开始标签 - - 输出流 - - - - 渲染控件的结束标签 - - 输出流 - - - - 创建子控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 刷新面板中的IFrame页面 - - - - - 获取刷新面板中IFrame页面的客户端脚本 - - 客户端脚本 - - - - 重置面板中所有字段 - - - - - 获取重置面板中所有字段的客户端脚本 - - - - - - 清空面板内表单字段的改变状态 - - 客户端脚本 - - - - 是否自动滚动 - - - - - 启用自定义的圆角边框 - - - - - 内容区域的样式 - - - - - 内容区域的内边距,字符串类型,可以设置上下左右的内边距,比如'0px 5px'或'5px 10px 2px 2px' - - - - - 是否显示边框 - - - - - 工具栏控件 - - - - - 子控件 - - - - - 子控件 - - - - - [AJAX属性]IFrame的地址 - - - - - IFrame的名称 - - - - - 是否启用IFrame - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 处理回发事件 - - 事件参数 - - - - 触发折叠事件 - - 事件参数 - - - - 触发展开事件 - - 事件参数 - - - - 是否启用折叠事件 - - - - - 是否启用展开事件 - - - - - 是否展开 - - - - - [AJAX属性]是否折叠 - - - - - 是否允许折叠 - - - - - [AJAX属性]标题 - - - - - 是否显示标题栏 - - - - - 图标地址 - - - - - 图标 - - - - - 折叠事件 - - - - - 展开事件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 标签的宽度 - - - - - 标签与字段的分隔符 - - - - - 距离右侧边界的宽度 - - - - - 标签的位置 - - - - - 表单中消息的位置 - - - - - 表单文本输入框字段基类(抽象类) - - - - - 表单文本输入框字段基类(抽象类) - - - - - 表单字段基类(抽象类) - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 重置此字段的值(比如用来清空FileUpload的内容) - - - - - 获取重置此字段的客户端脚本 - - - - - - 获取此字段值的客户端脚本(注意返回的脚本不带结束分号) - - 客户端脚本 - - - - 设置字段验证失败的提示信息 - - 提示信息 - - - - 清除验证失败的提示信息 - - - - - 获取字段验证失败提示信息的客户端脚本 - - 提示信息 - 客户端脚本 - - - - 获取清除验证失败提示信息的客户端脚本 - - 客户端脚本 - - - - 是否显示标签 - - - - - 是否显示空白的标签 - - - - - [AJAX属性]标签文本 - - - - - 在标签后面显示红色的星号(用来标识必填项) - - - - - [AJAX属性]表单控件的只读状态 - - - - - Tab按键的跳转顺序 - - - - - 表单中字段与标签的分隔符 - - - - - 距离右侧边界的宽度 - - - - - 标签的宽度 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 是否必填项 - - - - - 为空时提示信息 - - - - - 最大长度 - - - - - 超过最大长度时提示信息 - - - - - 最小长度 - - - - - 少于最小长度时提示信息 - - - - - RegexPattern - - - - - 正则表达式 - - - - - 不满足正则表达式时提示信息 - - - - - 正则表达式是否忽略大小写 - - - - - 需要比较的控件ID - - - - - 需要比较的值 - - - - - 比较操作符 - - - - - 比较的类型 - - - - - 不满足比较条件时提示信息 - - - - - 下一步获得焦点的控件(响应回车事件) - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发文本改变事件 - - 事件参数 - - - - 处理回发事件 - - 事件参数 - - - - 触发失去焦点事件 - - 事件参数 - - - - 文本框为空时显示的文本 - - - - - [AJAX属性]文本 - - - - - 是否自动回发(文本值改变) - - - - - 启用失去焦点事件 - - - - - 文本改变事件(需要启用AutoPostBack) - - - - - 失去焦点事件(需要启用EnableBlurEvent) - - - - - 客户端事件 - - - - - 构造函数 - - - - - 构造函数 - - 客户端事件名称 - 客户端事件处理函数名称 - - - - 客户端事件名称 - - - - - 客户端事件处理函数名称 - - - - - 客户端事件集合 - - - - - 获取客户端处理函数名称 - - 事件名称 - 客户端处理函数名称 - - - - 按钮类型 - - - - - 普通按钮(默认值) - - - - - 提交按钮(会为生成的input标签添加type="submit") - - - - - 重置按钮(会为生成的input标签添加type="reset") - - - - - 按钮类型名称 - - - - - 表格可编辑字段的类型 - - - - - 自动(默认值) - - - - - 字符串 - - - - - 整型 - - - - - 浮点数 - - - - - 布尔型 - - - - - 日期 - - - - - 表格可编辑字段的类型名称 - - - - - 表格可编辑字段渲染器 - - - - - 无(默认值) - - - - - 首字母大写 - - - - - 日期(RendererArgument来指定日期格式化字符串) - RendererArgument: - 1. d 月中的某一天。一位数的日期没有前导零。 - 2. dd 月中的某一天。一位数的日期有一个前导零。 - 3. ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。 - 4. dddd 周中某天的完整名称,在 DayNames 中定义。 - 5. M 月份数字。一位数的月份没有前导零。 - 6. MM 月份数字。一位数的月份有一个前导零。 - 7. MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。 - 8. MMMM 月份的完整名称,在 MonthNames 中定义。 - 9. y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 - 10. yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。 - 11. yyyy 包括纪元的四位数的年份。 - - - - - 截断字符串并添加省略号(RendererArgument来指定最大长度) - - - - - 文件大小 - - - - - HTML编码 - - - - - HTML解码 - - - - - 转化为小写字符 - - - - - 转化为大写字符 - - - - - 换行符转换为HTML标签
-
-
- - - 删除所有的脚本标签 - - - - - 删除所有的标签 - - - - - 清除字符串两端的空白字符 - - - - - 表格可编辑字段渲染器名称 - - - - - 表单客户端验证提示消息的类型 - - - - - 浮动提示(默认值) - - - - - 使用HTML标签的title属性 - - - - - 在字段下面通过一个div层来显示消息 - - - - - 在字段右侧显示一个错误图标 - - - - - 不显示错误信息 - - - - - 提示消息的类型名称 - - - - - 表格合计行的位置 - - - - - 紧跟数据行(默认值) - - - - - 表格顶部 - - - - - 表格底部 - - - - - 表格合计行的位置名称 - - - - - 工具栏的排列位置 - - - - - 靠右 - - - - - 靠左(默认值) - - - - - 居中 - - - - - 工具栏的排列位置名称 - - - - - FineUI控件的状态保持机制 - - - - - 构造函数 - - 控件 - - - - 增加在当前请求中改变的属性列表(控件可以自己手工设置,以便保存在 F_STATE 中) - - - - - - 备份初始化属性值 - 在输出 AJAX 回发之前,会拿这个初始属性值和当时属性值做对比,以确定这些属性是否被用户改变 - - - - - 备份 PostData 的属性值(也就是在客户端改变的属性值) - - - - - - 计算被修改的属性列表(更新 ModifiedProperties 和 ClientPropertiesModifiedInServer 两个值) - 这个需要在 OnPreRender 中调用,在页面第一次加载,正常的回发以及AJAX回发时都要调用 - - - - - 页面第一次加载至今改变过的属性列表总和(其中可能经历多次正常的页面回发和局部 AJAX 回发) - - - - - - 获取设置 FState 属性值 - - - - - - - 当前请求中改变的属性列表,既包含服务器端改变的属性,也包含客户端改变的属性 - - - - - 客户端可以改变的属性在服务器端被改变了 - - - - - Extjs和.Net之间的日期格式转换 - - - - - 创建Javascript的Date对象字符串 - - 日期对象 - 日期的客户端脚本形式 - - - - 将.Net日期格式字符串转换为ExtJS的日期格式字符串 - - .Net日期格式字符串 - ExtJS的日期格式字符串 - - - - 母版页ContentPlaceHolder控件的容器 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 取得第一个子控件 - - - - - - - 不向页面输出控件的外部容器 - - - - - 自定义事件参数 - - - - - 构造函数 - - 事件参数 - - - - 事件参数 - - - - - 复选框/单选框/复选框菜单按钮的事件参数 - - - - - 构造函数 - - 是否选中 - - - - 是否选中 - - - - - 树节点展开事件参数 - - - - - 构造函数 - - 树节点 - - - - 构造函数 - - 树节点 - 树节点的数据源 - - - - 树实例 - - - - - 树节点ID - - - - - 树节点的数据源 - - - - - 树节点预绑定事件参数 - - - - - 构造函数 - - 树节点的数据源 - - - - 是否取消添加本节点 - - - - - 树节点的数据源 - - - - - 控件集合 - - - - - 控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 向集合中插入一个元素 - - - - - - - 删除集合中的一个元素 - - - - - - 清空集合 - - - - - 获取类型 T 在父控件子集中的开始位置 - - - - - - 构造函数 - - 父控件实例 - - - - 控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 控件内部不允许存在非标签形式的字符串 - - - - - 不允许空白字符 - - - - - - 忽略游离于标签外的字符串 - - - - - - 支持页分析器生成控件及其包含的子控件 - - - - - 允许空白字符 - - - - - - 不忽略游离于标签外的字符串 - - - - - - 全局配置参数 - - - - - 初始化section对象,如果在Web.config中没有定义,则初始化为空对象 - - - - - Runtime Section - - - - - Refer:http://flimflan.com/blog/AccessingWebconfigAtDesignTimeInNET20.aspx - - - - - - - 主题 - - - - - 语言 - - - - - 表单中消息的位置 - - - - - 表单中标签的位置 - - - - - 表单中字段距离右侧的宽度 - - - - - 表单中字段标签的宽度 - - - - - 表单中字段与标签的分隔符 - - - - - AJAX超时时间(单位:秒,默认:60s) - - - - - 是否启用Ajax - - - - - 是否启用AJAX提示 - - - - - AJAX提示的类型 - - - - - DEBUG 模式 - - - - - 图标的根路径 - - - - - JS库的根路径 - - - - - 自定义样式的根路径 - - - - - 自定义样式的名称 - - - - - 是否启用FState压缩 - - - - - 是否向页面输出IE=edge标识 - - - - - 是否启用表单改变确认对话框 - - - - - 产品名称 - - - - - 当前版本 - - - - - 为设计时提供集合编辑器 - - - - - 构造函数 - - 控件类型 - - - - 获取此集合编辑器可包含的数据类型 - - 类型集合 - - - - 为设计时提供的菜单项集合编辑器 - - - - - 构造函数 - - 控件类型 - - - - 获取此集合编辑器可包含的数据类型 - - 类型集合 - - - - 为设计时提供的工具栏项集合编辑器 - - - - - 构造函数 - - 控件类型 - - - - 获取此集合编辑器可包含的数据类型 - - 类型集合 - - - - 为设计时提供的表格列编辑器集合编辑器 - - - - - 构造函数 - - 控件类型 - - - - 获取此集合编辑器可包含的数据类型 - - 类型集合 - - - - 相比较的数据类型(用于表单控件的客户端验证) - - - - - 浮点数 - - - - - 整形 - - - - - 字符串(默认值) - - - - - 隐藏的模式 - - - - - 通过设置CSS属性visibility来控制显示隐藏 - - - - - 通过设置CSS属性top/left来控制显示隐藏 - - - - - 通过设置CSS属性display来控制显示隐藏(默认值) - - - - - 隐藏的模式名称 - - - - - 预定义图标 - - - - - None - - - - - Accept - - - - - Add - - - - - Anchor - - - - - Application - - - - - ApplicationAdd - - - - - ApplicationCascade - - - - - ApplicationDelete - - - - - ApplicationDouble - - - - - ApplicationEdit - - - - - ApplicationError - - - - - ApplicationForm - - - - - ApplicationFormAdd - - - - - ApplicationFormDelete - - - - - ApplicationFormEdit - - - - - ApplicationFormMagnify - - - - - ApplicationGet - - - - - ApplicationGo - - - - - ApplicationHome - - - - - ApplicationKey - - - - - ApplicationLightning - - - - - ApplicationLink - - - - - ApplicationOsx - - - - - ApplicationOsxAdd - - - - - ApplicationOsxCascade - - - - - ApplicationOsxDelete - - - - - ApplicationOsxDouble - - - - - ApplicationOsxError - - - - - ApplicationOsxGet - - - - - ApplicationOsxGo - - - - - ApplicationOsxHome - - - - - ApplicationOsxKey - - - - - ApplicationOsxLightning - - - - - ApplicationOsxLink - - - - - ApplicationOsxSplit - - - - - ApplicationOsxStart - - - - - ApplicationOsxStop - - - - - ApplicationOsxTerminal - - - - - ApplicationPut - - - - - ApplicationSideBoxes - - - - - ApplicationSideContract - - - - - ApplicationSideExpand - - - - - ApplicationSideList - - - - - ApplicationSideTree - - - - - ApplicationSplit - - - - - ApplicationStart - - - - - ApplicationStop - - - - - ApplicationTileHorizontal - - - - - ApplicationTileVertical - - - - - ApplicationViewColumns - - - - - ApplicationViewDetail - - - - - ApplicationViewGallery - - - - - ApplicationViewIcons - - - - - ApplicationViewList - - - - - ApplicationViewTile - - - - - ApplicationXp - - - - - ApplicationXpTerminal - - - - - ArrowBranch - - - - - ArrowDivide - - - - - ArrowDown - - - - - ArrowEw - - - - - ArrowIn - - - - - ArrowInout - - - - - ArrowInLonger - - - - - ArrowJoin - - - - - ArrowLeft - - - - - ArrowMerge - - - - - ArrowNe - - - - - ArrowNs - - - - - ArrowNsew - - - - - ArrowNw - - - - - ArrowNwNeSwSe - - - - - ArrowNwSe - - - - - ArrowOut - - - - - ArrowOutLonger - - - - - ArrowRedo - - - - - ArrowRefresh - - - - - ArrowRefreshSmall - - - - - ArrowRight - - - - - ArrowRotateAnticlockwise - - - - - ArrowRotateClockwise - - - - - ArrowSe - - - - - ArrowSw - - - - - ArrowSwitch - - - - - ArrowSwitchBluegreen - - - - - ArrowSwNe - - - - - ArrowTurnLeft - - - - - ArrowTurnRight - - - - - ArrowUndo - - - - - ArrowUp - - - - - AsteriskOrange - - - - - AsteriskRed - - - - - AsteriskYellow - - - - - Attach - - - - - AwardStarAdd - - - - - AwardStarBronze1 - - - - - AwardStarBronze2 - - - - - AwardStarBronze3 - - - - - AwardStarDelete - - - - - AwardStarGold1 - - - - - AwardStarGold2 - - - - - AwardStarGold3 - - - - - AwardStarSilver1 - - - - - AwardStarSilver2 - - - - - AwardStarSilver3 - - - - - Basket - - - - - BasketAdd - - - - - BasketDelete - - - - - BasketEdit - - - - - BasketError - - - - - BasketGo - - - - - BasketPut - - - - - BasketRemove - - - - - Bell - - - - - BellAdd - - - - - BellDelete - - - - - BellError - - - - - BellGo - - - - - BellLink - - - - - BellSilver - - - - - BellSilverStart - - - - - BellSilverStop - - - - - BellStart - - - - - BellStop - - - - - Bin - - - - - BinClosed - - - - - BinEmpty - - - - - Blank - - - - - Bomb - - - - - Book - - - - - Bookmark - - - - - BookmarkAdd - - - - - BookmarkDelete - - - - - BookmarkEdit - - - - - BookmarkError - - - - - BookmarkGo - - - - - BookAdd - - - - - BookAddresses - - - - - BookAddressesAdd - - - - - BookAddressesDelete - - - - - BookAddressesEdit - - - - - BookAddressesError - - - - - BookAddressesKey - - - - - BookDelete - - - - - BookEdit - - - - - BookError - - - - - BookGo - - - - - BookKey - - - - - BookLink - - - - - BookMagnify - - - - - BookNext - - - - - BookOpen - - - - - BookOpenMark - - - - - BookPrevious - - - - - BookRed - - - - - BookTabs - - - - - BorderAll - - - - - BorderBottom - - - - - BorderDraw - - - - - BorderInner - - - - - BorderInnerHorizontal - - - - - BorderInnerVertical - - - - - BorderLeft - - - - - BorderNone - - - - - BorderOuter - - - - - BorderRight - - - - - BorderTop - - - - - Box - - - - - BoxError - - - - - BoxPicture - - - - - BoxWorld - - - - - Brick - - - - - Bricks - - - - - BrickAdd - - - - - BrickDelete - - - - - BrickEdit - - - - - BrickError - - - - - BrickGo - - - - - BrickLink - - - - - BrickMagnify - - - - - Briefcase - - - - - Bug - - - - - BugAdd - - - - - BugDelete - - - - - BugEdit - - - - - BugError - - - - - BugFix - - - - - BugGo - - - - - BugLink - - - - - BugMagnify - - - - - Build - - - - - Building - - - - - BuildingAdd - - - - - BuildingDelete - - - - - BuildingEdit - - - - - BuildingError - - - - - BuildingGo - - - - - BuildingKey - - - - - BuildingLink - - - - - BuildCancel - - - - - BulletAdd - - - - - BulletArrowBottom - - - - - BulletArrowDown - - - - - BulletArrowTop - - - - - BulletArrowUp - - - - - BulletBlack - - - - - BulletBlue - - - - - BulletConnect - - - - - BulletCross - - - - - BulletDatabase - - - - - BulletDatabaseYellow - - - - - BulletDelete - - - - - BulletDisk - - - - - BulletEarth - - - - - BulletEdit - - - - - BulletEject - - - - - BulletError - - - - - BulletFeed - - - - - BulletGet - - - - - BulletGo - - - - - BulletGreen - - - - - BulletHome - - - - - BulletKey - - - - - BulletLeft - - - - - BulletLightning - - - - - BulletMagnify - - - - - BulletMinus - - - - - BulletOrange - - - - - BulletPageWhite - - - - - BulletPicture - - - - - BulletPink - - - - - BulletPlus - - - - - BulletPurple - - - - - BulletRed - - - - - BulletRight - - - - - BulletShape - - - - - BulletSparkle - - - - - BulletStar - - - - - BulletStart - - - - - BulletStop - - - - - BulletStopAlt - - - - - BulletTick - - - - - BulletToggleMinus - - - - - BulletTogglePlus - - - - - BulletWhite - - - - - BulletWrench - - - - - BulletWrenchRed - - - - - BulletYellow - - - - - Button - - - - - Cake - - - - - CakeOut - - - - - CakeSliced - - - - - Calculator - - - - - CalculatorAdd - - - - - CalculatorDelete - - - - - CalculatorEdit - - - - - CalculatorError - - - - - CalculatorLink - - - - - Calendar - - - - - CalendarAdd - - - - - CalendarDelete - - - - - CalendarEdit - - - - - CalendarLink - - - - - CalendarSelectDay - - - - - CalendarSelectNone - - - - - CalendarSelectWeek - - - - - CalendarStar - - - - - CalendarViewDay - - - - - CalendarViewMonth - - - - - CalendarViewWeek - - - - - Camera - - - - - CameraAdd - - - - - CameraConnect - - - - - CameraDelete - - - - - CameraEdit - - - - - CameraError - - - - - CameraGo - - - - - CameraLink - - - - - CameraMagnify - - - - - CameraPicture - - - - - CameraSmall - - - - - CameraStart - - - - - CameraStop - - - - - Cancel - - - - - Car - - - - - Cart - - - - - CartAdd - - - - - CartDelete - - - - - CartEdit - - - - - CartError - - - - - CartFull - - - - - CartGo - - - - - CartMagnify - - - - - CartPut - - - - - CartRemove - - - - - CarAdd - - - - - CarDelete - - - - - CarError - - - - - CarRed - - - - - CarStart - - - - - CarStop - - - - - Cd - - - - - Cdr - - - - - CdrAdd - - - - - CdrBurn - - - - - CdrCross - - - - - CdrDelete - - - - - CdrEdit - - - - - CdrEject - - - - - CdrError - - - - - CdrGo - - - - - CdrMagnify - - - - - CdrPlay - - - - - CdrStart - - - - - CdrStop - - - - - CdrStopAlt - - - - - CdrTick - - - - - CdAdd - - - - - CdBurn - - - - - CdDelete - - - - - CdEdit - - - - - CdEject - - - - - CdGo - - - - - CdMagnify - - - - - CdPlay - - - - - CdStop - - - - - CdStopAlt - - - - - CdTick - - - - - ChartBar - - - - - ChartBarAdd - - - - - ChartBarDelete - - - - - ChartBarEdit - - - - - ChartBarError - - - - - ChartBarLink - - - - - ChartCurve - - - - - ChartCurveAdd - - - - - ChartCurveDelete - - - - - ChartCurveEdit - - - - - ChartCurveError - - - - - ChartCurveGo - - - - - ChartCurveLink - - - - - ChartLine - - - - - ChartLineAdd - - - - - ChartLineDelete - - - - - ChartLineEdit - - - - - ChartLineError - - - - - ChartLineLink - - - - - ChartOrganisation - - - - - ChartOrganisationAdd - - - - - ChartOrganisationDelete - - - - - ChartOrgInverted - - - - - ChartPie - - - - - ChartPieAdd - - - - - ChartPieDelete - - - - - ChartPieEdit - - - - - ChartPieError - - - - - ChartPieLightning - - - - - ChartPieLink - - - - - CheckError - - - - - Clipboard - - - - - Clock - - - - - ClockAdd - - - - - ClockDelete - - - - - ClockEdit - - - - - ClockError - - - - - ClockGo - - - - - ClockLink - - - - - ClockPause - - - - - ClockPlay - - - - - ClockRed - - - - - ClockStart - - - - - ClockStop - - - - - ClockStop2 - - - - - Cmy - - - - - Cog - - - - - CogAdd - - - - - CogDelete - - - - - CogEdit - - - - - CogError - - - - - CogGo - - - - - CogStart - - - - - CogStop - - - - - Coins - - - - - CoinsAdd - - - - - CoinsDelete - - - - - Color - - - - - ColorSwatch - - - - - ColorWheel - - - - - Comment - - - - - Comments - - - - - CommentsAdd - - - - - CommentsDelete - - - - - CommentAdd - - - - - CommentDelete - - - - - CommentDull - - - - - CommentEdit - - - - - CommentPlay - - - - - CommentRecord - - - - - Compass - - - - - Compress - - - - - Computer - - - - - ComputerAdd - - - - - ComputerConnect - - - - - ComputerDelete - - - - - ComputerEdit - - - - - ComputerError - - - - - ComputerGo - - - - - ComputerKey - - - - - ComputerLink - - - - - ComputerMagnify - - - - - ComputerOff - - - - - ComputerStart - - - - - ComputerStop - - - - - ComputerWrench - - - - - Connect - - - - - Contrast - - - - - ContrastDecrease - - - - - ContrastHigh - - - - - ContrastIncrease - - - - - ContrastLow - - - - - Controller - - - - - ControllerAdd - - - - - ControllerDelete - - - - - ControllerError - - - - - ControlAdd - - - - - ControlAddBlue - - - - - ControlBlank - - - - - ControlBlankBlue - - - - - ControlEject - - - - - ControlEjectBlue - - - - - ControlEnd - - - - - ControlEndBlue - - - - - ControlEqualizer - - - - - ControlEqualizerBlue - - - - - ControlFastforward - - - - - ControlFastforwardBlue - - - - - ControlPause - - - - - ControlPauseBlue - - - - - ControlPlay - - - - - ControlPlayBlue - - - - - ControlPower - - - - - ControlPowerBlue - - - - - ControlRecord - - - - - ControlRecordBlue - - - - - ControlRemove - - - - - ControlRemoveBlue - - - - - ControlRepeat - - - - - ControlRepeatBlue - - - - - ControlRewind - - - - - ControlRewindBlue - - - - - ControlStart - - - - - ControlStartBlue - - - - - ControlStop - - - - - ControlStopBlue - - - - - Creditcards - - - - - Cross - - - - - Css - - - - - CssAdd - - - - - CssDelete - - - - - CssError - - - - - CssGo - - - - - CssValid - - - - - Cup - - - - - CupAdd - - - - - CupBlack - - - - - CupDelete - - - - - CupEdit - - - - - CupError - - - - - CupGo - - - - - CupGreen - - - - - CupKey - - - - - CupLink - - - - - CupTea - - - - - Cursor - - - - - CursorSmall - - - - - Cut - - - - - CutRed - - - - - Database - - - - - DatabaseAdd - - - - - DatabaseConnect - - - - - DatabaseCopy - - - - - DatabaseDelete - - - - - DatabaseEdit - - - - - DatabaseError - - - - - DatabaseGear - - - - - DatabaseGo - - - - - DatabaseKey - - - - - DatabaseLightning - - - - - DatabaseLink - - - - - DatabaseRefresh - - - - - DatabaseSave - - - - - DatabaseStart - - - - - DatabaseStop - - - - - DatabaseTable - - - - - DatabaseWrench - - - - - DatabaseYellow - - - - - DatabaseYellowStart - - - - - DatabaseYellowStop - - - - - Date - - - - - DateAdd - - - - - DateDelete - - - - - DateEdit - - - - - DateError - - - - - DateGo - - - - - DateLink - - - - - DateMagnify - - - - - DateNext - - - - - DatePrevious - - - - - Decline - - - - - Delete - - - - - DeviceStylus - - - - - Disconnect - - - - - Disk - - - - - DiskBlack - - - - - DiskBlackError - - - - - DiskBlackMagnify - - - - - DiskDownload - - - - - DiskEdit - - - - - DiskError - - - - - DiskMagnify - - - - - DiskMultiple - - - - - DiskUpload - - - - - Door - - - - - DoorError - - - - - DoorIn - - - - - DoorOpen - - - - - DoorOut - - - - - Drink - - - - - DrinkEmpty - - - - - DrinkRed - - - - - Drive - - - - - DriveAdd - - - - - DriveBurn - - - - - DriveCd - - - - - DriveCdr - - - - - DriveCdEmpty - - - - - DriveDelete - - - - - DriveDisk - - - - - DriveEdit - - - - - DriveError - - - - - DriveGo - - - - - DriveKey - - - - - DriveLink - - - - - DriveMagnify - - - - - DriveNetwork - - - - - DriveNetworkError - - - - - DriveNetworkStop - - - - - DriveRename - - - - - DriveUser - - - - - DriveWeb - - - - - Dvd - - - - - DvdAdd - - - - - DvdDelete - - - - - DvdEdit - - - - - DvdError - - - - - DvdGo - - - - - DvdKey - - - - - DvdLink - - - - - DvdStart - - - - - DvdStop - - - - - EjectBlue - - - - - EjectGreen - - - - - Email - - - - - EmailAdd - - - - - EmailAttach - - - - - EmailDelete - - - - - EmailEdit - - - - - EmailError - - - - - EmailGo - - - - - EmailLink - - - - - EmailMagnify - - - - - EmailOpen - - - - - EmailOpenImage - - - - - EmailStar - - - - - EmailStart - - - - - EmailStop - - - - - EmailTransfer - - - - - EmoticonEvilgrin - - - - - EmoticonGrin - - - - - EmoticonHappy - - - - - EmoticonSmile - - - - - EmoticonSurprised - - - - - EmoticonTongue - - - - - EmoticonUnhappy - - - - - EmoticonWaii - - - - - EmoticonWink - - - - - Erase - - - - - Error - - - - - ErrorAdd - - - - - ErrorDelete - - - - - ErrorGo - - - - - Exclamation - - - - - Eye - - - - - Eyes - - - - - Feed - - - - - FeedAdd - - - - - FeedDelete - - - - - FeedDisk - - - - - FeedEdit - - - - - FeedError - - - - - FeedGo - - - - - FeedKey - - - - - FeedLink - - - - - FeedMagnify - - - - - FeedStar - - - - - Female - - - - - Film - - - - - FilmAdd - - - - - FilmDelete - - - - - FilmEdit - - - - - FilmEject - - - - - FilmError - - - - - FilmGo - - - - - FilmKey - - - - - FilmLink - - - - - FilmMagnify - - - - - FilmSave - - - - - FilmStar - - - - - FilmStart - - - - - FilmStop - - - - - Find - - - - - FingerPoint - - - - - FlagAd - - - - - FlagAe - - - - - FlagAf - - - - - FlagAg - - - - - FlagAi - - - - - FlagAl - - - - - FlagAm - - - - - FlagAn - - - - - FlagAo - - - - - FlagAr - - - - - FlagAs - - - - - FlagAt - - - - - FlagAu - - - - - FlagAw - - - - - FlagAx - - - - - FlagAz - - - - - FlagBa - - - - - FlagBb - - - - - FlagBd - - - - - FlagBe - - - - - FlagBf - - - - - FlagBg - - - - - FlagBh - - - - - FlagBi - - - - - FlagBj - - - - - FlagBlack - - - - - FlagBlue - - - - - FlagBm - - - - - FlagBn - - - - - FlagBo - - - - - FlagBr - - - - - FlagBs - - - - - FlagBt - - - - - FlagBv - - - - - FlagBw - - - - - FlagBy - - - - - FlagBz - - - - - FlagCa - - - - - FlagCatalonia - - - - - FlagCc - - - - - FlagCd - - - - - FlagCf - - - - - FlagCg - - - - - FlagCh - - - - - FlagChecked - - - - - FlagCi - - - - - FlagCk - - - - - FlagCl - - - - - FlagCm - - - - - FlagCn - - - - - FlagCo - - - - - FlagCr - - - - - FlagCs - - - - - FlagCu - - - - - FlagCv - - - - - FlagCx - - - - - FlagCy - - - - - FlagCz - - - - - FlagDe - - - - - FlagDj - - - - - FlagDk - - - - - FlagDm - - - - - FlagDo - - - - - FlagDz - - - - - FlagEc - - - - - FlagEe - - - - - FlagEg - - - - - FlagEh - - - - - FlagEngland - - - - - FlagEr - - - - - FlagEs - - - - - FlagEt - - - - - FlagEuropeanunion - - - - - FlagFam - - - - - FlagFi - - - - - FlagFj - - - - - FlagFk - - - - - FlagFm - - - - - FlagFo - - - - - FlagFr - - - - - FlagFrance - - - - - FlagGa - - - - - FlagGb - - - - - FlagGd - - - - - FlagGe - - - - - FlagGf - - - - - FlagGg - - - - - FlagGh - - - - - FlagGi - - - - - FlagGl - - - - - FlagGm - - - - - FlagGn - - - - - FlagGp - - - - - FlagGq - - - - - FlagGr - - - - - FlagGreen - - - - - FlagGrey - - - - - FlagGs - - - - - FlagGt - - - - - FlagGu - - - - - FlagGw - - - - - FlagGy - - - - - FlagHk - - - - - FlagHm - - - - - FlagHn - - - - - FlagHr - - - - - FlagHt - - - - - FlagHu - - - - - FlagId - - - - - FlagIe - - - - - FlagIl - - - - - FlagIn - - - - - FlagIo - - - - - FlagIq - - - - - FlagIr - - - - - FlagIs - - - - - FlagIt - - - - - FlagJm - - - - - FlagJo - - - - - FlagJp - - - - - FlagKe - - - - - FlagKg - - - - - FlagKh - - - - - FlagKi - - - - - FlagKm - - - - - FlagKn - - - - - FlagKp - - - - - FlagKr - - - - - FlagKw - - - - - FlagKy - - - - - FlagKz - - - - - FlagLa - - - - - FlagLb - - - - - FlagLc - - - - - FlagLi - - - - - FlagLk - - - - - FlagLr - - - - - FlagLs - - - - - FlagLt - - - - - FlagLu - - - - - FlagLv - - - - - FlagLy - - - - - FlagMa - - - - - FlagMc - - - - - FlagMd - - - - - FlagMe - - - - - FlagMg - - - - - FlagMh - - - - - FlagMk - - - - - FlagMl - - - - - FlagMm - - - - - FlagMn - - - - - FlagMo - - - - - FlagMp - - - - - FlagMq - - - - - FlagMr - - - - - FlagMs - - - - - FlagMt - - - - - FlagMu - - - - - FlagMv - - - - - FlagMw - - - - - FlagMx - - - - - FlagMy - - - - - FlagMz - - - - - FlagNa - - - - - FlagNc - - - - - FlagNe - - - - - FlagNf - - - - - FlagNg - - - - - FlagNi - - - - - FlagNl - - - - - FlagNo - - - - - FlagNp - - - - - FlagNr - - - - - FlagNu - - - - - FlagNz - - - - - FlagOm - - - - - FlagOrange - - - - - FlagPa - - - - - FlagPe - - - - - FlagPf - - - - - FlagPg - - - - - FlagPh - - - - - FlagPink - - - - - FlagPk - - - - - FlagPl - - - - - FlagPm - - - - - FlagPn - - - - - FlagPr - - - - - FlagPs - - - - - FlagPt - - - - - FlagPurple - - - - - FlagPw - - - - - FlagPy - - - - - FlagQa - - - - - FlagRe - - - - - FlagRed - - - - - FlagRo - - - - - FlagRs - - - - - FlagRu - - - - - FlagRw - - - - - FlagSa - - - - - FlagSb - - - - - FlagSc - - - - - FlagScotland - - - - - FlagSd - - - - - FlagSe - - - - - FlagSg - - - - - FlagSh - - - - - FlagSi - - - - - FlagSj - - - - - FlagSk - - - - - FlagSl - - - - - FlagSm - - - - - FlagSn - - - - - FlagSo - - - - - FlagSr - - - - - FlagSt - - - - - FlagSv - - - - - FlagSy - - - - - FlagSz - - - - - FlagTc - - - - - FlagTd - - - - - FlagTf - - - - - FlagTg - - - - - FlagTh - - - - - FlagTj - - - - - FlagTk - - - - - FlagTl - - - - - FlagTm - - - - - FlagTn - - - - - FlagTo - - - - - FlagTr - - - - - FlagTt - - - - - FlagTv - - - - - FlagTw - - - - - FlagTz - - - - - FlagUa - - - - - FlagUg - - - - - FlagUm - - - - - FlagUs - - - - - FlagUy - - - - - FlagUz - - - - - FlagVa - - - - - FlagVc - - - - - FlagVe - - - - - FlagVg - - - - - FlagVi - - - - - FlagVn - - - - - FlagVu - - - - - FlagWales - - - - - FlagWf - - - - - FlagWhite - - - - - FlagWs - - - - - FlagYe - - - - - FlagYellow - - - - - FlagYt - - - - - FlagZa - - - - - FlagZm - - - - - FlagZw - - - - - FlowerDaisy - - - - - Folder - - - - - FolderAdd - - - - - FolderBell - - - - - FolderBookmark - - - - - FolderBrick - - - - - FolderBug - - - - - FolderCamera - - - - - FolderConnect - - - - - FolderDatabase - - - - - FolderDelete - - - - - FolderEdit - - - - - FolderError - - - - - FolderExplore - - - - - FolderFeed - - - - - FolderFilm - - - - - FolderFind - - - - - FolderFont - - - - - FolderGo - - - - - FolderHeart - - - - - FolderHome - - - - - FolderImage - - - - - FolderKey - - - - - FolderLightbulb - - - - - FolderLink - - - - - FolderMagnify - - - - - FolderPage - - - - - FolderPageWhite - - - - - FolderPalette - - - - - FolderPicture - - - - - FolderStar - - - - - FolderTable - - - - - FolderUp - - - - - FolderUser - - - - - FolderWrench - - - - - Font - - - - - FontAdd - - - - - FontColor - - - - - FontDelete - - - - - FontGo - - - - - FontLarger - - - - - FontSmaller - - - - - ForwardBlue - - - - - ForwardGreen - - - - - Group - - - - - GroupAdd - - - - - GroupDelete - - - - - GroupEdit - - - - - GroupError - - - - - GroupGear - - - - - GroupGo - - - - - GroupKey - - - - - GroupLink - - - - - Heart - - - - - HeartAdd - - - - - HeartBroken - - - - - HeartConnect - - - - - HeartDelete - - - - - Help - - - - - Hourglass - - - - - HourglassAdd - - - - - HourglassDelete - - - - - HourglassGo - - - - - HourglassLink - - - - - House - - - - - HouseConnect - - - - - HouseGo - - - - - HouseKey - - - - - HouseLink - - - - - HouseStar - - - - - Html - - - - - HtmlAdd - - - - - HtmlDelete - - - - - HtmlError - - - - - HtmlGo - - - - - HtmlValid - - - - - Image - - - - - Images - - - - - ImageAdd - - - - - ImageDelete - - - - - ImageEdit - - - - - ImageLink - - - - - ImageMagnify - - - - - ImageStar - - - - - Information - - - - - Ipod - - - - - IpodCast - - - - - IpodCastAdd - - - - - IpodCastDelete - - - - - IpodConnect - - - - - IpodNano - - - - - IpodNanoConnect - - - - - IpodSound - - - - - Joystick - - - - - JoystickAdd - - - - - JoystickConnect - - - - - JoystickDelete - - - - - JoystickError - - - - - Key - - - - - Keyboard - - - - - KeyboardAdd - - - - - KeyboardConnect - - - - - KeyboardDelete - - - - - KeyboardMagnify - - - - - KeyAdd - - - - - KeyDelete - - - - - KeyGo - - - - - KeyStart - - - - - KeyStop - - - - - Laptop - - - - - LaptopAdd - - - - - LaptopConnect - - - - - LaptopDelete - - - - - LaptopDisk - - - - - LaptopEdit - - - - - LaptopError - - - - - LaptopGo - - - - - LaptopKey - - - - - LaptopLink - - - - - LaptopMagnify - - - - - LaptopStart - - - - - LaptopStop - - - - - LaptopWrench - - - - - Layers - - - - - Layout - - - - - LayoutAdd - - - - - LayoutContent - - - - - LayoutDelete - - - - - LayoutEdit - - - - - LayoutError - - - - - LayoutHeader - - - - - LayoutKey - - - - - LayoutLightning - - - - - LayoutLink - - - - - LayoutSidebar - - - - - Lightbulb - - - - - LightbulbAdd - - - - - LightbulbDelete - - - - - LightbulbOff - - - - - Lightning - - - - - LightningAdd - - - - - LightningDelete - - - - - LightningGo - - - - - Link - - - - - LinkAdd - - - - - LinkBreak - - - - - LinkDelete - - - - - LinkEdit - - - - - LinkError - - - - - LinkGo - - - - - Lock - - - - - LockAdd - - - - - LockBreak - - - - - LockDelete - - - - - LockEdit - - - - - LockGo - - - - - LockKey - - - - - LockOpen - - - - - LockStart - - - - - LockStop - - - - - Lorry - - - - - LorryAdd - - - - - LorryDelete - - - - - LorryError - - - - - LorryFlatbed - - - - - LorryGo - - - - - LorryLink - - - - - LorryStart - - - - - LorryStop - - - - - MagifierZoomOut - - - - - Magnifier - - - - - MagnifierZoomIn - - - - - Mail - - - - - Male - - - - - Map - - - - - MapAdd - - - - - MapClipboard - - - - - MapCursor - - - - - MapDelete - - - - - MapEdit - - - - - MapError - - - - - MapGo - - - - - MapLink - - - - - MapMagnify - - - - - MapStart - - - - - MapStop - - - - - MedalBronze1 - - - - - MedalBronze2 - - - - - MedalBronze3 - - - - - MedalBronzeAdd - - - - - MedalBronzeDelete - - - - - MedalGold1 - - - - - MedalGold2 - - - - - MedalGold3 - - - - - MedalGoldAdd - - - - - MedalGoldDelete - - - - - MedalSilver1 - - - - - MedalSilver2 - - - - - MedalSilver3 - - - - - MedalSilverAdd - - - - - MedalSilverDelete - - - - - Money - - - - - MoneyAdd - - - - - MoneyDelete - - - - - MoneyDollar - - - - - MoneyEuro - - - - - MoneyPound - - - - - MoneyYen - - - - - Monitor - - - - - MonitorAdd - - - - - MonitorDelete - - - - - MonitorEdit - - - - - MonitorError - - - - - MonitorGo - - - - - MonitorKey - - - - - MonitorLightning - - - - - MonitorLink - - - - - MoonFull - - - - - Mouse - - - - - MouseAdd - - - - - MouseDelete - - - - - MouseError - - - - - Music - - - - - MusicNote - - - - - Neighbourhood - - - - - New - - - - - Newspaper - - - - - NewspaperAdd - - - - - NewspaperDelete - - - - - NewspaperGo - - - - - NewspaperLink - - - - - NewBlue - - - - - NewRed - - - - - NextBlue - - - - - NextGreen - - - - - Note - - - - - NoteAdd - - - - - NoteDelete - - - - - NoteEdit - - - - - NoteError - - - - - NoteGo - - - - - Outline - - - - - Overlays - - - - - Package - - - - - PackageAdd - - - - - PackageDelete - - - - - PackageDown - - - - - PackageGo - - - - - PackageGreen - - - - - PackageIn - - - - - PackageLink - - - - - PackageSe - - - - - PackageStart - - - - - PackageStop - - - - - PackageWhite - - - - - Page - - - - - PageAdd - - - - - PageAttach - - - - - PageBack - - - - - PageBreak - - - - - PageBreakInsert - - - - - PageCancel - - - - - PageCode - - - - - PageCopy - - - - - PageDelete - - - - - PageEdit - - - - - PageError - - - - - PageExcel - - - - - PageFind - - - - - PageForward - - - - - PageGear - - - - - PageGo - - - - - PageGreen - - - - - PageHeaderFooter - - - - - PageKey - - - - - PageLandscape - - - - - PageLandscapeShot - - - - - PageLightning - - - - - PageLink - - - - - PageMagnify - - - - - PagePaintbrush - - - - - PagePaste - - - - - PagePortrait - - - - - PagePortraitShot - - - - - PageRed - - - - - PageRefresh - - - - - PageSave - - - - - PageWhite - - - - - PageWhiteAcrobat - - - - - PageWhiteActionscript - - - - - PageWhiteAdd - - - - - PageWhiteBreak - - - - - PageWhiteC - - - - - PageWhiteCamera - - - - - PageWhiteCd - - - - - PageWhiteCdr - - - - - PageWhiteCode - - - - - PageWhiteCodeRed - - - - - PageWhiteColdfusion - - - - - PageWhiteCompressed - - - - - PageWhiteConnect - - - - - PageWhiteCopy - - - - - PageWhiteCplusplus - - - - - PageWhiteCsharp - - - - - PageWhiteCup - - - - - PageWhiteDatabase - - - - - PageWhiteDatabaseYellow - - - - - PageWhiteDelete - - - - - PageWhiteDvd - - - - - PageWhiteEdit - - - - - PageWhiteError - - - - - PageWhiteExcel - - - - - PageWhiteFind - - - - - PageWhiteFlash - - - - - PageWhiteFont - - - - - PageWhiteFreehand - - - - - PageWhiteGear - - - - - PageWhiteGet - - - - - PageWhiteGo - - - - - PageWhiteH - - - - - PageWhiteHorizontal - - - - - PageWhiteKey - - - - - PageWhiteLightning - - - - - PageWhiteLink - - - - - PageWhiteMagnify - - - - - PageWhiteMedal - - - - - PageWhiteOffice - - - - - PageWhitePaint - - - - - PageWhitePaintbrush - - - - - PageWhitePaint2 - - - - - PageWhitePaste - - - - - PageWhitePasteTable - - - - - PageWhitePhp - - - - - PageWhitePicture - - - - - PageWhitePowerpoint - - - - - PageWhitePut - - - - - PageWhiteRefresh - - - - - PageWhiteRuby - - - - - PageWhiteSideBySide - - - - - PageWhiteStack - - - - - PageWhiteStar - - - - - PageWhiteSwoosh - - - - - PageWhiteText - - - - - PageWhiteTextWidth - - - - - PageWhiteTux - - - - - PageWhiteVector - - - - - PageWhiteVisualstudio - - - - - PageWhiteWidth - - - - - PageWhiteWord - - - - - PageWhiteWorld - - - - - PageWhiteWrench - - - - - PageWhiteZip - - - - - PageWord - - - - - PageWorld - - - - - Paint - - - - - Paintbrush - - - - - PaintbrushColor - - - - - Paintcan - - - - - PaintcanRed - - - - - PaintCanBrush - - - - - Palette - - - - - PastePlain - - - - - PasteWord - - - - - PauseBlue - - - - - PauseGreen - - - - - PauseRecord - - - - - Pencil - - - - - PencilAdd - - - - - PencilDelete - - - - - PencilGo - - - - - Phone - - - - - PhoneAdd - - - - - PhoneDelete - - - - - PhoneEdit - - - - - PhoneError - - - - - PhoneGo - - - - - PhoneKey - - - - - PhoneLink - - - - - PhoneSound - - - - - PhoneStart - - - - - PhoneStop - - - - - Photo - - - - - Photos - - - - - PhotoAdd - - - - - PhotoDelete - - - - - PhotoEdit - - - - - PhotoLink - - - - - PhotoPaint - - - - - Picture - - - - - Pictures - - - - - PicturesThumbs - - - - - PictureAdd - - - - - PictureClipboard - - - - - PictureDelete - - - - - PictureEdit - - - - - PictureEmpty - - - - - PictureError - - - - - PictureGo - - - - - PictureKey - - - - - PictureLink - - - - - PictureSave - - - - - Pilcrow - - - - - Pill - - - - - PillAdd - - - - - PillDelete - - - - - PillError - - - - - PillGo - - - - - PlayBlue - - - - - PlayGreen - - - - - Plugin - - - - - PluginAdd - - - - - PluginDelete - - - - - PluginDisabled - - - - - PluginEdit - - - - - PluginError - - - - - PluginGo - - - - - PluginKey - - - - - PluginLink - - - - - PreviousGreen - - - - - Printer - - - - - PrinterAdd - - - - - PrinterCancel - - - - - PrinterColor - - - - - PrinterConnect - - - - - PrinterDelete - - - - - PrinterEmpty - - - - - PrinterError - - - - - PrinterGo - - - - - PrinterKey - - - - - PrinterMono - - - - - PrinterStart - - - - - PrinterStop - - - - - Rainbow - - - - - RainbowStar - - - - - RecordBlue - - - - - RecordGreen - - - - - RecordRed - - - - - Reload - - - - - Report - - - - - ReportAdd - - - - - ReportDelete - - - - - ReportDisk - - - - - ReportEdit - - - - - ReportGo - - - - - ReportKey - - - - - ReportLink - - - - - ReportMagnify - - - - - ReportPicture - - - - - ReportStart - - - - - ReportStop - - - - - ReportUser - - - - - ReportWord - - - - - ResultsetFirst - - - - - ResultsetLast - - - - - ResultsetNext - - - - - ResultsetPrevious - - - - - ReverseBlue - - - - - ReverseGreen - - - - - RewindBlue - - - - - RewindGreen - - - - - Rgb - - - - - Rosette - - - - - RosetteBlue - - - - - Rss - - - - - RssAdd - - - - - RssDelete - - - - - RssError - - - - - RssGo - - - - - RssValid - - - - - Ruby - - - - - RubyAdd - - - - - RubyDelete - - - - - RubyGear - - - - - RubyGet - - - - - RubyGo - - - - - RubyKey - - - - - RubyLink - - - - - RubyPut - - - - - Script - - - - - ScriptAdd - - - - - ScriptCode - - - - - ScriptCodeOriginal - - - - - ScriptCodeRed - - - - - ScriptDelete - - - - - ScriptEdit - - - - - ScriptError - - - - - ScriptGear - - - - - ScriptGo - - - - - ScriptKey - - - - - ScriptLightning - - - - - ScriptLink - - - - - ScriptPalette - - - - - ScriptSave - - - - - ScriptStart - - - - - ScriptStop - - - - - Seasons - - - - - SectionCollapsed - - - - - SectionExpanded - - - - - Server - - - - - ServerAdd - - - - - ServerChart - - - - - ServerCompressed - - - - - ServerConnect - - - - - ServerDatabase - - - - - ServerDelete - - - - - ServerEdit - - - - - ServerError - - - - - ServerGo - - - - - ServerKey - - - - - ServerLightning - - - - - ServerLink - - - - - ServerStart - - - - - ServerStop - - - - - ServerUncompressed - - - - - ServerWrench - - - - - Shading - - - - - ShapesMany - - - - - ShapesManySelect - - - - - Shape3d - - - - - ShapeAlignBottom - - - - - ShapeAlignCenter - - - - - ShapeAlignLeft - - - - - ShapeAlignMiddle - - - - - ShapeAlignRight - - - - - ShapeAlignTop - - - - - ShapeFlipHorizontal - - - - - ShapeFlipVertical - - - - - ShapeGroup - - - - - ShapeHandles - - - - - ShapeMoveBack - - - - - ShapeMoveBackwards - - - - - ShapeMoveForwards - - - - - ShapeMoveFront - - - - - ShapeRotateAnticlockwise - - - - - ShapeRotateClockwise - - - - - ShapeShadeA - - - - - ShapeShadeB - - - - - ShapeShadeC - - - - - ShapeShadow - - - - - ShapeShadowToggle - - - - - ShapeSquare - - - - - ShapeSquareAdd - - - - - ShapeSquareDelete - - - - - ShapeSquareEdit - - - - - ShapeSquareError - - - - - ShapeSquareGo - - - - - ShapeSquareKey - - - - - ShapeSquareLink - - - - - ShapeSquareSelect - - - - - ShapeUngroup - - - - - Share - - - - - Shield - - - - - ShieldAdd - - - - - ShieldDelete - - - - - ShieldError - - - - - ShieldGo - - - - - ShieldRainbow - - - - - ShieldSilver - - - - - ShieldStart - - - - - ShieldStop - - - - - Sitemap - - - - - SitemapColor - - - - - Smartphone - - - - - SmartphoneAdd - - - - - SmartphoneConnect - - - - - SmartphoneDelete - - - - - SmartphoneDisk - - - - - SmartphoneEdit - - - - - SmartphoneError - - - - - SmartphoneGo - - - - - SmartphoneKey - - - - - SmartphoneWrench - - - - - SortAscending - - - - - SortDescending - - - - - Sound - - - - - SoundAdd - - - - - SoundDelete - - - - - SoundHigh - - - - - SoundIn - - - - - SoundLow - - - - - SoundMute - - - - - SoundNone - - - - - SoundOut - - - - - Spellcheck - - - - - Sport8ball - - - - - SportBasketball - - - - - SportFootball - - - - - SportGolf - - - - - SportGolfPractice - - - - - SportRaquet - - - - - SportShuttlecock - - - - - SportSoccer - - - - - SportTennis - - - - - Star - - - - - StarBronze - - - - - StarBronzeHalfGrey - - - - - StarGold - - - - - StarGoldHalfGrey - - - - - StarGoldHalfSilver - - - - - StarGrey - - - - - StarHalfGrey - - - - - StarSilver - - - - - StatusAway - - - - - StatusBeRightBack - - - - - StatusBusy - - - - - StatusInvisible - - - - - StatusOffline - - - - - StatusOnline - - - - - Stop - - - - - StopBlue - - - - - StopGreen - - - - - StopRed - - - - - Style - - - - - StyleAdd - - - - - StyleDelete - - - - - StyleEdit - - - - - StyleGo - - - - - Sum - - - - - Tab - - - - - Table - - - - - TableAdd - - - - - TableCell - - - - - TableColumn - - - - - TableColumnAdd - - - - - TableColumnDelete - - - - - TableConnect - - - - - TableDelete - - - - - TableEdit - - - - - TableError - - - - - TableGear - - - - - TableGo - - - - - TableKey - - - - - TableLightning - - - - - TableLink - - - - - TableMultiple - - - - - TableRefresh - - - - - TableRelationship - - - - - TableRow - - - - - TableRowDelete - - - - - TableRowInsert - - - - - TableSave - - - - - TableSort - - - - - TabAdd - - - - - TabBlue - - - - - TabDelete - - - - - TabEdit - - - - - TabGo - - - - - TabGreen - - - - - TabRed - - - - - Tag - - - - - TagsGrey - - - - - TagsRed - - - - - TagBlue - - - - - TagBlueAdd - - - - - TagBlueDelete - - - - - TagBlueEdit - - - - - TagGreen - - - - - TagOrange - - - - - TagPink - - - - - TagPurple - - - - - TagRed - - - - - TagYellow - - - - - Telephone - - - - - TelephoneAdd - - - - - TelephoneDelete - - - - - TelephoneEdit - - - - - TelephoneError - - - - - TelephoneGo - - - - - TelephoneKey - - - - - TelephoneLink - - - - - TelephoneRed - - - - - Television - - - - - TelevisionAdd - - - - - TelevisionDelete - - - - - TelevisionIn - - - - - TelevisionOff - - - - - TelevisionOut - - - - - TelevisionStar - - - - - Textfield - - - - - TextfieldAdd - - - - - TextfieldDelete - - - - - TextfieldKey - - - - - TextfieldRename - - - - - TextAb - - - - - TextAlignCenter - - - - - TextAlignJustify - - - - - TextAlignLeft - - - - - TextAlignRight - - - - - TextAllcaps - - - - - TextBold - - - - - TextColumns - - - - - TextComplete - - - - - TextDirection - - - - - TextDoubleUnderline - - - - - TextDropcaps - - - - - TextFit - - - - - TextFlip - - - - - TextFontDefault - - - - - TextHeading1 - - - - - TextHeading2 - - - - - TextHeading3 - - - - - TextHeading4 - - - - - TextHeading5 - - - - - TextHeading6 - - - - - TextHorizontalrule - - - - - TextIndent - - - - - TextIndentRemove - - - - - TextInverse - - - - - TextItalic - - - - - TextKerning - - - - - TextLeftToRight - - - - - TextLetterspacing - - - - - TextLetterOmega - - - - - TextLinespacing - - - - - TextListBullets - - - - - TextListNumbers - - - - - TextLowercase - - - - - TextLowercaseA - - - - - TextMirror - - - - - TextPaddingBottom - - - - - TextPaddingLeft - - - - - TextPaddingRight - - - - - TextPaddingTop - - - - - TextReplace - - - - - TextRightToLeft - - - - - TextRotate0 - - - - - TextRotate180 - - - - - TextRotate270 - - - - - TextRotate90 - - - - - TextRuler - - - - - TextShading - - - - - TextSignature - - - - - TextSmallcaps - - - - - TextSpelling - - - - - TextStrikethrough - - - - - TextSubscript - - - - - TextSuperscript - - - - - TextTab - - - - - TextUnderline - - - - - TextUppercase - - - - - Theme - - - - - ThumbDown - - - - - ThumbUp - - - - - Tick - - - - - Time - - - - - TimelineMarker - - - - - TimeAdd - - - - - TimeDelete - - - - - TimeGo - - - - - TimeGreen - - - - - TimeRed - - - - - Transmit - - - - - TransmitAdd - - - - - TransmitBlue - - - - - TransmitDelete - - - - - TransmitEdit - - - - - TransmitError - - - - - TransmitGo - - - - - TransmitRed - - - - - Tux - - - - - User - - - - - UserAdd - - - - - UserAlert - - - - - UserB - - - - - UserBrown - - - - - UserComment - - - - - UserCross - - - - - UserDelete - - - - - UserEarth - - - - - UserEdit - - - - - UserFemale - - - - - UserGo - - - - - UserGray - - - - - UserGrayCool - - - - - UserGreen - - - - - UserHome - - - - - UserKey - - - - - UserMagnify - - - - - UserMature - - - - - UserOrange - - - - - UserRed - - - - - UserStar - - - - - UserSuit - - - - - UserSuitBlack - - - - - UserTick - - - - - Vcard - - - - - VcardAdd - - - - - VcardDelete - - - - - VcardEdit - - - - - VcardKey - - - - - Vector - - - - - VectorAdd - - - - - VectorDelete - - - - - VectorKey - - - - - Wand - - - - - WeatherCloud - - - - - WeatherClouds - - - - - WeatherCloudy - - - - - WeatherCloudyRain - - - - - WeatherLightning - - - - - WeatherRain - - - - - WeatherSnow - - - - - WeatherSun - - - - - Webcam - - - - - WebcamAdd - - - - - WebcamConnect - - - - - WebcamDelete - - - - - WebcamError - - - - - WebcamStart - - - - - WebcamStop - - - - - World - - - - - WorldAdd - - - - - WorldConnect - - - - - WorldDawn - - - - - WorldDelete - - - - - WorldEdit - - - - - WorldGo - - - - - WorldKey - - - - - WorldLink - - - - - WorldNight - - - - - WorldOrbit - - - - - Wrench - - - - - WrenchOrange - - - - - Xhtml - - - - - XhtmlAdd - - - - - XhtmlDelete - - - - - XhtmlError - - - - - XhtmlGo - - - - - XhtmlValid - - - - - Zoom - - - - - ZoomIn - - - - - ZoomOut - - - - - SystemClose - - - - - SystemNew - - - - - SystemSave - - - - - SystemSaveClose - - - - - SystemSaveNew - - - - - SystemSearch - - - - - 预定义图标名称 - - - - - 获取图标名称 - - - - - - - 获得图标的服务器地址 - - 图标 - 图标的服务器地址 - - - - 获取客户端可用的图标URL地址 - - 图标 - URL地址 - - - - 获取客户端可用的图标URL地址 - - 图标 - 图标地址 - URL地址 - - - - 将图标字符串转换为图标 - - 图标字符串 - 是否忽略大小写 - 图标 - - - - 将图标转换为图标字符串 - - 图标 - 图标字符串 - - - - 样式 - - - - - 蓝色 - - - - - 银灰色 - - - - - 高对比度 - - - - - 海王星(默认值) - - - - - 样式的类型名称 - - - - - 语言 - - - - - 英文 - - - - - 中文(默认值) - - - - - 中文(台湾) - - - - - 葡萄牙文(巴西) - - - - - 土耳其文 - - - - - 俄文 - - - - - 语言的类型名称 - - - - - 操作符(用于表单控件的客户端验证) - - - - - 等于(默认值) - - - - - 大于 - - - - - 大于等于 - - - - - 小于 - - - - - 小于等于 - - - - - 不等于 - - - - - 操作符名称 - - - - - 触发器输入框右侧图标的类型 - - - - - 无(默认值) - - - - - 搜索图标 - - - - - 清空图标 - - - - - 日期图标 - - - - - 系统图标名称 - - - - - 窗体的初始显示位置 - - - - - 页面的中部 - - - - - 页面的黄金分割点处(默认值) - - - - - 工具条的位置 - - - - - 顶部(默认值) - - - - - 底部 - - - - - 左侧 - - - - - 右侧 - - - - - 工具条的位置名称 - - - - - 窗体以及对话框的显示位置 - - - - - 当前页面(默认值) - - - - - 父页面 - - - - - 最外层页面 - - - - - Alert,Confirm,Window显示的位置 - - - - - Get target name used inside JavaScript code. - - - - - - - 正则表达式常用类型(用于表单控件的客户端验证) - - - - - 无(默认值) - - - - - 数字 - - - - - 字母 - - - - - 字母数字 - - - - - 字母下划线 - - - - - 字母数字下划线 - - - - - 小写字母 - - - - - 大写字母 - - - - - 电子邮箱 - - - - - 网址 - - - - - 邮政编码(中华人民共和国) - - - - - IP地址 - - - - - 身份证(中华人民共和国) - - - - - 正则表达式常用类型 内容 - - - - - 关闭窗体的动作 - - - - - 关闭窗体(默认值) - - - - - 关闭窗体后刷新父页面 - - - - - 关闭窗体后会发父页面(需要注册OnClose事件处理函数) - - - - - 关闭窗体的动作 - - - - - Region控件所在RegionPanel中的位置 - - - - - 上方 - - - - - 底部 - - - - - 左侧 - - - - - 右侧 - - - - - 中部(默认值) - - - - - 布局类型名称 - - - - - Tab标签的显示位置 - - - - - 顶部(默认值) - - - - - 底部 - - - - - 左侧 - - - - - 右侧 - - - - - Tab显示的位置名称 - - - - - 按钮上图标的摆放位置 - - - - - 靠上 - - - - - 靠右 - - - - - 靠下 - - - - - 靠左(默认值) - - - - - 图标摆放位置的名称 - - - - - 按钮的大小 - - - - - 小尺寸(默认值) - - - - - 中等尺寸 - - - - - 大尺寸 - - - - - 按钮的大小名称 - - - - - 在HBox布局或者VBox布局中,用来控制容器子控件的位置 - - - - - 所有子控件位于父容器的开始位置(废弃,请使用Start代替) - - - - - 所有子控件位于父容器的中间位置(废弃,请使用Center代替) - - - - - 所有子控件位于父容器的开始位置 - - - - - 所有子控件位于父容器的中间位置 - - - - - 所有子控件被拉伸至父容器的大小(默认值) - - - - - 所有子控件被拉伸至最大子控件的大小 - - - - - HBox或者VBox的位置的名称 - - - - - 在HBox布局或者VBox布局中,用来控制容器子控件的位置 - - - - - 子控件靠父容器的开始位置排列(废弃,请使用Start代替) - - - - - 子控件靠父容器的结束位置排列(废弃,请使用End代替) - - - - - 子控件靠父容器的中间位置排列 - - - - - 子控件靠父容器的开始位置排列(默认值) - - - - - 子控件靠父容器的结束位置排列 - - - - - HBox或者VBox的位置的名称 - - - - - Ajax提示信息的类型 - - - - - 在页面顶部显示黄色提示框(默认值) - - - - - Extjs的页面遮罩提示框 - - - - - Ajax提示信息的类型名称 - - - - - 文本排列位置 - - - - - 靠左排列(默认值) - - - - - 居中排列 - - - - - 靠右排列 - - - - - 文本排列位置名称 - - - - - 表单中标签的排列位置 - - - - - 靠左(默认值) - - - - - 靠右 - - - - - 靠上 - - - - - 表单中标签的排列位置名称 - - - - - 垂直排列位置 - - - - - 居中排列(默认值) - - - - - 靠上排列 - - - - - 靠下排列 - - - - - 垂直排列位置名称 - - - - - 创建Javascript数组参数的帮助类 - - - - - 构造函数 - - - - - 构造函数 - - 初始属性值 - - - - 构造函数 - - 初始属性值 - 是否保持原样 - - - - 删除属性 - - 属性值 - - - - 添加属性 - - 属性值 - - - - 添加属性 - - 属性值 - 是否保持原样 - - - - 将整个数组中元素顺序反转 - - - - - 返回对象的JSON字符串形式 - - 对象的JSON形式 - - - - 内部保存的数据 - - - - - 已经添加属性的个数 - - - - - 删除属性 - - - - - - 添加属性 - - - - - - - 添加属性 - - - - 是否保持原样 - - - - 使用这个方法需要特别注意,因为这里返回的不是设置的属性了 - 比如:"margin-right:5px;"被添加到OB中就变成:"\"margin-right:5px;\"" - - - - - - - 返回对象的Json字符串表示 - - - - - - 存在 Page.Items 上下文中,用于生成JavascriptID - - - - - 添加JS文件到页面的底部 - - - - - - - - 添加样式表到页头 - - - - - - - - 向页面头部添加内容 - - - - - - - - 页头是否包含控件 - - - - - - - - 取得下一个控件的位置 - - - - - - 资源处理程序 - - - - - 处理资源的请求 - - Http请求上下文 - - - - 只要请求的 URL 相同,则请求可以重用 - - - - - AJAX输出过滤器 - - - - - 设置引起本次回发的按钮(或其他控件)可用 - - - - - - 更新 EventValidation 节点的值 - - - - - - - 更新 ViewState 节点的值 - - - - - - - 更新ASP.NET控件 - - - - - - - 取得 HTML 中一个节点的值 - - - - - - - - 取得 HTML 中一个节点的OuterHtml - - - - - - - - 获取当前输出流的HTML内容 - - - - - - 请求处理模块(主要用来处理Response.Redirect的情况) - - - - - 清除资源 - - - - - 初始化模块 - - Http应用程序 - - - - 存在 Page.Items 上下文中,用于生成JavascriptID - - - - - 模拟树帮助类(用于表格和树控件) - - - - - 模拟树结构的节点类 - - - - - 模拟树的节点内容 - - - - - 节点内容 - - - - - 节点内容 - - - - - 节点所在层次(从0开始,0表示根节点) - - - - - 父节点 - - - - - 是否有弟节点 - - - - - 控件相关帮助函数 - - - - - 查找父控件 - - 当前控件 - 查找控件的类型 - 如果找到的控件实例继承自controlType,同样也认为是找到了 - 找到的第一个父控件 - - - - 查找父控件 - - 当前控件 - 查找控件的类型 - 找到的第一个父控件 - - - - 获得服务器控件ID的客户端ID数组 - - - - - - - 查找父层次结构中是否存在用户控件 - - 当前控件 - 父层次中的用户控件 - - - - 根据控件ID查找控件 - - 要查找的控件ID - 找到的控件 - - - - 根据控件类型查找控件 - - 要查找的控件类型 - 找到的控件 - - - - 在父控件的所有子控件中查找控件 - - 父控件 - 要查找的控件ID - 找到的控件 - - - - 在父控件的所有子控件中查找控件 - - 父控件 - 要查找的控件类型 - 找到的控件 - - - - 字符串帮助类 - - - - - GZIP压缩的ViewState隐藏字段的ID - - - - - GZIP压缩的ViewState隐藏字段的ID - - - - - 获取枚举实例 - - 枚举类型 - 枚举实例名称 - 枚举实例 - - - - 获取枚举实例名称 - - 枚举实例 - 枚举实例名称 - - - - 去除字符串中的Html - - 字符串 - 字符串 - - - - 将字符串"1,2,3"转化为整形列表[1,2,3] - - 字符串 - 整形列表 - - - - 将字符串"1,2,3"转化为整形列表[1,2,3] - - 字符串 - 返回之前是否对数组进行排序(由小到大) - 整形列表 - - - - 将字符串"ssdd,2,ok"转化为字符串列表["ssdd","2","ok"] - - 字符串 - 字符串列表 - - - - 将字符串"ssdd,2,ok"转化为字符串列表["ssdd","2","ok"] - - - 返回之前是否对数组进行排序(由小到大) - 字符串列表 - - - - 将字符串数组["ssdd","2","ok"]转化为字符串"ssdd,2,ok" - - 字符串数组 - 字符串 - - - - 将整型数组[2,3,4]转化为字符串"2,3,4" - - 整形数组 - 字符串 - - - - 比较两个整形数组是否相等 - - 整形数组1 - 整形数组2 - 是否相等 - - - - 比较两个字符串数组是否相等 - - 字符串数组1 - 字符串数组2 - 是否相等 - - - - 将 10% 转换为 0.1 的字符串的形式 - - 百分比字符串 - 小数 - - - - Base64解码 - - 需要解码的字节数组 - 解码后的字符串 - - - - Base64解码 - - 需要解码的字符串 - 解码后的字符串 - - - - Base64编码 - - 需要编码的字节数组 - 编码后的字符串 - - - - Base64编码 - - 需要编码的字符串 - 编码后的字符串 - - - - Gzip编码字符串 - - 源字符串 - Gzip后的字符串 - - - - 解码Gzip字符串 - - Gzip后的字符串 - 源字符串 - - - - 加载Gzipped的ViewState - - - - - - - 生成Gzipped的ViewState - - - - - - - 对象帮助类 - - - - - 获取对象的属性值 - - 可能是DataRowView或一个对象 - 属性名 - 属性值 - - - - 获取对象的属性值 - - 对象 - 属性名("Color"、"BodyStyle"或者"Info.UserName") - 属性值 - - - - 创建HTML节点的帮助类 - - - - - 构造函数 - - 节点名称 - - - - 设置属性 - - 属性名 - 属性值 - - - - 取得属性的值 - - 属性名 - 属性值 - - - - 转化为客户端可用的HTML标签字符串 - - 客户端可用的HTML标签字符串 - - - - 节点内部值 - - - - - 样式帮助类 - - - - - 提取样式字符串 - - CSS字符串 - 样式名称 - 样式字符串 - - - - 获取背景图片样式 - - 选择符 - 图片地址 - CSS样式 - - - - 获取背景图片样式(no-repeat) - - 选择符 - 图片地址 - CSS样式 - - - - 获取适合CSS的Margin或者Padding定义 - - 源字符串 - CSS样式 - - - - JSON帮助类 - - - - - 将JArray转换为整型数组 - - JArray对象 - 整型数组 - - - - 将JArray转换为字符串数组 - - JArray对象 - 字符串数组 - - - - 将JArray转换为对象数组 - - JArray对象 - 对象数组 - - - - A utility class to compute CRC32. - - - - - Compute a checksum for a given string. - - The string to compute the checksum for. - The computed checksum. - - - - Compute a checksum for a given array of bytes. - - The array of bytes to compute the checksum for. - The computed checksum. - - - - Represents an HTML attribute. - - - - - Creates a duplicate of this attribute. - - The cloned attribute. - - - - Compares the current instance with another attribute. Comparison is based on attributes' name. - - An attribute to compare with this instance. - A 32-bit signed integer that indicates the relative order of the names comparison. - - - - Gets the qualified name of the attribute. - - - - - Gets or sets the value of the attribute. - - - - - Gets the line number of this attribute in the document. - - - - - Gets the column number of this attribute in the document. - - - - - Gets the stream position of this attribute in the document, relative to the start of the document. - - - - - Gets the HTML node to which this attribute belongs. - - - - - Gets the HTML document to which this attribute belongs. - - - - - Represents a combined list and collection of HTML nodes. - - - - - Inserts the specified attribute as the last attribute in the collection. - - The attribute to insert. May not be null. - The appended attribute. - - - - Creates and inserts a new attribute as the last attribute in the collection. - - The name of the attribute to insert. - The appended attribute. - - - - Creates and inserts a new attribute as the last attribute in the collection. - - The name of the attribute to insert. - The value of the attribute to insert. - The appended attribute. - - - - Inserts the specified attribute as the first node in the collection. - - The attribute to insert. May not be null. - The prepended attribute. - - - - Removes the attribute at the specified index. - - The index of the attribute to remove. - - - - Removes a given attribute from the list. - - The attribute to remove. May not be null. - - - - Removes an attribute from the list, using its name. If there are more than one attributes with this name, they will all be removed. - - The attribute's name. May not be null. - - - - Remove all attributes in the list. - - - - - Returns an enumerator that can iterate through the list. - - An IEnumerator for the entire list. - - - - Gets the number of elements actually contained in the list. - - - - - Gets a given attribute from the list using its name. - - - - - Gets the attribute at the specified index. - - - - - Represents an enumerator that can iterate through the list. - - - - - Sets the enumerator to its initial position, which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - true if the enumerator was successfully advanced to the next element, false if the enumerator has passed the end of the collection. - - - - Gets the current element in the collection. - - - - - Gets the current element in the collection. - - - - - Represents an HTML comment. - - - - - Represents an HTML node. - - - - - Gets the name of a comment node. It is actually defined as '#comment'. - - - - - Gets the name of the document node. It is actually defined as '#document'. - - - - - Gets the name of a text node. It is actually defined as '#text'. - - - - - Gets a collection of flags that define specific behaviors for specific element nodes. - The table contains a DictionaryEntry list with the lowercase tag name as the Key, and a combination of HtmlElementFlags as the Value. - - - - - Determines if an element node is closed. - - The name of the element node to check. May not be null. - true if the name is the name of a closed element node, false otherwise. - - - - Determines if an element node can be kept overlapped. - - The name of the element node to check. May not be null. - true if the name is the name of an element node that can be kept overlapped, false otherwise. - - - - Determines if a text corresponds to the closing tag of an node that can be kept overlapped. - - The text to check. May not be null. - true or false. - - - - Determines if an element node is a CDATA element node. - - The name of the element node to check. May not be null. - true if the name is the name of a CDATA element node, false otherwise. - - - - Determines if an element node is defined as empty. - - The name of the element node to check. May not be null. - true if the name is the name of an empty element node, false otherwise. - - - - Creates an HTML node from a string representing literal HTML. - - The HTML text. - The newly created node instance. - - - - Creates a duplicate of the node and the subtree under it. - - The node to duplicate. May not be null. - - - - Creates a duplicate of the node. - - The node to duplicate. May not be null. - true to recursively clone the subtree under the specified node, false to clone only the node itself. - - - - Creates a new XPathNavigator object for navigating this HTML node. - - An XPathNavigator object. The XPathNavigator is positioned on the node from which the method was called. It is not positioned on the root of the document. - - - - Selects the first XmlNode that matches the XPath expression. - - The XPath expression. May not be null. - The first HtmlNode that matches the XPath query or a null reference if no matching node was found. - - - - Selects a list of nodes matching the XPath expression. - - The XPath expression. - An HtmlNodeCollection containing a collection of nodes matching the XPath query, or null if no node matched the XPath expression. - - - - Creates a duplicate of the node - - - - - - Creates a duplicate of the node and changes its name at the same time. - - The new name of the cloned node. May not be null. - The cloned node. - - - - Creates a duplicate of the node and changes its name at the same time. - - The new name of the cloned node. May not be null. - true to recursively clone the subtree under the specified node; false to clone only the node itself. - The cloned node. - - - - Creates a duplicate of the node. - - true to recursively clone the subtree under the specified node; false to clone only the node itself. - The cloned node. - - - - Removes all the children and/or attributes of the current node. - - - - - Removes all the children of the current node. - - - - - Removes the specified child node. - - The node being removed. May not be null. - The node removed. - - - - Removes the specified child node. - - The node being removed. May not be null. - true to keep grand children of the node, false otherwise. - The node removed. - - - - Replaces the child node oldChild with newChild node. - - The new node to put in the child list. - The node being replaced in the list. - The node replaced. - - - - Inserts the specified node immediately before the specified reference node. - - The node to insert. May not be null. - The node that is the reference node. The newChild is placed before this node. - The node being inserted. - - - - Inserts the specified node immediately after the specified reference node. - - The node to insert. May not be null. - The node that is the reference node. The newNode is placed after the refNode. - The node being inserted. - - - - Adds the specified node to the beginning of the list of children of this node. - - The node to add. May not be null. - The node added. - - - - Adds the specified node list to the beginning of the list of children of this node. - - The node list to add. May not be null. - - - - Adds the specified node to the end of the list of children of this node. - - The node to add. May not be null. - The node added. - - - - Adds the specified node to the end of the list of children of this node. - - The node list to add. May not be null. - - - - Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. - - The name of the attribute to get. May not be null. - The default value to return if not found. - The value of the attribute if found, the default value if not found. - - - - Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. - - The name of the attribute to get. May not be null. - The default value to return if not found. - The value of the attribute if found, the default value if not found. - - - - Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. - - The name of the attribute to get. May not be null. - The default value to return if not found. - The value of the attribute if found, the default value if not found. - - - - Helper method to set the value of an attribute of this node. If the attribute is not found, it will be created automatically. - - The name of the attribute to set. May not be null. - The value for the attribute. - The corresponding attribute instance. - - - - Saves the current node to the specified TextWriter. - - The TextWriter to which you want to save. - - - - Saves the current node to the specified XmlWriter. - - The XmlWriter to which you want to save. - - - - Saves all the children of the node to the specified TextWriter. - - The TextWriter to which you want to save. - - - - Saves the current node to a string. - - The saved string. - - - - Saves all the children of the node to a string. - - The saved string. - - - - Gets or sets the value of the 'id' HTML attribute. The document must have been parsed using the OptionUseIdAttribute set to true. - - - - - Gets the line number of this node in the document. - - - - - Gets the column number of this node in the document. - - - - - Gets the stream position of this node in the document, relative to the start of the document. - - - - - Gets a value indicating if this node has been closed or not. - - - - - Gets or sets this node's name. - - - - - Gets or Sets the text between the start and end tags of the object. - - - - - Gets or Sets the HTML between the start and end tags of the object. - - - - - Gets or Sets the object and its content in HTML. - - - - - Gets the HTML node immediately following this element. - - - - - Gets the node immediately preceding this node. - - - - - Gets the first child of the node. - - - - - Gets the last child of the node. - - - - - Gets the type of this node. - - - - - Gets the parent of this node (for nodes that can have parents). - - - - - Gets the HtmlDocument to which this node belongs. - - - - - Gets all the children of the node. - - - - - Gets a value indicating whether the current node has any attributes. - - - - - Gets a value indicating whether the current node has any attributes on the closing tag. - - - - - Gets a value indicating whether this node has any child nodes. - - - - - Gets the collection of HTML attributes for this node. May not be null. - - - - - Gets the collection of HTML attributes for the closing tag. May not be null. - - - - - Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml. - - - - - Gets or Sets the object and its content in HTML. - - - - - Gets or Sets the comment text of the node. - - - - - Represents a complete HTML document. - - - - - Defines if a checksum must be computed for the document while parsing. Default is false. - - - - - Defines if declared encoding must be read from the document. - Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node. - Default is true. - - - - - Defines if non closed nodes will be checked at the end of parsing. Default is true. - - - - - Defines if the 'id' attribute must be specifically used. Default is true. - - - - - Defines if empty nodes must be written as closed during output. Default is false. - - - - - Defines if output must conform to XML, instead of HTML. - - - - - Defines if name must be output in uppercase. Default is false. - - - - - Defines if attribute value output must be optimized (not bound with double quotes if it is possible). Default is false. - - - - - Adds Debugging attributes to node. Default is false. - - - - - Defines if source text must be extracted while parsing errors. - If the document has a lot of errors, or cascading errors, parsing performance can be dramatically affected if set to true. - Default is false. - - - - - Defines if closing for non closed nodes must be done at the end or directly in the document. - Setting this to true can actually change how browsers render the page. Default is false. - - - - - Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors are detected. Default is false. - - - - - Defines the maximum length of source text or parse errors. Default is 100. - - - - - Defines the default stream encoding to use. Default is System.Text.Encoding.Default. - - - - - Defines the name of a node that will throw the StopperNodeException when found as an end node. Default is null. - - - - - Creates an instance of an HTML document. - - - - - Applies HTML encoding to a specified string. - - The input string to encode. May not be null. - The encoded string. - - - - Detects the encoding of an HTML stream. - - The input stream. May not be null. - The detected encoding. - - - - Detects the encoding of an HTML file. - - Path for the file containing the HTML document to detect. May not be null. - The detected encoding. - - - - Detects the encoding of an HTML text. - - The input html text. May not be null. - The detected encoding. - - - - Detects the encoding of an HTML text provided on a TextReader. - - The TextReader used to feed the HTML. May not be null. - The detected encoding. - - - - Loads an HTML document from a stream. - - The input stream. - - - - Loads an HTML document from a stream. - - The input stream. - Indicates whether to look for byte order marks at the beginning of the stream. - - - - Loads an HTML document from a stream. - - The input stream. - The character encoding to use. - - - - Loads an HTML document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the stream. - - - - Loads an HTML document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the stream. - The minimum buffer size. - - - - Loads an HTML document from a file. - - The complete file path to be read. May not be null. - - - - Loads an HTML document from a file. - - The complete file path to be read. May not be null. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads an HTML document from a file. - - The complete file path to be read. May not be null. - The character encoding to use. May not be null. - - - - Loads an HTML document from a file. - - The complete file path to be read. May not be null. - The character encoding to use. May not be null. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads an HTML document from a file. - - The complete file path to be read. May not be null. - The character encoding to use. May not be null. - Indicates whether to look for byte order marks at the beginning of the file. - The minimum buffer size. - - - - Loads the HTML document from the specified string. - - String containing the HTML document to load. May not be null. - - - - Detects the encoding of an HTML document from a file first, and then loads the file. - - The complete file path to be read. - - - - Detects the encoding of an HTML document from a file first, and then loads the file. - - The complete file path to be read. May not be null. - true to detect encoding, false otherwise. - - - - Loads the HTML document from the specified TextReader. - - The TextReader used to feed the HTML data into the document. May not be null. - - - - Saves the HTML document to the specified stream. - - The stream to which you want to save. - - - - Saves the HTML document to the specified stream. - - The stream to which you want to save. May not be null. - The character encoding to use. May not be null. - - - - Saves the mixed document to the specified file. - - The location of the file where you want to save the document. - - - - Saves the mixed document to the specified file. - - The location of the file where you want to save the document. May not be null. - The character encoding to use. May not be null. - - - - Saves the HTML document to the specified StreamWriter. - - The StreamWriter to which you want to save. - - - - Saves the HTML document to the specified TextWriter. - - The TextWriter to which you want to save. May not be null. - - - - Saves the HTML document to the specified XmlWriter. - - The XmlWriter to which you want to save. - - - - Creates a new XPathNavigator object for navigating this HTML document. - - An XPathNavigator object. The XPathNavigator is positioned on the root of the document. - - - - Gets a valid XML name. - - Any text. - A string that is a valid XML name. - - - - Gets the HTML node with the specified 'id' attribute value. - - The attribute id to match. May not be null. - The HTML node with the matching id or null if not found. - - - - Creates an HTML element node with the specified name. - - The qualified name of the element. May not be null. - The new HTML node. - - - - Creates an HTML comment node. - - The new HTML comment node. - - - - Creates an HTML comment node with the specified comment text. - - The comment text. May not be null. - The new HTML comment node. - - - - Creates an HTML text node. - - The new HTML text node. - - - - Creates an HTML text node with the specified text. - - The text of the node. May not be null. - The new HTML text node. - - - - Creates an HTML attribute with the specified name. - - The name of the attribute. May not be null. - The new HTML attribute. - - - - Creates an HTML attribute with the specified name. - - The name of the attribute. May not be null. - The value of the attribute. - The new HTML attribute. - - - - Determines if the specified character is considered as a whitespace character. - - The character to check. - true if if the specified character is considered as a whitespace character. - - - - Gets the remaining text. - Will always be null if OptionStopperNodeName is null. - - - - - Gets the offset of Remainder in the original Html text. - If OptionStopperNodeName is null, this will return the length of the original Html text. - - - - - Gets a list of parse errors found in the document. - - - - - Gets the document's stream encoding. - - - - - Gets the document's declared encoding. - Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node. - - - - - Gets the document's output encoding. - - - - - Gets the root node of the document. - - - - - Gets the document CRC32 checksum if OptionComputeChecksum was set to true before parsing, 0 otherwise. - - - - - Flags that describe the behavior of an Element node. - - - - - The node is a CDATA node. - - - - - The node is empty. META or IMG are example of such nodes. - - - - - The node will automatically be closed during parsing. - - - - - The node can overlap. - - - - - A utility class to replace special characters by entities and vice-versa. - Follows HTML 4.0 specification found at http://www.w3.org/TR/html4/sgml/entities.html - - - - - Clone and entitize an HtmlNode. This will affect attribute values and nodes' text. It will also entitize all child nodes. - - The node to entitize. - An entitized cloned node. - - - - Replace characters above 127 by entities. - - The source text. - The result text. - - - - Replace characters above 127 by entities. - - The source text. - If set to false, the function will not use known entities name. Default is true. - The result text. - - - - Replace characters above 127 by entities. - - The source text. - If set to false, the function will not use known entities name. Default is true. - If set to true, the [quote], [ampersand], [lower than] and [greather than] characters will be entitized. - The result text - - - - Replace known entities by characters. - - The source text. - The result text. - - - - A collection of entities indexed by name. - - - - - A collection of entities indexed by value. - - - - - Represents a combined list and collection of HTML nodes. - - - - - Returns an enumerator that can iterate through the list. - - An IEnumerator for the entire list. - - - - Gets the number of elements actually contained in the list. - - - - - Gets the node at the specified index. - - - - - Gets a given node from the list. - - - - - Represents an enumerator that can iterate through the list. - - - - - Sets the enumerator to its initial position, which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - true if the enumerator was successfully advanced to the next element, false if the enumerator has passed the end of the collection. - - - - Gets the current element in the collection. - - - - - Gets the current element in the collection. - - - - - Represents an HTML navigator on an HTML document seen as a data store. - - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream. - - The input stream. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream. - - The input stream. - Indicates whether to look for byte order marks at the beginning of the stream. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream. - - The input stream. - The character encoding to use. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the stream. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the stream. - The minimum buffer size. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a TextReader. - - The TextReader used to feed the HTML data into the document. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a file. - - The complete file path to be read. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a file. - - The complete file path to be read. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a file. - - The complete file path to be read. - The character encoding to use. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a file. - - The complete file path to be read. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Initializes a new instance of the HtmlNavigator and loads an HTML document from a file. - - The complete file path to be read. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - The minimum buffer size. - - - - Moves to the next sibling of the current node. - - true if the navigator is successful moving to the next sibling node, false if there are no more siblings or if the navigator is currently positioned on an attribute node. If false, the position of the navigator is unchanged. - - - - Moves to the previous sibling of the current node. - - true if the navigator is successful moving to the previous sibling node, false if there is no previous sibling or if the navigator is currently positioned on an attribute node. - - - - Moves to the first sibling of the current node. - - true if the navigator is successful moving to the first sibling node, false if there is no first sibling or if the navigator is currently positioned on an attribute node. - - - - Moves to the first child of the current node. - - true if there is a first child node, otherwise false. - - - - Moves to the parent of the current node. - - true if there is a parent node, otherwise false. - - - - Moves to the root node to which the current node belongs. - - - - - Moves to the same position as the specified HtmlNavigator. - - The HtmlNavigator positioned on the node that you want to move to. - true if successful, otherwise false. If false, the position of the navigator is unchanged. - - - - Moves to the node that has an attribute of type ID whose value matches the specified string. - - A string representing the ID value of the node to which you want to move. This argument does not need to be atomized. - true if the move was successful, otherwise false. If false, the position of the navigator is unchanged. - - - - Determines whether the current HtmlNavigator is at the same position as the specified HtmlNavigator. - - The HtmlNavigator that you want to compare against. - true if the two navigators have the same position, otherwise, false. - - - - Creates a new HtmlNavigator positioned at the same node as this HtmlNavigator. - - A new HtmlNavigator object positioned at the same node as the original HtmlNavigator. - - - - Gets the value of the HTML attribute with the specified LocalName and NamespaceURI. - - The local name of the HTML attribute. - The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation. - The value of the specified HTML attribute. String.Empty or null if a matching attribute is not found or if the navigator is not positioned on an element node. - - - - Moves to the HTML attribute with matching LocalName and NamespaceURI. - - The local name of the HTML attribute. - The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation. - true if the HTML attribute is found, otherwise, false. If false, the position of the navigator does not change. - - - - Moves to the first HTML attribute. - - true if the navigator is successful moving to the first HTML attribute, otherwise, false. - - - - Moves to the next HTML attribute. - - - - - - Returns the value of the namespace node corresponding to the specified local name. - Always returns string.Empty for the HtmlNavigator implementation. - - The local name of the namespace node. - Always returns string.Empty for the HtmlNavigator implementation. - - - - Moves the XPathNavigator to the namespace node with the specified local name. - Always returns false for the HtmlNavigator implementation. - - The local name of the namespace node. - Always returns false for the HtmlNavigator implementation. - - - - Moves the XPathNavigator to the first namespace node of the current element. - Always returns false for the HtmlNavigator implementation. - - An XPathNamespaceScope value describing the namespace scope. - Always returns false for the HtmlNavigator implementation. - - - - Moves the XPathNavigator to the next namespace node. - Always returns falsefor the HtmlNavigator implementation. - - An XPathNamespaceScope value describing the namespace scope. - Always returns false for the HtmlNavigator implementation. - - - - Gets the name of the current HTML node without the namespace prefix. - - - - - Gets the namespace URI (as defined in the W3C Namespace Specification) of the current node. - Always returns string.Empty in the case of HtmlNavigator implementation. - - - - - Gets the qualified name of the current node. - - - - - Gets the prefix associated with the current node. - Always returns string.Empty in the case of HtmlNavigator implementation. - - - - - Gets the type of the current node. - - - - - Gets the text value of the current node. - - - - - Gets the base URI for the current node. - Always returns string.Empty in the case of HtmlNavigator implementation. - - - - - Gets the xml:lang scope for the current node. - Always returns string.Empty in the case of HtmlNavigator implementation. - - - - - Gets a value indicating whether the current node is an empty element. - - - - - Gets the XmlNameTable associated with this implementation. - - - - - Gets a value indicating whether the current node has child nodes. - - - - - Gets a value indicating whether the current node has child nodes. - - - - - Gets the current HTML node. - - - - - Gets the current HTML document. - - - - - Represents the type of a node. - - - - - The root of a document. - - - - - An HTML element. - - - - - An HTML comment. - - - - - A text node is always the child of an element or a document node. - - - - - Represents a parsing error found during document parsing. - - - - - Gets the type of error. - - - - - Gets the line number of this error in the document. - - - - - Gets the column number of this error in the document. - - - - - Gets the absolute stream position of this error in the document, relative to the start of the document. - - - - - Gets the the full text of the line containing the error. - - - - - Gets a description for the error. - - - - - Represents the type of parsing error. - - - - - A tag was not closed. - - - - - A tag was not opened. - - - - - There is a charset mismatch between stream and declared (META) encoding. - - - - - An end tag was not required. - - - - - An end tag is invalid at this position. - - - - - Represents an HTML text node. - - - - - Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml. - - - - - Gets or Sets the object and its content in HTML. - - - - - Gets or Sets the text of the node. - - - - - A utility class to get HTML document from HTTP. - - - - - Occurs before an HTTP request is executed. - - - - - Occurs after an HTTP request has been executed. - - - - - Occurs before an HTML document is handled. - - - - - Creates an instance of an HtmlWeb class. - - - - - Gets an HTML document from an Internet resource and saves it to the specified file. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The location of the file where you want to save the document. - - - - Gets an HTML document from an Internet resource and saves it to the specified file. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The location of the file where you want to save the document. - The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND. - - - - Gets an HTML document from an Internet resource. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - A new HTML document. - - - - Loads an HTML document from an Internet resource. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND. - A new HTML document. - - - - Gets the cache file path for a specified url. - - The url fo which to retrieve the cache path. May not be null. - The cache file path. - - - - Gets the path extension for a given MIME content type. - - The input MIME content type. - The default path extension to return if any error occurs. - The MIME content type's path extension. - - - - Gets the MIME content type for a given path extension. - - The input path extension. - The default content type to return if any error occurs. - The path extention's MIME content type. - - - - Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The XmlTextWriter to which you want to save. - - - - Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The URL that specifies the XSLT stylesheet to load. - An XsltArgumentList containing the namespace-qualified arguments used as input to the transform. - The XmlTextWriter to which you want to save. - - - - Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". May not be null. - The URL that specifies the XSLT stylesheet to load. - An XsltArgumentList containing the namespace-qualified arguments used as input to the transform. - The XmlTextWriter to which you want to save. - A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes. - - - - Creates an instance of the given type from the specified Internet resource. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The requested type. - An newly created instance. - - - - Creates an instance of the given type from the specified Internet resource. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The URL that specifies the XSLT stylesheet to load. - An XsltArgumentList containing the namespace-qualified arguments used as input to the transform. - The requested type. - An newly created instance. - - - - Creates an instance of the given type from the specified Internet resource. - - The requested URL, such as "http://Myserver/Mypath/Myfile.asp". - The URL that specifies the XSLT stylesheet to load. - An XsltArgumentList containing the namespace-qualified arguments used as input to the transform. - The requested type. - A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes. - An newly created instance. - - - - Gets a value indicating if the last document was retrieved from the cache. - - - - - Gets the URI of the Internet resource that actually responded to the request. - - - - - Gets or Sets a value indicating whether to get document only from the cache. - If this is set to true and document is not found in the cache, nothing will be loaded. - - - - - Gets or Sets a value indicating if cookies will be stored. - - - - - Gets the last request duration in milliseconds. - - - - - Gets or Sets a value indicating if document encoding must be automatically detected. - - - - - Gets the last request status. - - - - - Gets or Sets the size of the buffer used for memory operations. - - - - - Gets or Sets the cache path. If null, no caching mechanism will be used. - - - - - Gets or Sets a value indicating whether the caching mechanisms should be used or not. - - - - - Represents the method that will handle the PreRequest event. - - - - - Represents the method that will handle the PostResponse event. - - - - - Represents the method that will handle the PreHandleDocument event. - - - - - Represents an exception thrown by the HtmlWeb utility class. - - - - - Creates an instance of the HtmlWebException. - - The exception's message. - - - - Represents a document with mixed code and text. ASP, ASPX, JSP, are good example of such documents. - - - - - Gets or sets the token representing code start. - - - - - Gets or sets the token representing code end. - - - - - Gets or sets the token representing code directive. - - - - - Gets or sets the token representing response write directive. - - - - - Creates a mixed code document instance. - - - - - Loads a mixed code document from a stream. - - The input stream. - - - - Loads a mixed code document from a stream. - - The input stream. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads a mixed code document from a stream. - - The input stream. - The character encoding to use. - - - - Loads a mixed code document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads a mixed code document from a stream. - - The input stream. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - The minimum buffer size. - - - - Loads a mixed code document from a file. - - The complete file path to be read. - - - - Loads a mixed code document from a file. - - The complete file path to be read. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads a mixed code document from a file. - - The complete file path to be read. - The character encoding to use. - - - - Loads a mixed code document from a file. - - The complete file path to be read. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - - - - Loads a mixed code document from a file. - - The complete file path to be read. - The character encoding to use. - Indicates whether to look for byte order marks at the beginning of the file. - The minimum buffer size. - - - - Loads a mixed document from a text - - The text to load. - - - - Loads the mixed code document from the specified TextReader. - - The TextReader used to feed the HTML data into the document. - - - - Saves the mixed document to the specified stream. - - The stream to which you want to save. - - - - Saves the mixed document to the specified stream. - - The stream to which you want to save. - The character encoding to use. - - - - Saves the mixed document to the specified file. - - The location of the file where you want to save the document. - - - - Saves the mixed document to the specified file. - - The location of the file where you want to save the document. - The character encoding to use. - - - - Saves the mixed document to the specified StreamWriter. - - The StreamWriter to which you want to save. - - - - Saves the mixed document to the specified TextWriter. - - The TextWriter to which you want to save. - - - - Create a text fragment instances. - - The newly created text fragment instance. - - - - Create a code fragment instances. - - The newly created code fragment instance. - - - - Gets the encoding of the stream used to read the document. - - - - - Gets the list of code fragments in the document. - - - - - Gets the list of text fragments in the document. - - - - - Gets the list of all fragments in the document. - - - - - Gets the code represented by the mixed code document seen as a template. - - - - - Represents a fragment of code in a mixed code document. - - - - - Represents a base class for fragments in a mixed code document. - - - - - Gets the type of fragment. - - - - - Gets the fragment position in the document's stream. - - - - - Gets the line number of the fragment. - - - - - Gets the line position (column) of the fragment. - - - - - Gets the fragement text. - - - - - Gets the fragment code text. - - - - - Represents a list of mixed code fragments. - - - - - Appends a fragment to the list of fragments. - - The fragment to append. May not be null. - - - - Prepends a fragment to the list of fragments. - - The fragment to append. May not be null. - - - - Remove a fragment from the list of fragments. If this fragment was not in the list, an exception will be raised. - - The fragment to remove. May not be null. - - - - Remove a fragment from the list of fragments, using its index in the list. - - The index of the fragment to remove. - - - - Remove all fragments from the list. - - - - - Gets an enumerator that can iterate through the fragment list. - - - - - Gets an enumerator that can iterate through the fragment list. - - - - - Gets the number of fragments contained in the list. - - - - - Gets a fragment from the list using its index. - - - - - Represents a fragment enumerator. - - - - - Sets the enumerator to its initial position, which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. - - - - Gets the current element in the collection. - - - - - Gets the current element in the collection. - - - - - Represents the type of fragement in a mixed code document. - - - - - The fragment contains code. - - - - - The fragment contains text. - - - - - Represents a fragment of text in a mixed code document. - - - - - Gets the fragment text. - - - - - JSBeautifyOptions - - - - - indent_size - - - - - indent_char - - - - - indent_level - - - - - preserve_newlines - - - - - JSBeautify - - - - - GetResult - - - - - - JSBeautify - - - - - - - 工具条控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 菜单项复选框控件(单选框) - - - - - 菜单项控件基类(抽象类) - - - - - 菜单项控件基类(抽象类) - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 添加子控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 点击时隐藏菜单,可以配合使用CssStyle=cursor:default; - - - - - 图标地址 - - - - - 预定义图标 - - - - - 文本 - - - - - 上下文菜单 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发复选框状态改变事件 - - 事件参数 - - - - 分组名(如果指定分组名,则此控件被渲染为单选框) - - - - - [AJAX属性]是否选中 - - - - - 是否自动回发 - - - - - 复选框状态改变事件(需要启用AutoPostBack) - - - - - 定时器控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取 Hidden 属性改变的 JavaScript 脚本 - - 客户端脚本 - - - - 处理回发事件 - - 事件参数 - - - - 触发定时事件 - - 事件参数 - - - - 不向页面输出控件的外部容器 - - - - - 定时间隔(单位:秒) - - - - - 定时事件 - - - - - 支持提示的表单字段基类(抽象类) - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 添加提示信息 - - HtmlNodeBuilder实例 - - - - [AJAX属性]提示文本 - - - - - [AJAX属性]提示文本的标题 - - - - - [AJAX属性]是否自动隐藏提示信息 - - - - - 用户控件的容器 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 取得第一个子控件 - - - - - - - 不向页面输出控件的外部容器 - - - - - 单项按钮项 - - - - - 构造函数 - - - - - 构造函数 - - 文本 - 值 - - - - 构造函数 - - 文本 - 值 - 是否选中 - - - - 是否选中 - - - - - 显示的文本 - - - - - 值 - - - - - 单选项集合 - - - - - 通过文本查找单选项 - - 文本 - 单选项 - - - - 通过文本查找单选项 - - 文本 - 是否去除HTML标签 - 单选项 - - - - 通过值查找单选项 - - 值 - 单选项 - - - - 添加单选项 - - 文本 - 值 - 新元素的插入位置 - - - - 确认对话框帮助类(静态类) - - - - - 确认对话框默认图标 - - - - - 显示消息框 - - - - - - 显示消息框 - - - - - - - 显示消息框 - - - - - - - 显示消息框 - - - - - - - - 获取显示确认对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 客户端脚本 - - - - 获取显示确认对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 点击确定按钮执行的客户端脚本 - 点击取消按钮执行的客户端脚本 - 客户端脚本 - - - - 获取显示确认对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 点击确定按钮执行的客户端脚本 - 点击取消按钮执行的客户端脚本 - 弹出对话框的目标页面 - 客户端脚本 - - - - 当前活动窗体帮助类(静态类) - - - - - 获取将values值写回控件的客户端脚本 - - 需要写回的字符串列表 - 客户端脚本 - - - - 获取关闭当前激活窗体的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活窗体并刷新父页面的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活窗体并回发父页面的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活窗体并回发父页面的客户端脚本 - - 回发参数 - 客户端脚本 - - - - 获取关闭当前激活窗体并执行脚本的客户端脚本 - - 回发参数 - 客户端脚本 - - - - 菜单项按钮控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发按钮点击事件 - - 事件参数 - - - - 是否可以回发 - - - - - 点击按钮时需要执行的客户端脚本 - - - - - 提交之前需要验证的表单名称列表 - - - - - 验证失败时提示对话框弹出位置 - - - - - 验证失败时是否出现提示对话框 - - - - - 确认对话框标题 - - - - - 确认对话框内容 - - - - - 确认对话框提示图标 - - - - - 确认对话框弹出位置 - - - - - 按钮点击事件 - - - - - 菜单项文本控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 菜单项分隔符控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 菜单项超链接控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 链接地址 - - - - - 链接目标 - - - - - 菜单项控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 带下拉列表的按钮 - - - - - 按钮控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取按钮客户端点击事件的脚本 - - 验证表单列表 - 表单验证提示消息目标页面 - 是否显示表单验证提示对话框 - 启用回发 - 回发脚本 - 确认对话框消息 - 确认对话框标题 - 确认对话框图标 - 确认对话框目标页面 - 自定义客户端点击脚本 - 需要禁用的控件客户端ID - 客户端脚本 - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 处理回发事件 - - 事件参数 - - - - 触发按钮点击事件 - - 事件参数 - - - - 回发之前禁用按钮(防止重复提交) - - - - - 是否可以回发 - - - - - [AJAX属性]是否被按下 - - - - - 是否可以按下 - - - - - [AJAX属性]点击按钮时需要执行的客户端脚本 - - - - - [AJAX属性]预定义图标 - - - - - 按钮的大小 - - - - - 图标地址 - - - - - 图标摆放位置 - - - - - [AJAX属性]按钮文本 - - - - - [AJAX属性]提示文本 - - - - - 提示文本类型 - - - - - Tab键索引 - - - - - 按钮类型 - - - - - 需要验证的表单名称列表(逗号分隔) - - - - - 验证失败时提示对话框弹出位置 - - - - - 验证失败时是否出现提示对话框 - - - - - [AJAX属性]确认对话框标题 - - - - - [AJAX属性]确认对话框内容 - - - - - [AJAX属性]确认对话框提示图标 - - - - - [AJAX属性]确认对话框弹出位置 - - - - - 按钮的上下文菜单 - - - - - 按钮的上下文菜单 - - - - - 按钮点击事件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 菜单控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不向页面输出控件的外部容器 - - - - - 菜单项集合 - - - - - 页面配置管理器(每个页面必须包含一个 PageManager 控件) - - - - - 渲染控件的开始标签 - - 输出流 - - - - 渲染控件的结束标签 - - 输出流 - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取回发的客户端脚本(触发PageManager的CustomEvent事件) - - 事件参数 - 客户端脚本 - - - - 获取回发的客户端脚本(触发PageManager的CustomEvent事件) - - 事件参数 - 是否在回发前验证表单(在PageManager上进行表单配置) - 客户端脚本 - - - - 处理回发事件 - - 事件参数 - - - - 触发自定义事件 - - 事件参数 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 自定义页面加载图片 - - - - - 自动调整此容器的宽度和高度,以填充整个页面 - - - - - 是否隐藏滚动条 - - - - - 每次页面回发后总是执行onReady脚本(包括Ajax局部回发) - - - - - 是否启用页面加载标示 - - - - - 需要在AJAX回发时更新的Asp.net控件列表(逗号分隔) - - - - - 本次AJAX请求过程中需要更新TemplateField的表格 - - - - - 本次AJAX请求过程中重新加载的表格 - - - - - 是否启用表单改变确认对话框 - - - - - 样式 - - - - - 自定义样式的根路径 - - - - - 自定义样式的名称 - - - - - 语言 - - - - - 是否启用Ajax - - - - - 是否启用Ajax正在加载提示 - - - - - Ajax正在加载提示的类型 - - - - - Ajax超时时间(单位:秒,默认:60秒) - - - - - 是否启用FState压缩(默认为false) - - - - - 是否向页面输出IE=edge标识 - - - - - 需要验证的表单名称列表(逗号分隔),需配合CustomEvent使用 - - - - - 验证失败时提示对话框弹出位置,需配合CustomEvent使用 - - - - - 验证失败时是否出现提示对话框,需配合CustomEvent使用 - - - - - 表单中消息的位置 - - - - - 表单中标签的位置 - - - - - 表单中右侧的空白宽度 - - - - - 表单中字段标签的宽度 - - - - - 表单中字段与标签的分隔符 - - - - - PageManager在当前页面的实例 - - - - - 自定义事件 - - - - - 图片控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - [AJAX属性]链接地址 - - - - - [AJAX属性]预定义图标 - - - - - [AJAX属性]图片的宽度 - - - - - [AJAX属性]图片的高度 - - - - - [AJAX属性]图片的样式类 - - - - - [AJAX属性]图片的样式 - - - - - [AJAX属性]图片的Alt - - - - - 文件上传控件 - - - - - 构造函数 - - - - - 将上载文件的内容保存到 Web 服务器上的指定路径 - - 保存的文件的名称 - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 处理回发事件 - - 事件参数 - - - - 触发文件选定事件 - - 事件参数 - - - - 不支持此属性 - - - - - 允许上传的文件类型(仅部分浏览器支持) - - - - - 按钮文本 - - - - - 是否只显示按钮,不显示只读输入框 - - - - - 按钮图标 - - - - - 按钮图标地址 - - - - - 上传的文件 - - - - - 是否包含文件 - - - - - 客户端文件名称,包含目录路径(IE下为完成路径,Chrome下为文件名) - - - - - 客户端文件名称,不包含目录路径 - - - - - 文件选定事件(需要启用AutoPostBack) - - - - - 隐藏表单控件 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 扩展文本框控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发第一个触发按钮点击事件 - - 事件参数 - - - - 触发第二个触发按钮点击事件 - - 事件参数 - - - - 是否允许编辑 - - - - - 是否显示触发器 - - - - - [AJAX属性]是否显示第一个触发器 - - - - - [AJAX属性]是否显示第一个触发器 - - - - - 是否可以回发第一个触发器 - - - - - 是否可以回发第一个触发器 - - - - - 第一个触发器图片 - - - - - 第二个触发器图片 - - - - - 第一个触发器图片 - - - - - 第二个触发器图片 - - - - - 点击第一个触发器时需要执行的客户端脚本 - - - - - 点击第二个触发器时需要执行的客户端脚本 - - - - - 第一个触发按钮点击事件 - - - - - 第二个触发按钮点击事件 - - - - - 链接按钮控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发按钮点击事件 - - 事件参数 - - - - [AJAX属性]文本 - - - - - [AJAX属性]点击按钮时需要执行的客户端脚本 - - - - - 提交之前需要验证的表单名称列表 - - - - - 验证失败时提示对话框弹出位置 - - - - - 验证失败时是否出现提示对话框 - - - - - 是否可以回发 - - - - - 是否对文本编码 - - - - - [AJAX属性]确认对话框标题 - - - - - [AJAX属性]确认对话框内容 - - - - - [AJAX属性]确认对话框提示图标 - - - - - [AJAX属性]确认对话框弹出位置 - - - - - 按钮点击事件 - - - - - 单选框列表控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 绑定到数据源 - - - - - 绑定到数据表 - - - - - - 绑定到可枚举列表 - - - - - - 取得属性值 - - - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发选中项改变事件 - - 事件参数 - - - - 是否必填项 - - - - - 为空时提示信息 - - - - - 是否自动回发 - - - - - 渲染成几列 - - - - - 是否按照纵向顺序渲染 - - - - - 显示文本的数据字段 - - - - - 显示文本的格式化字符串 - - - - - 显示值的数据字段 - - - - - 数据源 - - - - - [AJAX属性]选中项的值 - - - - - [AJAX属性]选中项的索引 - - - - - 选中项 - - - - - 单选项集合 - - - - - 保存的单选项数据(内部使用) - - - - - 选中项改变事件(需要启用AutoPostBack) - - - - - 单选框控件 - - - - - 构造函数 - - - - - 设置本组内其他RadioButton的Checked属性为false - 简单处理,只查找和此RadioButton在同一个层级的RadioButton - - - - - 初始化控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发单选框状态改变事件 - - 事件参数 - - - - 文本 - - - - - [AJAX属性]是否选中 - - - - - 分组的名称 - - - - - 是否自动回发 - - - - - 单选框状态改变事件(需要启用AutoPostBack) - - - - - 扩展文本框控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 触发按钮点击事件 - - 事件参数 - - - - 处理回发事件 - - 事件参数 - - - - 是否允许编辑 - - - - - 是否显示触发器 - - - - - 是否可以回发 - - - - - 右侧按钮的图片 - - - - - 右侧的图标 - - - - - 点击按钮时需要执行的客户端脚本 - - - - - 触发按钮点击事件 - - - - - 为设计时提供的表格列集合编辑器 - - - - - 构造函数 - - 控件类型 - - - - 获取此集合编辑器可包含的数据类型 - - 类型集合 - - - - 表格行选中事件参数 - - - - - 构造函数 - - 行索引 - - - - 行索引 - - - - - 表格行点击事件参数 - - - - - 构造函数 - - 行索引 - /// 列ID - - - - 行索引 - - - - - 列ID - - - - - 表格列基类(抽象类) - - - - - 表格列基类(抽象类) - - - - - 取得列头渲染后的HTML - - 渲染后的HTML - - - - 取得列渲染后的HTML - - 表格行实例 - 渲染后的HTML - - - - 获取列的状态 - - - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 添加表格列的渲染脚本 - - - - - - 表格对象 - - - - - 列索引 - - - - - 排序字段 - - - - - 允许锁定 - - - - - 是否处于锁定状态 - - - - - 是否隐藏列 - - - - - 列ID(如果没有设置,则为ClientID) - - - - - 标题栏显示的文字 - - - - - 标题栏文字的提示文本 - - - - - 标题栏文字的提示文本类型 - - - - - 列宽度 - - - - - 控制子控件的尺寸(表格列使用HBox布局) - - - - - 此列会扩展所有未使用的宽度 - - - - - 文本的排列位置 - - - - - 启用表头菜单 - - - - - 启用隐藏列功能 - - - - - 表格单元格容器样式类 - - - - - 本列是否需要保存状态(目前只有CheckBoxField实现了这个定义) - - - - - 取得提示字符串 - - - - - - - 此列模拟树显示时的层次字段 - - - - - 提示文本 - - - - - 提示字段名称 - - - - - 提示字段格式化字符串 - - - - - 表格可编辑列 - - - - - 表格可编辑列的基类 - - - - - 字段名称 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 单元格编辑控件 - - - - - 字段类型 - - - - - 渲染器 - - - - - 渲染器的参数 - - - - - 自定义渲染器函数(JavaScript函数) - - - - - 处理数据库中null值,默认为空字符串 - - - - - 显示之前进行HTML编码(默认为true) - - - - - 表格可编辑复选框列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 表格数据绑定列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 启用表头菜单 - - - - - 是否允许隐藏列 - - - - - 是否启用分页行号 - - - - - 表格分组列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 列数据 - - - - - 区域面板控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 区域集合 - - - - - 手风琴控件 - - - - - - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 处理回发事件 - - 事件参数 - - - - 触发面板改变事件 - - 事件参数 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 是否启用折叠按钮 - - - - - 是否启用激活在最上面 - - - - - 是否启用填充整个区域 - - - - - 切换面板时是否自动回发 - - - - - [AJAX属性]激活面板的索引 - - - - - 当前激活的面板 - - - - - 手风琴面板集合 - - - - - 面板改变事件 - - - - - 手风琴面板控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 鼠标移到标题栏是否高亮显示 - - - - - 手风琴面板控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 树节点命令事件参数 - - - - - 构造函数 - - 树节点 - 命令名称 - 命令参数 - - - - 树实例 - - - - - 树节点ID - - - - - 命令名称 - - - - - 命令参数 - - - - - 树节点选中事件参数 - - - - - 构造函数 - - 树节点 - 是否选中 - - - - 树节点 - - - - - 节点ID - - - - - 是否选中 - - - - - 树节点 - - - - - 设置属性的值 - - - - - - - 树实例 - - - - - 父节点 - - - - - 树节点集合 - - - - - 展开树节点是否回发 - - - - - 折叠树节点是否回发 - - - - - 单击树节点是否回发 - - - - - 点击按钮时需要执行的客户端脚本 - - - - - 命令名称 - - - - - 命令参数 - - - - - 是否选中 - - - - - 是否启用复选框 - - - - - 改变复选框状态是否自动回发 - - - - - 文本 - - - - - 树节点ID - - - - - 是否叶子节点 - - - - - 是否可用 - - - - - 是否展开 - - - - - 链接目标 - - - - - 链接地址 - - - - - 图标地址 - - - - - 预定义图标 - - - - - 提示文本 - - - - - 树节点控件集合 - - - - - 构造函数 - - 树实例 - 父节点 - - - - 插入树节点 - - 插入索引位置 - 树节点实例 - - - - 设置每个节点的Tree实例 - - - - - - 树节点的属性映射 - - - - - 映射源 - - - - - 映射目标 - - - - - 树节点的属性映射集合 - - - - - 窗体关闭事件参数 - - - - - 构造函数 - - 关闭参数 - - - - 关闭参数 - - - - - 表格行预绑定事件参数 - - - - - 构造函数 - - 行数据源 - 行索引 - - - - 是否取消添加本节点 - - - - - 行数据源(如果数据源为DataTable,则DataItem为DataRowView) - - - - - 行索引 - - - - - 表格分页事件参数 - - - - - 构造函数 - - 新页面的索引 - - - - 新页面的索引 - - - - - 表格行命令事件参数 - - - - - 构造函数 - - 行索引 - 列索引 - 命令名称 - 命令参数 - - - - 行索引 - - - - - 列索引 - - - - - 命令名称 - - - - - 命令参数 - - - - - 表格行绑定事件参数 - - - - - 构造函数 - - 行数据源 - 行索引 - 本行各列的值 - - - - 本行各列的值(渲染后的HTML片段) - - - - - 行数据源 - - - - - 行索引 - - - - - 表格行点击事件参数 - - - - - 构造函数 - - 行索引 - - - - 行索引 - - - - - 表格链接按钮列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 启用表头菜单 - - - - - 是否允许隐藏列 - - - - - 字段名称 - - - - - 字段格式化字符串 - - - - - 按钮文本 - - - - - 显示之前进行HTML编码(默认为true) - - - - - 是否在应用DataFormatString属性之后进行HTML编码(默认为true) - - - - - 是否可以回发 - - - - - 是否可用 - - - - - 点击按钮时需要执行的客户端脚本 - - - - - 提交之前需要验证的表单名称列表 - - - - - 验证失败时提示对话框弹出位置 - - - - - 验证失败时是否出现提示对话框 - - - - - 图标 - - - - - 图标地址 - - - - - 确认对话框标题 - - - - - 确认对话框内容 - - - - - 确认对话框提示图标 - - - - - 确认对话框弹出位置 - - - - - 命令名称 - - - - - 命令参数 - - - - - 是否启用AJAX - - - - - 区域控件 - - - - - Tab 控件必须包含在 TabStrip 中 - - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 是否可以拖动分隔条 - - - - - 位置 - - - - - Region控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 日期控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发日期选定事件 - - 事件参数 - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - [AJAX属性]选择的日期 - - - - - 日期格式 - - - - - 最大日期 - - - - - 最小日期 - - - - - 选择日期是否自动回发 - - - - - 日期选定事件(需要启用EnableDateSelect) - - - - - 工具条控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 页脚工具栏的排列位置 - - - - - 工具条的位置 - - - - - 工具条项集合 - - - - - 工具栏文本控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - [AJAX属性]文本 - - - - - 工具栏分隔符控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 工具栏左右分隔符控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 链接控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - [AJAX属性]文本 - - - - - [AJAX属性]点击链接时需要执行的客户端脚本 - - - - - [AJAX属性]链接地址 - - - - - [AJAX属性]链接目标 - - - - - 是否对文本编码 - - - - - 页面上下文帮助类(静态类),包括向页面注册脚本、刷新当前页面、页面重定向等实用函数 - - - - - 跳转到指定的Url - - - - - - 跳转到指定的Url,Target指定在哪个窗口中跳转(_self,_parent,_top) - - - _self,_parent,_top - - - - 刷新当前页面 - - - - - 刷新指定页面 - - 目标页面 - - - - 注册页面脚本 - - 客户端脚本 - - - - 树控件 - - - - - 构造函数 - - - - - 初始化控件 - - - - - 渲染 HTML 之前调用 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 绑定数据源 - - - - - - 如果一个节点不是叶子节点并且没有子节点,则应把它的Expanded设置为false,否则会引起页面死循环回发 - 同时处理 AutoLeafIdentification 属性 - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 处理回发事件 - - 事件参数 - - - - 触发节点绑定后事件 - - 事件参数 - - - - 触发节点预绑定事件 - - 事件参数 - - - - 触发节点选中事件 - - 事件参数 - - - - 触发节点点击事件 - - 事件参数 - - - - 触发节点展开事件 - - 事件参数 - - - - 触发节点展开事件 - - 事件参数 - - - - 触发节点延迟加载事件 - - 事件参数 - - - - 获取所有展开节点的ID数组 - - 节点的ID数组 - - - - 获取指定节点集合中所有展开节点的ID数组 - - 指定的节点集合 - 节点的ID数组 - - - - 获取所有展开节点的数组 - - 节点的数组 - - - - 获取指定节点集合中所有展开节点的数组 - - 指定的节点集合 - 节点的数组 - - - - 折叠所有节点 - - - - - 折叠指定节点集合中的所有节点 - - 指定的节点集合 - - - - 展开所有节点 - - - - - 展开指定节点集合中的所有节点 - - 指定的节点集合 - - - - 获取选中节点的ID数组 - - 节点的ID数组 - - - - 获取指定节点集合中选中节点的ID数组 - - 指定的节点集合 - 节点的ID数组 - - - - 获取选中节点的数组 - - 节点的数组 - - - - 获取指定节点集合中选中节点的数组 - - 指定的节点集合 - 节点的数组 - - - - 选中所有节点的复选框 - - - - - 选中指定节点的复选框 - - 指定的节点集合 - - - - 反选所有节点的复选框 - - - - - 反选指定节点的复选框 - - 指定的节点集合 - - - - 查找树节点 - - 节点ID - 树节点 - - - - 在指定的节点集合中查找树节点 - - 节点ID - 指定的节点集合 - 树节点 - - - - 获取展开全部节点的的客户端脚本 - - 客户端脚本 - - - - 获取折叠全部节点的的客户端脚本 - - 客户端脚本 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 单击切换节点的折叠展开状态 - - - - - 启用箭头 - - - - - 启用节点之间连线 - - - - - 启用动画 - - - - - 每次只能展开一个 - - - - - 启用图标 - - - - - 自动标识没有子节点的节点为叶子节点,而不必为每个设置设置 Leaf 属性(默认:true) - - - - - 启用多行选择 - - - - - 数据源 - - - - - 树节点集合 - - - - - 选中的树节点 - - - - - [AJAX属性]选中的树节点ID - - - - - [AJAX属性]选中的树节点ID列表 - - - - - 树控件属性与数据源节点的映射关系 - - - - - 选中行 - - - - - 展开的节点列表 - - - - - 选中的节点列表 - - - - - 树节点集合的 JSON 表示(内部使用) - - - - - 节点绑定后事件 - - - - - 节点预绑定事件 - - - - - 节点选中事件 - - - - - 节点点击事件 - - - - - 节点展开事件 - - - - - 节点展开事件 - - - - - 节点延迟加载事件 - - - - - 脚本(不和控件关联的脚本) - - - - - 脚本 - - - - - 层次(层次越高,注册越靠后)(缺省100) - 负值表示在所有注册脚本之前执行 - - - - - 容器面板控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 表单面板控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理列 - - - - - - 添加列 - - 行ID集合 - 开始行的索引(包含) - 结束行的索引(包含) - 行的列数 - - - - 添加Items变量 - - - - - - - - 取得当前行的列数 - - - - - - - 取得当前行 columnIndex 列的控件 - - - - - - - - 不支持此属性 - - - - - 表单行控件集合 - - - - - 表单行控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 格式化widths - - - - - - - 各列的宽度,空格分割 - - - - - 子控件集合 - - - - - 表单行控件集合 - - - - - 构造函数 - - 父控件实例 - - - - 分组面板控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 复选框控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发复选框状态改变事件 - - 事件参数 - - - - 文本 - - - - - [AJAX属性]是否选中 - - - - - 是否自动回发 - - - - - 复选框状态改变事件(需要启用AutoPostBack) - - - - - 简单的表单容器控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 窗体控件 - - - - - 构造函数 - - - - - 不向页面输出任何HTML代码,通过Javascript代码添加DIV标签 - - 输出流 - - - - 不向页面输出任何HTML代码,通过Javascript代码添加DIV标签 - - 输出流 - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取 Hidden 属性改变的 JavaScript 脚本 - Window 控件需要特殊处理,而不是像其他客户端组件一样调用 f_setVisible 函数 - - - - - 保存服务器控件的ClientID - 可以调用ActiveWindow.GetWriteBackValueReference在子页面向这些服务器控件写入值 - - - - - 获取窗体内IFrame回发页面的客户端脚本(比如:__doPostBack('','eventArgument');) - - 事件参数 - 客户端脚本 - - - - 获取窗体内IFrame回发的客户端脚本(触发PageManager的CustomEvent事件) - - 事件参数 - 客户端脚本 - - - - 获取窗体内IFrame回发的客户端脚本(触发PageManager的CustomEvent事件) - - 事件参数 - 是否在回发前验证表单(在PageManager上进行表单配置) - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - IFrame地址 - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - IFrame地址 - 窗体标题 - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - 窗体宽度 - 窗体高度 - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - 窗体标题 - 窗体宽度 - 窗体高度 - 客户端脚本 - - - - 获取显示窗体的客户端脚本 - - IFrame地址 - 窗体标题 - 窗体宽度 - 窗体高度 - 客户端脚本 - - - - 获取最大化窗体尺寸的客户端脚本 - - 客户端脚本 - - - - 获取恢复窗体尺寸的客户端脚本 - - 客户端脚本 - - - - 获取最小化窗体尺寸的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活Window的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活Window然后刷新页面的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活Window然后回发页面的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活Window然后回发页面的客户端脚本 - - 客户端脚本 - - - - 获取关闭当前激活Window然后执行脚本的客户端脚本 - - 执行的脚本 - 客户端脚本 - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 处理回发事件 - - 事件参数 - - - - 触发窗体关闭事件 - - 事件参数 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 为了放置不同页面的Window的ClientID发生冲突,加上GUID - - - - - [只读]Window的IFrameName必须是唯一的,在所有页面中是唯一的 - 所以不要手工定义Window的IFrameName - - - - - 窗口的位置 - - - - - 左上角位置 - - - - - 左上角位置 - - - - - 是否可以关闭 - - - - - 是否可以移动 - - - - - 是否可以最大化 - - - - - 是否可以最小化 - - - - - 最小高度 - - - - - 最小宽度 - - - - - 是否模式窗口 - - - - - 是否可以改变窗口大小 - - - - - 点击关闭按钮时需要执行的客户端脚本 - - - - - 关闭窗体的动作(点击关闭按钮或者按 ESC 键都会执行此动作) - - - - - 弹出窗口的目标位置(只有在EnableIFrame=true的情况下有效) - - - - - 窗体关闭事件(需要设置EnableClose=true和CloseAction=HidePostBack) - - - - - 表格排序事件参数 - - - - - 构造函数 - - 排序字段 - 排序方向 - 列索引 - - - - 排序字段 - - - - - 排序方向 - - - - - 列索引 - - - - - 表格控件 - - - - - 模板列占位符前缀 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 当前分页的开始行和结束行 - - - - - - 渲染开始标签 - - 输出流 - - - - 渲染结束标签 - - 输出流 - - - - 当在客户端修改了模板列中的值,调用此函数来告诉表格控件需要更新这些值; - 如果对表格重新进行了数据绑定,则不需要调用此函数,因为重新绑定后会更新表格的全部内容 - - - - - 绑定到数据源 - - - - - 清空Rows,同时清除所有子控件中的GridRow控件 - - - - - 获取用户修改的数据 - - - - - - 获取删除的行索引列表 - - - - - - 获取新增的行数据 - - - - - - 获取用户修改的行数据 - - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 接受用户编辑单元格(同时消除编辑单元格左上方的红色提示图标) - - - - - 获取接受用户编辑单元格的客户端脚本(同时消除编辑单元格左上方的红色提示图标) - - 客户端脚本 - - - - 拒绝用户编辑单元格(同时消除编辑单元格左上方的红色提示图标) - - - - - 获取拒绝用户编辑单元格的客户端脚本(同时消除编辑单元格左上方的红色提示图标) - - - - - 清空表格选中项 - - - - - 获取清空表格选中项的客户端脚本 - - 客户端脚本 - - - - 添加一条新纪录 - - 缺省值 - - - - 添加一条新纪录 - - 缺省值 - 是否添加到末尾 - - - - 获取添加一条新纪录的客户端脚本 - - 缺省值 - 客户端脚本 - - - - 获取添加一条新纪录的客户端脚本 - - 缺省值 - 是否添加到末尾 - 客户端脚本 - - - - 删除选中行(或者单元格) - - - - - 获取删除选中行(或者单元格)的客户端脚本 - - 客户端脚本 - - - - 获取表格是否有选中项的客户端脚本 - - 客户端脚本 - - - - 获取表格选中项数的客户端脚本 - - 客户端脚本 - - - - 获取表格选中单元格的客户端脚本(仅用于AllowCellEditing模式) - - 客户端脚本 - - - - 获取表格没有任何选中项时在本窗口弹出提示对话框的客户端脚本 - - 客户端脚本 - - - - 获取表格没有任何选中项时在本窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取表格没有任何选中项时在本窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 客户端脚本 - - - - 获取表格没有任何选中项时在父级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 客户端脚本 - - - - 获取表格没有任何选中项时在父级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取表格没有任何选中项时在父级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 客户端脚本 - - - - 获取表格没有任何选中项时在顶级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 客户端脚本 - - - - 获取表格没有任何选中项时在顶级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取表格没有任何选中项时在顶级窗口弹出提示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 对话框图标 - 客户端脚本 - - - - 通过列ID获取列实例 - - 列ID - 列实例 - - - - 通过列索引获取列实例 - - 列索引 - 列实例 - - - - 选中所有行(设置SelectedRowIndexArray属性) - - - - - 展开全部的行扩展列 - - - - - 折叠全部的行扩展列 - - - - - 处理回发事件 - - 事件参数 - - - - 获取Columns前面的列(比如索引列,选择框列) - - - - - - 触发排序事件 - - 事件参数 - - - - 触发绑定前事件 - - 事件参数 - - - - 触发行绑定前事件 - - 事件参数 - - - - 触发行绑定后事件 - - 事件参数 - - - - 触发行内事件 - - 事件参数 - - - - 触发页索引改变事件 - - 事件参数 - - - - 触发行点击事件 - - 事件参数 - - - - 触发行双击事件 - - 事件参数 - - - - 触发行选中事件 - - 事件参数 - - - - 触发结束编辑事件 - - 事件参数 - - - - 装载控件状态 - - - - - - 保存控件状态 - - - - - - 初始化 - - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 允许单元格编辑 - - - - - 编辑单元格时点击单元格的次数(默认为2次) - - - - - 允许列锁定 - - - - - 允许服务器端分页 - - - - - 是否数据库分页 - - - - - 服务器端分页后清空选中的行 - - - - - 每页显示项数 - - - - - [AJAX属性]当前显示页索引 - - - - - [AJAX属性]总页数 - - - - - [AJAX属性]记录的总个数 - - - - - 允许服务器端排序 - - - - - 排序方向("ASC", "DESC") - - - - - 当前排序字段(只读) - - - - - 启用合计行 - - - - - [AJAX属性]合计行数据 - - - - - 合计行的位置 - - - - - 数据为空时显示在内容区域的文本,可以是HTML标签 - - - - - 行中文字的垂直排列位置(默认为Middle) - - - - - 是否延迟渲染 - - - - - 展开所有的行扩展列 - - - - - 启用表格中的文字选择 - - - - - 显示表格表头 - - - - - 显示分页工具条右侧的分页信息 - - - - - 启用表头菜单 - - - - - 启用表格列分隔线(默认为false) - - - - - 启用表格行分隔线(默认为true) - - - - - 启用交替行显示不同的颜色 - - - - - 启用鼠标移动到行的颜色 - - - - - 选中行是否自动回发 - - - - - 点击行是否自动回发 - - - - - 双击行是否自动回发 - - - - - 结束编辑是否自动回发(需要启用AllowCellEditing) - - - - - 自动扩展宽度以填充剩余空间的列(ColumnID) - - - - - 成比例改变表格各列的宽度,以防止出现水平滚动条(第一次加载和之后改变表格宽度时都有效) - - - - - 启用多选框 - - - - - 只能通过多选框选中行(仅在启用EnableCheckBoxSelect属性时有效) - - - - - 启用多行选择 - - - - - [AJAX属性]选中行的索引(列表中的第一项) - - - - - [AJAX属性]选中的单元格([行索引,列索引]) - - - - - [AJAX属性]选中行的索引列表 - - - - - [AJAX属性]隐藏的列名称列表(逗号分隔) - - - - - 数据源 - - - - - 行关键字段 - - - - - 行关键字段的值 - - - - - 分页工具条项集合 - - - - - 全部的列 - - - - - 列数据 - - - - - 行数据 - - - - - 保存的行数据(内部使用) - - - - - 排序事件 - - - - - 绑定前事件 - - - - - 行绑定前事件 - - - - - 行绑定后事件 - - - - - 行内事件 - - - - - 页索引改变事件 - - - - - 行点击事件(需要启用EnableRowClick) - - - - - 行双击事件(需要启用EnableRowDoubleClick) - - - - - 行选中事件(需要启用EnableRowSelect) - - - - - 结束编辑事件(需要启用EnableAfterEditEvent) - - - - - 表格数据绑定列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 是否可用 - - - - - 字段名称 - - - - - 字段格式化字符串 - - - - - 处理数据库中null值,默认为空字符串 - - - - - 显示之前进行HTML编码(默认为true) - - - - - 是否在应用DataFormatString属性之后进行HTML编码(默认为true) - - - - - 表格复选框列 - - - - - 取得单元格的数据 - - - - - - - - 本行的复选框是否处于选中状态 - - 行索引 - 选中状态 - - - - 设置本列复选框的选中状态 - - 行索引 - 是否选中 - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 是否可用(只在RenderAsStaticField=false时有效) - - - - - 是否自动回发(只在RenderAsStaticField=false时有效) - - - - - 字段名称 - - - - - 渲染为静态图片,否则渲染为可编辑的复选框 - - - - - 显示列头复选框(只在RenderAsStaticField=false时有效) - - - - - 是否启用AJAX - - - - - 命令名称 - - - - - 命令参数 - - - - - 表格窗体列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 启用表头菜单 - - - - - 是否允许隐藏列 - - - - - 是否可用 - - - - - 对应的窗体控件ID - - - - - 窗体标题对应的字段名称 - - - - - 窗体标题对应的字段格式化字符串 - - - - - 字段名称 - - - - - 字段格式化字符串 - - - - - 显示之前进行HTML编码(默认为true) - - - - - 是否在应用DataFormatString属性之后进行HTML编码(默认为true) - - - - - 绑定到IFrame地址的字段名称列表 - - - - - 绑定到IFrame地址的字段格式化字符串 - - - - - 对每个绑定到IFrame地址的字段进行URL编码(默认为true) - - - - - IFrame地址 - - - - - 显示文本 - - - - - 标题 - - - - - 图标 - - - - - 图标地址 - - - - - 表格图片列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 图片地址字段 - - - - - 图片地址字段格式化字符串 - - - - - 图片的宽度 - - - - - 图片的高度 - - - - - 表格模板列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 模板容器 - - - - - 是否渲染为行扩展列 - - - - - 双击展开折叠行扩展列 - - - - - 回车按键展开折叠行扩展列 - - - - - 点击图标展开折叠行扩展列时选中行 - - - - - 表格超链接列 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 是否可用 - - - - - 字段名称 - - - - - 字段格式化字符串 - - - - - 绑定到超链接地址的字段名称列表 - - - - - 对每个绑定到超链接地址的字段进行URL编码(此属性废弃,请使用UrlEncode属性) - - - - - 对每个绑定到超链接地址的字段进行URL编码(默认为true) - - - - - 绑定到超链接地址的字段格式化字符串 - - - - - 打开超链接的目标框架 - - - - - 超链接地址 - - - - - 超链接文本 - - - - - 显示之前进行HTML编码(默认为true) - - - - - 是否在应用DataFormatString属性之后进行HTML编码(默认为true) - - - - - 表格列集合 - - - - - 构造函数 - - 父控件实例 - - - - 用来作为模板列的数据绑定容器,实现了IDataItemContainer接口 - - - - - 构造函数 - - 数据源 - 行索引 - - - - 控件初始化事件 - - 事件参数 - - - - 渲染开始标签 - - ASP.NET服务器控件输出流 - - - - 渲染结束标签 - - ASP.NET服务器控件输出流 - - - - 数据源(IDataItemContainer成员) - - - - - 数据项索引(IDataItemContainer成员) - - - - - 数据项在控件中显示位置的索引(IDataItemContainer成员) - - - - - 表格行 - - - - - 构造函数 - - - - - 构造函数 - - 表格实例 - 行对应的数据源(在回发时为null) - 行序号 - - - - 当前行列状态列表 - - - - - - 恢复当前行列状态列表(同时更新相应的Values值) - - - - - - 更新当前行某列的渲染后的HTML - - - - - - 表格行中模板列控件列表(数据绑定时自动生成每个模板列控件ID,回发时从FState中回发模板列控件ID) - - - - - 绑定行的值 - - - - - 查找表格行内的控件 - - - - - - - 表格实例 - - - - - 本行对应的数据源(不维护状态) - - - - - 第几行 - - - - - 此行的状态信息 - - - - - 此行DataKeyNames字段的值 - - - - - 非公开属性,对于CheckBoxField可以通过GetCheckedState访问 - - - - - 表格行中模板列控件列表,一个典型的例子为:[GridRowControl, null, null, GridRowControl, null, null, null, null, null] - - - - - 表格行控件集合 - - - - - 列表项 - - - - - 构造函数 - - - - - 构造函数 - - 文本 - 值 - - - - 构造函数 - - 文本 - 值 - 是否选中 - - - - 是否选中 - - - - - 显示的文本 - - - - - 值 - - - - - 是否可选择 - - - - - 模拟树的层次(从0开始为根节点) - - - - - 列表项集合 - - - - - 通过文本查找列表项 - - 文本 - 列表项 - - - - 通过文本查找列表项 - - 文本 - 是否去除HTML标签 - 列表项 - - - - 通过值查找列表项 - - 值 - 列表项 - - - - 添加列表项 - - 文本 - 值 - 新元素的插入位置 - - - - 下拉列表控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 绑定到数据源 - - - - - 绑定到数据表格 - - 数据表格 - - - - 绑定到可枚举类型 - - 可枚举类型 - - - - 取得属性值 - - - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发选中项改变事件 - - 事件参数 - - - - 文本框为空时显示的文本 - - - - - [AJAX属性]用户输入的文本(只有在允许编辑和不强制选择的情况下才有效) - - - - - [AJAX属性]选中项的值 - - - - - [AJAX属性]选中项的索引 - - - - - 选中项的文本 - - - - - 选中项 - - - - - [AJAX属性]选中项的值 - - - - - [AJAX属性]选中项的索引 - - - - - 选中项 - - - - - 下拉列表和字段的宽度相匹配 - - - - - 如果未定义选中项,则自动选中第一个子项(默认为true) - - - - - 是否可以选择多项 - - - - - 选择多项的分隔符 - - - - - 是否强制选中下拉列表中的项(启用编辑的情况下) - - - - - 是否可编辑,以便在录入时自动过滤下拉框中的值 - - - - - 是否启用模拟树显示 - - - - - 模拟树显示时指示所在层次的数据字段 - - - - - 是否可选择的字段 - - - - - 是否自动回发 - - - - - 显示文本字段 - - - - - 显示文本的格式化字符串 - - - - - 显示值字段 - - - - - 数据源 - - - - - 保存的列表项数据(内部使用) - - - - - 列表项集合 - - - - - 选中项改变事件(需要启用AutoPostBack) - - - - - 文本控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 是否对文本编码 - - - - - [AJAX属性]文本 - - - - - 多行文本框控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不支持此属性 - - - - - 是否自动增长高度 - - - - - 自动增长的最大高度 - - - - - 自动增长的最小高度 - - - - - 是否总是隐藏滚动条 - - - - - 选项卡控件 - - - - - 构造函数 - - - - - Tab 控件必须包含在 TabStrip 中 - - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 获取 Hidden 属性改变的 JavaScript 脚本 - Tab 控件需要特殊处理,而不是像其他客户端组件一样调用 f_setVisible 函数 - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 获取显示选项卡的客户端脚本 - - 客户端脚本 - - - - 获取隐藏选项卡的客户端脚本 - - 客户端脚本 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 是否可以关闭 - - - - - 选项卡面板控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 处理回发事件 - - 事件参数 - - - - 触发选项卡改变事件 - - 事件参数 - - - - 获取添加选项卡的脚本 - - 选项卡ID - IFrame地址 - 选项卡标题 - 是否可以关闭 - 客户端脚本 - - - - 获取添加选项卡的脚本 - - 选项卡ID - IFrame地址 - 选项卡标题 - 选项卡图标 - 是否可以关闭 - 客户端脚本 - - - - 获取移除选项卡的脚本 - - 选项卡ID - 客户端脚本 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - 布局类型 - - - - - 切换选项卡时是否自动回发 - - - - - 是否启用右键菜单(可用来关闭当前Tab和所有其他Tab) - - - - - 选项卡显示的位置 - - - - - [AJAX属性]激活选项卡的索引 - - - - - 当前激活的选项卡 - - - - - 选项卡集合 - - - - - 选项卡改变事件 - - - - - 面板控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - HTML编辑框控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发数据 - 回发到服务器,判断控件的属性是否变化, - 如果变化返回true,则RaisePostDataChangedEvent - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发文本改变事件 - - 事件参数 - - - - 不支持此属性 - - - - - 不支持此属性 - - - - - [AJAX属性]文本 - - - - - 启用左右定位 - - - - - 启用颜色 - - - - - 启用字体 - - - - - 启用调整字体大小 - - - - - 启用格式化 - - - - - 启用创建链接 - - - - - 启用创建列表 - - - - - 启用源码视图 - - - - - 字体列表 - - - - - 启用中文字体 - - - - - 文本改变事件 - - - - - 日期选择框控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发日期选定事件 - - 事件参数 - - - - 是否允许编辑 - - - - - 选择的日期 - - - - - 启用中文智能识别,手工输入时如果不匹配指定格式,会尝试按照下面几种格式解析:yyyy-MM-dd、yyyy-M-d、yyyyMMdd、yyyyMd、yy-MM-dd、yy-M-d、yyMMdd、yyMd - - - - - 尝试解析日期的格式列表 - - - - - 日期格式 - - - - - 最大日期 - - - - - 最小日期 - - - - - 选择日期是否自动回发 - - - - - 日期选定事件(需要启用EnableDateSelect) - - - - - 选项卡集合 - - - - - 构造函数 - - 父控件实例 - - - - 控件相关脚本 - - - - - 要注册脚本的控件 - - - - - 脚本 - - - - - 布局类型 - - - - - 容器布局(默认值) - - - - - 锚点布局 - - - - - 区域布局 - - - - - 自适应布局(用于只有一个子控件的情况) - - - - - 手风琴布局(只用于Accordion控件) - - - - - 表单布局(用于SimpleForm和Form控件) - - - - - 卡片布局(只用于TabStrip控件) - - - - - 列布局 - - - - - 绝对定位布局 - - - - - 表格布局 - - - - - 垂直盒子布局 - - - - - 水平盒子布局 - - - - - 布局类型名称 - - - - - 数字输入框控件 - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 不允许小数 - - - - - 不允许负数 - - - - - 最大值 - - - - - 最小值 - - - - - 小数点后的位数(默认为2) - - - - - 文本框类型 - - - - - 普通文本框(默认值) - - - - - 密码输入框 - - - - - 文本框类型名称 - - - - - 提示框的类型 - - - - - Extjs的浮动提示框(默认值) - - - - - HTML标签的title属性 - - - - - 提示框的类型名称 - - - - - JavaScript帮助类 - - - - - 获取一段完成的JavaScript函数 - - 函数主体 - 函数参数 - 字符串表示的JavaScript函数 - - - - 获取延迟执行JavaScript脚本的字符串 - - 需要执行的脚本内容 - 延迟毫秒数 - 延迟执行的客户端脚本 - - - - 获取延迟执行JavaScript脚本的字符串 - - 需要执行的脚本内容 - 延迟毫秒数 - 执行脚本时的函数上下文 - 延迟执行的客户端脚本 - - - - 返回的是单引号括起来的字符串,用来作为JSON属性比较合适 - - 源字符串 - 单引号括起来的字符串 - - - - 将包含JavaScript代码块的字符串转换为可以使用的客户端脚本 - - 包含JavaScript代码块的字符串 - 转换后的客户端脚本 - - - - 获取字符串数组的脚本字符串形式 - - 字符串数组 - 字符串数组的脚本字符串 - - - - 获取整形数组的脚本字符串形式 - - 整数数组 - 整形数组的脚本字符串 - - - - 将数字对象转化为字符串 - - 数字对象 - 字符串 - - - - 对话框帮助类 - - - - - 默认提示对话图标 - - - - - 显示对话框 - - - - - 获取显示对话框的客户端脚本 - - 客户端脚本 - - - - 显示对话框 - - 消息正文 - - - - 显示对话框 - - 消息正文 - 标题 - - - - 显示对话框 - - 消息正文 - 图标 - - - - 显示对话框 - - 对话框消息 - 对话框标题 - 点击确定按钮执行的客户端脚本 - - - - 显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - - - - 显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - - - - 显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - 显示对话框的目标页面 - - - - 显示对话框 - - 对话框消息 - 对话框标题 - - 点击确定按钮执行的客户端脚本 - 显示对话框的目标页面 - 自定义对话框图标 - 自定义对话框图标地址 - - - - 在父页面中显示对话框 - - 消息正文 - - - - 在父页面中显示对话框 - - 消息正文 - 标题 - - - - 在父页面中显示对话框 - - 消息正文 - 图标 - - - - 在父页面中显示对话框 - - 对话框消息 - 对话框标题 - 点击确定按钮执行的客户端脚本 - - - - 在父页面中显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - - - - 在父页面中显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - - - - 在顶层窗口中显示对话框 - - 消息正文 - - - - 在顶层窗口中显示对话框 - - 消息正文 - 对话框标题 - - - - 在顶层窗口中显示对话框 - - 消息正文 - 自定义对话框图标 - - - - - - 消息正文 - 对话框标题 - 点击确定按钮执行的客户端脚本 - - - - - - 消息正文 - 对话框标题 - 自定义对话框图标 - - - - 在顶层窗口中显示对话框 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 自定义对话框图标 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - 显示对话框的目标页面 - 客户端脚本 - - - - 获取显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - - 点击确定按钮执行的客户端脚本 - 显示对话框的目标页面 - - 自定义对话框图标地址 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 自定义对话框图标 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 获取在父页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 自定义对话框图标 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 获取在最上层页面中显示对话框的客户端脚本 - - 对话框消息 - 对话框标题 - 自定义对话框图标 - 点击确定按钮执行的客户端脚本 - 客户端脚本 - - - - 对话框消息正文 - - - - - 对话框标题 - - - - - 对话框图标 - - - - - 点击确认按钮执行的JavaScript脚本 - - - - - 对话框的目标位置 - - - - - 自定义对话框图标地址 - - - - - 自定义对话框图标 - - - - - 消息框图标类型 - - - - - 信息(默认值) - - - - - 警告 - - - - - 问题 - - - - - 错误 - - - - - 消息框图标类型名称 - - - - - 创建Javascript对象参数的帮助类 - - - - - 构造函数 - - - - - 构造函数 - - 属性名 - 属性值 - - - - 构造函数 - - 属性名 - 属性值 - 是否保持原样 - - - - 删除属性 - - 属性名 - - - - 是否包含属性 - - 属性名 - - - - - 添加属性 - - 属性名 - 属性值 - - - - 添加属性 - - 属性名 - 属性值 - 是否保持原样 - - - - 获取属性 - - 属性名 - 属性值 - - - - 返回对象的JSON字符串形式 - - 对象的JSON形式 - - - - 已经添加属性的个数 - - - - - 资源帮助类 - - - - - 获取嵌入资源的 res.axd 地址 - - 资源名称 - 资源地址 - - - - 获取嵌入资源的 res.axd 地址 - - 页面对象 - 资源名称 - 资源地址 - - - - 获取嵌入资源的地址 - - 资源名称 - 资源地址 - - - - 获取嵌入资源的地址 - - 页面实例 - 资源名称 - 资源地址 - - - - 取得资源的内容 - - 资源名称 - 资源内容 - - - - 取得资源的二进制内容 - - 资源名称 - 资源的二进制内容 - - - - 获取空白图片的地址 - - 空白图片的地址 - - - - 常量 - - - - - 绝对脚本的默认级别(仅内部使用) - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 文件类型 - - - - - 配置字段名称 - - - - - 字段属性名称 - - - - - 字段属性值 - - - - - 属性分类的名称 - - - - - 基本属性 - - - - - 属性 - - - - - 表单验证 - - - - - 布局 - - - - - 事件 - - - - - 文本框控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 文本框类型 - - - - - FineUI在Web.config中的配置节 - - - - - 主题 - - - - - 语言 - - - - - 表单验证消息的提示位置 - - - - - 表单中标签的位置 - - - - - 表单控件右侧距离边界的距离 - - - - - 表单控件标签的宽度 - - - - - 表单控件标签的分隔符 - - - - - 启用AJAX - - - - - 启用AJAX加载提示信息 - - - - - AJAX提示信息的类型 - - - - - 客户端AJAX超时时间 - - - - - 是否启用大字体(将ExtJS所有11px字体改为12px) - - - - - 是否启用调试模式 - - - - - JS文件夹所在的根目录 - - - - - 图标所在的根目录 - - - - - 自定义主题所在的根目录 - - - - - 自定义主题名称 - - - - - 是否启用FState压缩(默认为false) - - - - - 是否向页面输出IE=edge标识 - - - - - 是否启用表单改变确认对话框 - - - - - 存在 Page.Items 上下文中,向页面注册资源 - - - - - 需要向页面注册的样式列表 - - - - - 确保ResourceManager实例的Page和当前页面一致 - - - - - - 准备呈现页面内容,在保存页面状态之前 - - - - - - - 注册页面第一次加载时的样式和脚本 - - - - - 注册页面脚本 - - - - - 是否注册startup脚本 - - - - - - - 取得页面初始化时脚本 - - - - - - - 返回经过排序的 _startupControlScriptList 列表,子控件排在父控件的前面 - - - - - - 取得应该将Script插入的位置 - 要能够向上回溯,因为控件的父控件可能不存在列表中,而父控件的父控件存在列表中 - - - - - - - - 添加样式 - - - - - - - - 删除已经添加的CSS样式 - - - - - - 添加脚本 - 相同控件的脚本合并在一起(30372245@qq.com 2008-7-4) - - - - - - - - 控件control的注册脚本是否存在 - - - - - - - AJAX时每个控件需要注册的脚本 - - - - - AJAX时不依赖控件的脚本 - - - - - AJAX时使用到的所有短名称列表 - 比如:F('SimpleForm1_tbxUserName') -> cmp0 - F('SimpleForm1_tbxPassword') -> cmp1 - - - - - 取得 ResourceManager 的实例,单件模式 - - - - - 复选框列表控件 - - - - - 构造函数 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 绑定到数据源 - - - - - 绑定到数据表 - - - - - - 绑定到可枚举列表 - - - - - - 取得属性值 - - - - - - - 处理回发数据 - - 回发数据键 - 回发数据集 - 回发数据是否改变 - - - - 触发回发数据改变事件 - - - - - 触发选中项改变事件 - - 事件参数 - - - - 是否必填项 - - - - - 为空时提示信息 - - - - - 是否自动回发 - - - - - 渲染成几列 - - - - - 是否按照纵向顺序渲染 - - - - - 显示文本的数据字段 - - - - - 显示文本的格式化字符串 - - - - - 显示值的数据字段 - - - - - 数据源 - - - - - [AJAX属性]选中项的值 - - - - - [AJAX属性]选中项的索引 - - - - - 选中项 - - - - - 复选框集合 - - - - - 保存的复选框数据(内部使用) - - - - - 选中项改变事件(需要启用AutoPostBack) - - - - - 复选框列表项 - - - - - 构造函数 - - - - - 构造函数 - - 文本 - 值 - - - - 构造函数 - - 文本 - 值 - 是否选中 - - - - 是否选中 - - - - - 显示的文本 - - - - - 值 - - - - - 复选项集合 - - - - - 通过文本查找复选项 - - 文本 - 复选项 - - - - 通过文本查找复选项 - - 文本 - 是否去除HTML标签 - 复选项 - - - - 通过值查找复选项 - - 值 - 复选项 - - - - 添加复选项 - - 文本 - 值 - 新元素的插入位置 - - - - 时间选择框控件 - - - - - 渲染 HTML 之前调用(AJAX回发) - - - - - 渲染 HTML 之前调用(页面第一次加载或者普通回发) - - - - - 处理回发事件 - - 事件参数 - - - - 触发日期选择事件 - - 事件参数 - - - - 是否允许编辑 - - - - - 选择的时间 - - - - - 尝试解析时间的格式列表 - - - - - 时间格式(默认为HH:mm,24小时制,比如“20:30”) - - - - - 最大时间 - - - - - 最大时间的字符串形式 - - - - - 最小时间 - - - - - 最小时间的字符串形式 - - - - - 列表中每个时间值相差的分钟数(默认为15分钟) - - - - - 选择时间是否自动回发 - - - - - 日期选择事件(需要启用EnableDateSelect) - - - - diff --git a/FineUI/release_history.txt b/FineUI/release_history.txt index d9a894f..2369e0f 100644 --- a/FineUI/release_history.txt +++ b/FineUI/release_history.txt @@ -29,23 +29,112 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, 发布历史 ++2016-01-04 v4.2.3 + -修正表格后台无法更新选中行的问题(丝路、black_shrimp-7649)。 + -更新表格控件->模板列->购物车示例,数量输入框只允许输入数字(揣兜-7654)。 + -官网示例首页树菜单增加提示信息,在NodeDataBound中进行处理。 + +树控件增强。 + -树节点增加CssClass属性,增加示例:树控件->杂项->节点样式。 + -树控件增加EnableTextSelection属性,增加示例:树控件->杂项->启用文字选择。 + -增加示例:树控件->杂项->同级节点只能展开一个;右键菜单(展开全部子节点)(揣兜-7653)。 + -增加示例:更多控件->手风琴控件->手风琴(禁用填充)。 + -修正RenderCheckField的失去焦点事件中得到e.RowIndex=-1的问题(叶子)。 + -修正在顶层页面弹出EnableIFrame的窗体控件,先关闭父页面后无法关闭弹出窗体的问题(7107135-7683)。 + -增加示例:更多控件->工具栏和菜单->工具栏布局(左中右)。 + -增加示例:表格控件->扩展列->行扩展列(嵌套表格)(spring2007-7668)。 + -修正不同域的IFrame中,在IFrame内弹出窗体时出现拒绝访问的问题。 + -修正在弹出窗体中使用ASP.NET的原生FileUpload控件时无法关闭窗体的问题(ζั͡ޓއއ人-7767)。 + -表格增加KeepCurrentSelection属性,增加示例:行选择->行选择(保持选中行)(cubealex、shihahayue-7861)。 + -修正res.axd导致的安全漏洞(cnblogs.com/dotnet-org-cn/p/5089924.html)。 + + + ++2015-11-09 v4.2.2 + -官网示例总数突破300个! + -更新示例,如果PageManager定义了AutoSizePanelID属性,则去除页面的CSS定义:body.f-body。 + -修正自定义提示对话框图标无效的问题(莮亾-7615)。 + -Alert、Confirm增加CssClass属性。更新示例:杂项->消息框->自定义对话框图标。 + +表格增强。 + -单元格编辑表格重新绑定数据时,先取消当前活动的编辑器(andyxjy2-7559)。 + -单元格编辑表格底层传输数据优化(不兼容提醒!),将修改和删除数据合并,由原来的:[[1,0,{"AtSchool":false}]] + 改为:[{"index":1,"originalIndex":0,"id":"record-3","values":{"AtSchool":false},"status":"modified"}]。 + -为FieldType增加枚举类型Double(精度为15~16),Float的精度为6~7。 + +一个函数获取单元格编辑的全部内容(GetMergedData),包含新增、删除、修改的数据。 + -新增示例:单元格编辑->新增删除->新增行与删除行(GetMergedData)。 + -表格增加DataIDField属性,GridRow增加RowID属性。 + -表格服务器事件参数增强,主要是增加RowID属性,并和之前兼容。 + -将GetDeleteSelectedReference标识为已过时,请使用GetDeleteSelectedRowsReference。 + +为GetAddNewRecordReference增加重载函数,可以指定增加行后进入编辑状态的列。 + -增加示例:单元格编辑->新增删除->新增行(定位到某一列)。 + -增加示例:单元格编辑->结束编辑->结束编辑(姓名不能为空);结束编辑(高亮单元格);结束编辑(更新单元格的值); + 结束编辑(更新非可编辑单元格的值)。 + +SelectedCell的数据类型由int[]改为string[](不兼容提醒!)。 + -更新示例:单元格编辑->新增删除行->服务器端删除行。 + -增加示例:单元格编辑->结束编辑->结束编辑(绑定数据后选中单元格)。 + -增加属性SelectedRowIDArray、SelectedRowID。 + -增加属性EnableRowDeselectEvent,更新示例:事件->行选中事件(取消选中事件)。 + -表格列增加MinWidth,增加示例:列宽度->自适应列(多列);各列宽度自适应(最小列宽度)。 + -表格增加EnableColumnResize属性,增加示例:标题栏菜单->隐藏标题栏;禁用表头菜单。 + +优化导出文件的脚本。 + -__doPostBack第一个参数指定是否AJAX请求,例如:__doPostBack(false, '', 'Confirm_OK')。 + -JS变量F.control_enable_ajax更名为F.controlEnableAjax(不兼容提醒!)。 + -GetCustomEventReference第一个参数指定是否AJAX请求,例如:GetCustomEventReference(false, "Confirm_OK")。 + -更新示例:杂项->消息框->响应确定按钮(点击确定按钮后,下载文件);响应确定按钮(点击确定按钮后,先隐藏窗体再下载文件); + 响应确定按钮(点击确定按钮后,先隐藏IFrame窗体再下载文件)。 + -增加示例:表格控件->导出与下载->导出文件(双击下载);杂项->消息框->自定义对话框按钮文本。 + +表单增强。 + -增加配置项:FormRowItemsSpace(表单行子项之间的间距,默认为8px,对应于Form的FormRowItemsSpace属性)。 + -Form控件重构,FormRow作为面板渲染到客户端,可以显示隐藏。 + -Form中的表单元素响应Tab键时横向跳转,更加符合用户习惯(之前是纵向跳转)。 + -更新示例:表单控件->杂项->隐藏表单字段;禁用与只读。 + -增加示例:表单布局->标签文本水平居中;表单中的多行按钮; + -增加示例:杂项->自定义标签宽度和位置;标签换行;ColumnWidths混合使用百分比和固定宽度。 + + + ++2015-10-22 v4.2.1 + +修正部分IE11下出现的JS错误。 + -无法获取未定义或null引用的属性 ext-quicktips-tip_header-overflowPadderEl(baolin1389、♂♂LOVE、meng)。 + +仅对表格内存分页有部分影响(不兼容提醒!)。 + -表格属性SelectedRowIndex、SelectedRowIndexArray指的是在当前分页中的索引(和之前兼容,无需修改)。 + +表格所有其他地方的RowIndex指的是在全部数据源中的索引(和之前不兼容,需要注意)。 + -所有表格事件参数RowIndex属性,包括GridAfterEditEventArgs、GridRowClickEventArgs等。 + -获取单元格编辑修改值grid1.GetModifiedDict,以及删除的行GetDeletedList。 + -表格行实例的RowIndex属性。 + -CheckBoxField的函数GetCheckedState的参数。 + -增加示例:杂项->拦截服务器端重定向(模拟登陆超时,同步确认对话框);(同步确认对话框)。 + -客户端函数F.alert、F.confirm参数调整,接受options对象参数。 + -修正日期控件的星期中文缩写错误的问题(dzvane-7271)。 + -修正新增的行无法清空的问题(tyarist-7284)。 + -新增示例:表格控件->单元格编辑->多行文本输入框。 + -面板标题可以为空字符串。 + +为面板增加MinHeight、MinWidth、MaxHeight、MaxWidth属性。 + -增加示例:更多控件->面板与窗体->窗体(限制最小和最大尺寸)。 + -表单字段增加LabelAlign属性。 + -增加示例:页面布局->布局(VBox,折叠面板);布局(HBox,横向表单);布局(VBox,表单); + 布局(VBox,折叠面板);布局(VBox,纵向滚动条);布局(VBox,自动高度);布局(VBox,表单与表格,纵向滚动条); + 布局(HBox,横向滚动条);布局(HBox,自动高度);布局(HBox,自动高度,多层嵌套); + 布局(Table,Table布局的表单);布局(Column,纵向滚动条);布局(Column,自动高度)。 + -启用单元格编辑的表格调用DataBind时会重新加载数据(客户端新增的行也会被清除)。 + -增加示例:更多控件->面板与窗体->窗体(固定最大化)。 + -增加示例:更多控件->工具栏和菜单->工具栏上的表单字段。 + -增加示例:表单控件->下拉列表控件->下拉列表(默认为空);事件->下拉列表(自动回发); + 下拉列表(自动回发,可编辑,强制选择);下拉列表(不自动回发,定义了回发事件); + 下拉列表(多选,自动回发,可编辑,强制选择)。 + + + + +2015-05-20 v4.2.0 - -增加示例:其他控件->面板与窗体->同时打开多个窗体。 + -增加示例:更多控件->面板与窗体->同时打开多个窗体。 -增加示例:第三方组件->jQueryUI Autocomplete->内联数据(位于Window控件中)。 - -增加示例:其他控件->工具栏与菜单->工具栏上的图片(固定宽度);工具栏上的图片(动态调整)。 + -增加示例:更多控件->工具栏与菜单->工具栏上的图片(固定宽度);工具栏上的图片(动态调整)。 -修正删除不存在的选项卡时可能出现的错误(揣兜-7085)。 +表格增强。 -增加示例:行与列样式->行样式(数据库分页);行样式(内存分页);列样式。 -增加示例:序号列->序号列(靠左显示)(dennisliu)。 -更新示例:杂项->文本居中显示(标题靠左)。 -增加示例:事件->行内按钮事件(内存分页);行内按钮事件(数据库分页)。 - +仅对表格内存分页有部分影响(不兼容提醒!)。 - -表格属性SelectedRowIndex、SelectedRowIndexArray指的是在当前分页中的索引(和之前兼容,无需修改)。 - +表格所有其他地方的RowIndex指的是在全部数据源中的索引(和之前不兼容,需要注意)。 - -所有表格事件参数RowIndex属性,包括GridAfterEditEventArgs、GridRowClickEventArgs等。 - -获取单元格编辑修改值grid1.GetModifiedData返回的键值。 - -表格行实例的RowIndex属性。 - -CheckBoxField的函数GetCheckedState的参数。 +修正一直存在的一个隐藏问题。 -此问题仅在用户多次快速点击页面上的回发按钮,并且网速比较慢时才可能会出现。 -关于如何重现本问题以及内部原因,请搜索论坛 - 验证视图状态MAC失败。 @@ -65,11 +154,11 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -修正下拉列表数据绑定后在第一个位置插入项,而最终选中的非第一项的问题。 -修正下拉列表在没有数据项时,可能会触发SelectedIndexChanged事件的问题。 -BoxLayoutAlign的默认值由Start改为Stretch。 - -增加示例:其他控件->选项卡控件->选项卡的位置。 + -增加示例:更多控件->选项卡控件->选项卡的位置。 -更新示例:表单控件->杂项->禁用与只读。 -修正AutoSizePanelID的面板中Submit按钮回车无效的问题(Ward_Lee)。 +支持一个面板拥有多个工具栏。 - -增加示例:其他控件->工具栏与菜单->多行工具栏。 + -增加示例:更多控件->工具栏与菜单->多行工具栏。 -增加示例:表格控件->分页与排序->数据库分页(底部工具栏)。 +重构表单改变确认对话框(不兼容提醒!)。 -删除Window控件的EnableConfirmOnClose属性,以及GetConfirmHideReference类似的5个方法。 @@ -1512,8 +1601,8 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, +2008-09-09 v1.1 - +Toolbar去除IsPageMenu属性,在网报中可以用自定义样式实现,而不应该写在控件中。 - -网报:CssClass="toolbar-pagemenu" CssStyle="border:0px;",同时定义样式:.toolbar-pagemenu{ background: rgb(208, 222, 240) url(../images/pagemenu_toolbar_background.gif) repeat-x left top;}。 + +Toolbar去除IsPageMenu属性,可以用自定义样式实现,而不应该写在控件中。 + -CssClass="toolbar-pagemenu" CssStyle="border:0px;",同时定义样式:.toolbar-pagemenu{ background: rgb(208, 222, 240) url(../images/pagemenu_toolbar_background.gif) repeat-x left top;}。 -Region去除默认的Layout=Fit,如果希望Region使用Fit/Anchor/Column/Row等布局的话,需要手工指定。 -ToolbarSeparator/ToolbarFill在Ajax更新Hidden属性的BUG。 +布局整理。 @@ -1529,7 +1618,7 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, +大部分的FineUI控件增加Hidden属性(少数几个控件没有此属性:Menu),这样在Ajax时可以显示隐藏控件。 -注意Visible和Hidden的区别:Visible=false的属性不会渲染到客户端,Hidden=true的控件渲染到客户端但是隐藏。 -US的FineUI改造强烈依赖于此属性,这个版本发布后可以继续。 - -网报中唯一没有用到FineUIAjax的地方就是显示隐藏表单字段,现在也可以使用Ajax了。 + -唯一没有用到FineUIAjax的地方就是显示隐藏表单字段,现在也可以使用Ajax了。 @@ -1549,7 +1638,6 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -模拟树的DropDownList,在Ajax重新绑定DataSource后,保持项是否可选状态是最新的(页面第一次加载时,即使没有数据也需要设置DataTextField/DataValueField/DataSimulateTreeLevelField/DataEnableSelectField等属性的值,否则Ajax回发时会出错)。 -UserControlConnector导致的Ajax错误,去除UpdatePanelConnector控件(以后不会用AspnetAjax,这个控件已经完成使命)。 -不要使用Asp.net的控件HiddenField,而是使用FineUI的HiddenField,因为Asp.net的控件在Ajax不会被更新,所以会导致视图状态不一致的错误。 - -网报Ajax整合基本完成(除了待审批->下一步[审核/归档/出纳]操作,由于需要显示隐藏表单字段,目前Ajax不支持,使用的还是普通的PostBack)。 -IE下,RadioButtonList中项如果存在汉字,则会换行的BUG。 -增加两个Theme[Slate/Black](样式尚需完善)。 @@ -1575,7 +1663,7 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -这个版本Ajax和上个版本(v1.1beta1)在设计思路上有很大区别,同时在速度上会有进一步的提升。 -基本思想:安全的Ajax交互,明确Ajax回发时支持控件哪些属性的改变,这将适合90%的应用场景(并且具有极快的反应速度),对于需要UI大改动的可采用常规回发,系统提供控件级别的EnableAjax属性。 -整理支持Ajax的控件属性改变列表(所有被支持的属性改变都是安全的、快速的,所有不被支持的属性改变不会对UI起作用,同时是安全的,不会有js错误)。 - -网报Ajax整合(目前只支持所有的列表页面)(v0.8.1)。 + -Ajax整合(目前只支持所有的列表页面)(v0.8.1)。 @@ -1605,12 +1693,12 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -主要是父页面加载一个比较大的css文件(~100k),则每次打开iframe页面,onload事件的调用都会有500ms左右的延迟,在测试IE性能时要禁用此插件。 +优化弹出窗口中IFrame的显示速度。 -在当前页面弹出窗口需要~20ms,在父页面弹出窗口需要100~300ms。通过缓存弹出的窗口实例,从而第二次弹出窗口不再需要创建时间。 - -PageLayout的Region增加SplitColor属性,默认的背景色是透明的。(在网报中需要设置SplitColor="#CADDF7",以便分隔符的颜色和Toolbar的颜色一致) + -PageLayout的Region增加SplitColor属性,默认的背景色是透明的。 +PageManager增加属性Theme、Language、FormMessageTarget、FormOffsetRight等属性,这些属性可以在Web.config中设置(推荐方法),也可以为每个页面设置。 -一个典型的应用是为每个用户设置不同的皮肤(根据用户浏览器中Cookie设置的值)(示例在default.aspx)。 -TreeNode增加属性SingleClickExpand,表示点击可切换节点的折叠展开状态。 +TabStrip中非当前Tab会延迟渲染。 - -这会明显加快页面的渲染速度,网报中一个典型的费用审批页面可以减少200ms的渲染时间。 + -这会明显加快页面的渲染速度,一个典型的费用审批页面可以减少200ms的渲染时间。 -由于非当前Tab不会在页面加载时渲染,所以那些Tab中的节点在页面加载后也是不可见的,需要将相关的脚本移动到控件的render事件中。 -不能比较两个DataPicker大小的BUG。 -TabStrip延迟加载引起的BUG(非当前Tab中的ContentPanel会占据页面空间,已修正)。 @@ -1669,7 +1757,7 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -TabStrip延时加载出错。 -Window的IFrameUrl处理的BUG,比如Pages_FineUI目录下的页面应该为./FE_ApplyEditor.aspx或~/Pages_FineUI/FE_ApplyEditor.aspx。 -Window的WindowPosition="Center"并且Target="_parent",则会JS错误。 - -实现网报首页下拉菜单和左侧菜单的导航功能。 + -实现首页下拉菜单和左侧菜单的导航功能。 -Window的创建在页面显示后进行,不计算在js渲染时间内。 -优化费用申请页面(尽量减少不必要的层次嵌套)。 -button_iframe.aspx默认会加载form.aspx页面(Window控件的BUG)。 @@ -1689,7 +1777,7 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -一种解决方法是将向页面注册脚本的函数移动到if语句的外面,即每次都向页面注册此脚本。 -另一种办法就是在PageManager控件中增加RegisterPageStateChangedScript(向页面注册监视页面中表单内容改变的脚本)的属性(会在每次页面回发(包含ajax回发)时注册脚本)(示例在button_iframe.aspx/simpleform.aspx)。 +PageManager控件增加ExecuteOnReadyWhenPostBack属性(示例在onreadyscript.aspx)。 - -这个手工添加onReady函数能够在每次页面回发时都注册脚本(包括Ajax局部回发),这就避免了手工去做的麻烦(已经在网报中遇到这种情况)。 + -这个手工添加onReady函数能够在每次页面回发时都注册脚本(包括Ajax局部回发),这就避免了手工去做的麻烦。 -每个页面必须添加一个PageManager控件,否则会出错,同时去除DesignTimeStyle控件(作为PageManager的属性出现)。 -TextField等表单字段增加Readonly属性。 +全新设计的IFrame的架构(尽可能和基于MasterPage的架构保持兼容,和Asp.net Ajax保持兼容)。 @@ -2027,7 +2115,7 @@ FineUI 严格遵守 ExtJS 对开源软件的规定,不再内置 ExtJS 库, -如果DataSource是对象的集合,则支持复合对象,也即时可以绑定到UserInfo.UserName的形式(示例在grid_complex.aspx)[zgjiang2]。 -如果Grid放在Panel中,则WindowField不起作用,已经修正 [zgjiang2&jima]。 -ToolBar内的Button不能设置Visible=false的BUG(同时容器控件中的子控件也面临同样BUG,并修正)[zgjiang2]。 - -Panel中只放置一个Toolbar,不放其他控件时会出错,已经修正 [zgjiang2]。 + -Panel中只放置一个Toolbar,不放更多控件时会出错,已经修正 [zgjiang2]。 +DropDownList完善。 -和Grid的DataSource一样,DataTextField/DataValueField也支持复合对象的绑定。 -自动回发的事件被激发两次 [zgjiang2]。