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