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