/// <summary> /// /// </summary> /// <param name="binding"></param> /// <param name="data"></param> /// <param name="afterBound"></param> public static void BindTo(this MyGridViewBinding binding, IList <IDictionary <string, object> > data, BindFlag flag = BindFlag.Replace, string colName = "", params Action[] afterBound) { var columns = binding.Columns.Cast <MyGridColumn>().ToList(); Action vact = null; switch (flag) { case BindFlag.Update: // 此时返回值应当是一条记录。 // 根据字段名称更新到DataTable中。 foreach (var r in data) { var updatedRowIndex = binding.DataTable.UpdateByKey(colName, ToDataTableRow(r, columns)); vact += () => { binding.View.RowCount = binding.DataTable.Count; binding.View.InvalidateRow(updatedRowIndex); // 更新行可见。 binding.View.FirstDisplayedScrollingRowIndex = updatedRowIndex; // 更新行作为当前的选中行。 binding.View.ClearSelection(); binding.View.Rows[updatedRowIndex].Selected = true; }; } break; case BindFlag.Replace: // 此时返回值应当是一个数组。每个元素都可以解析为一条记录。 // 将数据转化为DataTable,并替换当前的DataTable。 var dataTable = new MyGridDataTable(binding.Columns, data.Select(_ => ToDataTableRow(_, columns)).ToList()); // 从视图同步全部数据。 vact = () => { binding.DataTable = dataTable; }; break; default: throw new ArgumentException("unknown flag: " + flag); } // 从视图同步全部数据。 Action vact2 = () => { if (vact != null) { vact(); } foreach (var a in afterBound) { a(); } }; try { binding.View.BeginInvoke(vact2); } catch (InvalidOperationException) { // 忽略获取数据后,但窗口已经关闭的异常 } }
public ExportExcelDlg(MyGridViewBinding binding, IEnumerable <MyGridColumn> columns, string fileName) { InitializeComponent(); this.Binding = Commons.NotNull(binding, "binding"); var columns_ = new List <MyGridColumn>(); if (columns != null) { columns_.AddRange(columns); } this.Columns = columns_; this.FileName = Commons.NotBlank(fileName, "fileName").Trim(); }
/// <summary> /// 从Excel表格导入。 /// </summary> /// <param name="binding"></param> /// <param name="fileName"></param> public static void Import(System.Windows.Forms.IWin32Window parent, MyGridViewBinding binding, string fileName) { Commons.NotNull(binding, "binding"); Commons.NotBlank(fileName, "path"); // 此处固定导入所有的可见列。 var importedColumns = binding.Columns.Cast <MyGridColumn>() .Where(col => col.Visible) .ToList(); using (var dlg = new ImportExcelDlg(binding, importedColumns, fileName)) { dlg.DoImport += ImportFromExcel; dlg.ShowDialog(parent); } }
} // end of Import. public static void ExportExcel(MyGridViewBinding binding) { // 创建保存文件的对话框,获取文件名。 var dlg = new System.Windows.Forms.SaveFileDialog(); dlg.Title = Properties.Resources.Excel_SaveFile; dlg.Filter = Properties.Resources.Excel_SaveFile_Filter; dlg.AddExtension = true; dlg.AutoUpgradeEnabled = true; dlg.CheckPathExists = true; dlg.CreatePrompt = false; dlg.DefaultExt = "xls"; dlg.DereferenceLinks = true; dlg.OverwritePrompt = true; dlg.SupportMultiDottedExtensions = true; if (dlg.ShowDialog(null) == System.Windows.Forms.DialogResult.OK) { // 调用Excel导出。 Export(null, binding, dlg.FileName); } }
/// <summary> /// /// </summary> /// <param name="binding"></param> /// <param name="r"></param> /// <param name="flag"></param> /// <param name="colName"></param> /// <param name="afterBound">成功绑定后需要指定的动作,这些动作会在UI线程中被执行。</param> public static void BindTo(this MyGridViewBinding binding, Rpc.IResult r, BindFlag flag = BindFlag.Replace, string colName = "", params Action[] afterBound) { NotNull(binding, "binding"); NotNull(r, "r"); Action vact = null; var columns = binding.Columns.Cast <MyGridColumn>().ToList(); switch (flag) { case BindFlag.Delete: // 此时返回值应当是单独的key。 // 根据key值和字段名称从DataTable中删除已被删除的记录。 var deletedRowIndex = binding.DataTable.RemoveByKey(colName, r.AsString.Trim('\"')); // 如果被删除的行被选中了,那么取消选中。 binding.View.SelectedRows.Cast <DataGridViewRow>().ForEach(row => { if (row.Index == deletedRowIndex) { row.Selected = false; } }); // 从视图中同步所有行。 // 删除操作可能导致其它行的序号发生变化,所以需要同步所有的行。 vact = () => { binding.View.RowCount = binding.DataTable.Count; binding.View.Invalidate(); }; break; case BindFlag.Update: // 此时返回值应当是一条记录。 // 根据字段名称更新到DataTable中。 var updatedRowIndex = binding.DataTable.UpdateByKey(colName, ToDataTableRow(r.AsDictionary, columns)); vact = () => { binding.View.RowCount = binding.DataTable.Count; binding.View.InvalidateRow(updatedRowIndex); // 更新行可见。 binding.View.FirstDisplayedScrollingRowIndex = updatedRowIndex; // 更新行作为当前的选中行。 binding.View.ClearSelection(); binding.View.Rows[updatedRowIndex].Selected = true; }; break; case BindFlag.Replace: // 此时返回值应当是一个数组。每个元素都可以解析为一条记录。 // 将数据转化为DataTable,并替换当前的DataTable。 var dataTable = new MyGridDataTable(binding.Columns, r.AsDictList.Select(_ => ToDataTableRow(_, columns)).ToList()); // 从视图同步全部数据。 vact = () => { binding.DataTable = dataTable; }; break; default: throw new ArgumentException("unknown flag: " + flag); } Action vact2 = () => { if (vact != null) { vact(); } foreach (var a in afterBound) { a(); } }; try { binding.View.BeginInvoke(vact2); } catch (InvalidOperationException) { // 忽略获取数据后,但窗口已经关闭的异常 } }