Exemplo n.º 1
0
 public static void DictionaryAddResult <T>(Dictionary <string, T> d, Rpc.IResult r)
 {
     foreach (var k in r.AsDictionary)
     {
         d[k.Key] = (T)Convert.ChangeType(k.Value, typeof(T));
     }
 }
Exemplo n.º 2
0
 /// <summary>
 /// 显示RPC错误对话框。
 /// </summary>
 /// <param name="owner"></param>
 /// <param name="r">RPC的调用结果。</param>
 public static void ShowResultErrorBox(IWin32Window owner, Rpc.IResult r)
 {
     if (r != null && !r.IsOk)
     {
         var dlg = new ErrorDlg();
         dlg.StartPosition = FormStartPosition.CenterParent;
         dlg.Exception     = r.Exception;
         dlg.ShowDialog(owner);
     }
 }
Exemplo n.º 3
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) {
                // 忽略获取数据后,但窗口已经关闭的异常
            }
        }