/// <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) { // 忽略获取数据后,但窗口已经关闭的异常 } }
/// <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) { // 忽略获取数据后,但窗口已经关闭的异常 } }