public void Initialize <T>( // 给定一个 加载器,用于给 ButtonEdit 控制 ControlLoader loader, // 要加载的控件 string controlPath, // 检查事前条件 Func <ASPxButtonEdit, HiddenField, bool> preShow, // 当下拉面板被拉下的时候(加载器,控件对象,输入框,是否第一次加载) Action <T, ASPxButtonEdit, HiddenField, bool> show, // 当值被选定的时候 Func <T, ASPxButtonEdit, HiddenField, bool> set, // 清除值 Action <ASPxButtonEdit> clear = null, // 额外配置 Loader Action <ControlLoader.Configurator <T> > config = null) where T : BaseControl { // 观察下拉按钮 b.ValidationSettings.CausesValidation = false; b.ButtonClick += (s, e) => { switch (e.ButtonIndex) { case 0: // 弹出 // 事前检验 if (!preShow(BE, h)) { return; } // 如果没有加载则进行加载 if (loader.HostingControl == null) { loader.Begin <T>(controlPath, null, c => show(c, b, h, true), config); } else { if (loader.HostingControl is T) { T c = loader.HostingControl as T; show(c, b, h, false); // -- 拷贝 loader 的实现片段 -- if (config != null) { loader.ForConfigurator <T>(config, null, new ControlLoader.Configurator <T>(c, loader)); loader.ForConfigurator <T>(cc => { if (cc.FooterLoaded) { return; // 已经在 configurator 中加载页脚 } loader.LoadFooter <Loader.Footer>(execute: f => { f.SpecifyButtonSetting(cc.Buttons); f.Execute(); }); }, () => { loader.LoadFooter <Loader.Footer>(execute: f => f.Execute()); }); } // 重新展示 loader.Show(); } else { loader.Begin <T>(controlPath, null, c => show(c, b, h, true), config); } } break; case 1: // 点击编辑按钮 if (clear != null) { clear(b); } else { Text = Value = null; } break; } }; // 观察 Loader 的状态,捕获 OK 事件 loader.EventSinked += (c, eType, param) => { if (eType == EventTypes.OK) { if (loader.HostingControl is T) { if (set((loader.HostingControl as T), b, h)) { loader.Close(); } } } }; }
/// <summary> /// Linq 数据导出Excel表格 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="section">标识,例如 Contract,InStorage,等,与 Export 子目录同</param> /// <param name="data"></param> /// <param name="headers"></param> protected virtual string _ExportToExcel <T>( string prefix, List <T> data, string[] headers, Controls.ControlLoader pop = null) { PropertyInfo[] properties = typeof(T).GetProperties(); if (headers.Length < properties.Length) { throw new ArgumentException("表头数量不够,请检查", "headers"); } if (headers.Distinct().Count() < headers.Length) { throw new ArgumentException("表头命名不能重复,请检查", "headers"); } var ds = new DataSet(); var tb = ds.Tables.Add(); var folder = "____temp/export"; // 放表头 for (int i = 0; i < properties.Length; i++) { tb.Columns.Add(new DataColumn() { Caption = headers[i], ColumnName = properties[i].Name, DataType = properties[i].PropertyType, AllowDBNull = true }); } // 放数据 data.ForEach(d => { var row = tb.NewRow(); for (int i = 0; i < properties.Length; i++) { row[i] = properties[i].GetValue(d, null); } tb.Rows.Add(row); }); ds.AcceptChanges(); var file = string.Format("{0}_{1}.xls", prefix, Guid.NewGuid().ToISFormatted()).ToLower(); var path = Util.GetPhysicalPath(folder); new ExportExcel().ExportExcelData(path, file, tb); if (pop == null) { return(file); } pop.Begin <Controls.MessagePanel>("~/_controls.helper/messagepanel.ascx", null, c => { var l = new WebUI.HyperLink() { CssClass = "aBtn", Text = "点击此处下载 / 浏览", Target = "_blank", NavigateUrl = string.Format("~/{0}/{1}", folder, file) }; l.Font.Bold = true; l.Font.Size = 12; c.MessageBody.Controls.Add(l); c.Title = "成功"; }, c => { c .Width(400) .Height(300) .Title("文件导出") ; }); return(file); }