叁 、怎么着协会界面自定义录入

为了输入便利,对于部分诸如弹出框选取内容,图片编辑,备注内容(十分长的时候)的编辑撰写,这么些相似的话,大家经过自定义界面来录入比较好,相比Excel样式的界面,录入单元格非常的小,也有时候实现持续的。所以经过制定控件单元格的单击事件,用来拍卖非凡录入音信的操作。

this.fpSpread1.CellClick += new FarPoint.Win.Spread.CellClickEventHandler(fpSpread1_CellClick);

XML 1

拓展界面部分给大家看看,正是很把内容

        void fpSpread1_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
        {
            FarPoint.Win.Spread.Cell cell = this.fpSpread1_Sheet1.Cells[e.Row, e.Column];
            fpSpread1_Sheet1.SetActiveCell(e.Row, e.Column);

            if(e.Column == 14 && e.Row == 6)
            {
                #region 图片操作
                FrmImageEdit dlg = new FrmImageEdit();
                if (!string.IsNullOrEmpty(ID))
                {
                    dlg.ID = ID;
                    dlg.IsNew = false;
                }
                else
                {
                    dlg.ID = NewID;
                    dlg.IsNew = true;
                }
                dlg.OnDataSaved += new EventHandler(dlgPicture_OnDataSaved);
                dlg.ShowDialog(); 
                #endregion
            }
            else if (e.Column == 1 && e.Row == 42)
            {
                #region 注意事项
                object value = this.fpSpread1_Sheet1.Cells[e.Row, e.Column].Value;
                if (value != null)
                {
                    FrmEditNote dlg = new FrmEditNote();
                    dlg.txtContent.Text = value.ToString();
                    if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        this.fpSpread1_Sheet1.Cells[e.Row, e.Column].Value = dlg.txtContent.Text;
                    }
                } 
                #endregion
            }

比如,对于下拉列表内容,必要展开弹出式选拔内容,如下界面所示。

XML 2

对此图片单元格,单击就可以弹出上边包车型大巴窗体,方便编辑只怕查看。

XML 3

对此备注内容,大家让她弹出贰个窗体,更好表现和编排。

XML 4

XML,因有1个政工需求在Winform界面中,以类似Excel表格界面中录入相关的数额(毕竟很多时候,客户想利用成熟的软件体验来输入他们想要的事物),当中界面须求录入基础新闻,列表消息,图片音信等,综合那个正是诸如下边那样的界面效果。本文首要针对怎么着使用FarPoint
Spread表格控件落成类似Excel界面丰裕多少的保留及展现,以及在采用进度中的一些经历心得,希望对大家在开发Winform的Excel数据录入和显示上边的花费有早晚救助。

从上述的界面分类可以见见,大概能够分成多少个品类的数量,3个是基础字段数据,二个是有多行的列表数据,四个是图表数据,还有正是备注音信的显得录入了。上面小编来分类介绍这几个效应的贯彻。

XML 5

1、类似Excel的列表总体界面设计

率先,这几个列表须要在Winform的界面中展开规划,拖入一个Farpoint控件到Winform界面上,设置好布局等属性,然后在右键菜单上运维Spread
Designer就能够安插休戚相关的Excel样式表格的内容了。

XML 6

留意,那里界面一般是在窗体中筹划的,当然你的内容能够因此复制粘贴的不二法门,从Excel文书档案拷贝过来,效果看起来一样的,万分不利。但是,即使Farpoint
Spread控件提供了3个另存为Xml文件的操作,并且能够透过API,Open3个XML文件,但是Open的XML文件后,好像内容不可能拓展改动的,而且类型CellType也是Null的,所以若是要在三个窗体上动态加载布局好像做不到,至少自身从不到位。但是对于开发以来,大家在安立即刻,设计好Excel样式的列表界面,也未尝不是一件好事。

XML 7

⑤ 、Excel表格的多少打字与印刷及导出。

运用那么些Farpoint
Spread的空中,对于里边的剧情开始展览打字与印刷可能导出Excel卓殊便利,代码也不多,如下所示。

        private void btnPrint_Click(object sender, EventArgs e)
        {
            PrintInfo pi = new PrintInfo();
            pi.Header = "成衣工艺单";
            pi.JobName = "成衣工艺单";
            pi.Orientation = PrintOrientation.Auto;
            pi.PageOrder = PrintPageOrder.Auto;
            pi.ShowPrintDialog = true;
            pi.PrintNotes = PrintNotes.AtEnd;

            for (int i = 0; i < this.fpSpread1.Sheets.Count; i++)
            {
                pi.ShowPrintDialog = (i == 0);
                this.fpSpread1.Sheets[i].PrintInfo = pi;
                fpSpread1.PrintSheet(i);
            }
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            string file = FileDialogHelper.SaveExcel("成衣工艺单.xls");
            if (!string.IsNullOrEmpty(file))
            {
                try
                {
                    bool success = this.fpSpread1.SaveExcel(file);
                    if (success)
                    {
                        if (MessageDxUtil.ShowYesNoAndTips("导出成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start(file);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    MessageDxUtil.ShowError(ex.Message);
                }
            }
        }

导出的功效和界面呈现的效率基本上一致的,而且图片等特种的格式,也是正规保留在Excel里面,总体感觉没错。

终极附上那几个种类的部分截图作为填补精晓。

XML 8

 

贰 、下拉列表的绑定

在Excel列表中,大家很多时候,为了输入的有益,必要通过下拉列表方式输入内容,那样能够增强速度和用户体验,但那么些剧情必须是透过数据库内容开始展览绑定的,Farpoint
Spread控件是什么做到绑定下拉列表的数码的吗。首先Farpoint
Spread控件由许多输入的内容,个中就回顾有ComoBox类型,如下所示。

XML 9

大家在钦点下拉的类型后,Excel列表的呈现方式也随之变化为上边样式了。

XML 10

上述打勾的便是我们下一步必要绑定列表数据的列表了,绑定列表的数码也不麻烦,正是索要掌握Cell的序号,绑定给她数据源就能够了,但是说实话,平时要数着Cell的行列号是何等数字,有点不便利。

        private void BindDict()
        {
            FarPoint.Win.Spread.Cell cell;

            //品名
            cell = this.fpSpread1_Sheet1.Cells[1,9];
            FarPoint.Win.Spread.CellType.ComboBoxCellType productType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
            productType.BindDictItems("品名");
            cell.CellType = productType;

            //客户名
            cell = this.fpSpread1_Sheet1.Cells[4, 8];
            FarPoint.Win.Spread.CellType.ComboBoxCellType customerType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
            customerType.BindDictItems("客户名");
            cell.CellType = customerType;

            //款号
            cell = this.fpSpread1_Sheet1.Cells[1, 12];
            FarPoint.Win.Spread.CellType.ComboBoxCellType styleType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
            styleType.BindDictItems("款号");
            cell.CellType = styleType;

            //面料
            cell = this.fpSpread1_Sheet1.Cells[1, 15];
            FarPoint.Win.Spread.CellType.ComboBoxCellType materialType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
            materialType.BindDictItems("面料");
            cell.CellType = materialType;

        }

里头代码的BindDictItems我用了扩张方法,所以能透过对象直接调用,具体的函数代码如下所示,就是调用字典业务类获取数据,赋值给Items属性即可,注意在那之中的艾德ittable最好选择为true,不然它只是呈现个中列表的始末,类似DropdownList这样。

XML 11

        /// <summary>
        /// 绑定下拉列表控件为指定的数据字典列表
        /// </summary>
        /// <param name="combo">下拉列表控件</param>
        /// <param name="dictTypeName">数据字典类型名称</param>
        public static void BindDictItems(this FarPoint.Win.Spread.CellType.ComboBoxCellType combo, string dictTypeName)
        {
            Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
            List<string> listData = new List<string>();
            foreach (string key in dict.Keys)
            {
                listData.Add(key);
            }
            combo.Items = listData.ToArray();
            combo.Editable = true;
        } 

④ 、数据的来得和保存

对此普通的主表数据字段的显得很简短,把内容赋值给相应的单元格Text属性即可,如下所示。

        /// <summary>
        /// 数据显示的函数
        /// </summary>
        public void DisplayData()
        {
            if (!string.IsNullOrEmpty(ID))
            {
                #region 显示信息
                CraftHeaderInfo info = BLLFactory<CraftHeader>.Instance.FindByID(ID);
                if (info != null)
                {
                    this.fpSpread1_Sheet1.Cells[1, 9].Text = info.ProductName;
                    this.fpSpread1_Sheet1.Cells[1, 12].Text = info.StyleNo;
                    this.fpSpread1_Sheet1.Cells[1, 15].Text = info.Material;

封存的时候,把相应的始末保留到实体类进行数量保存操作即可。

        /// <summary>
        /// 编辑或者保存状态下取值函数
        /// </summary>
        /// <param name="info"></param>
        private void SetInfo(CraftHeaderInfo info)
        {
            info.ProductName = this.fpSpread1_Sheet1.Cells[1, 9].Text;//品名
            info.StyleNo = this.fpSpread1_Sheet1.Cells[1, 12].Text;//款号
            info.Material = this.fpSpread1_Sheet1.Cells[1, 15].Text;//面料

越多数据的时候,我们把内容保留分开,各种函数负责差其他部分即可,在主表保存后继续保存其他一些的情节,例如油红部分正是任何部分的保留操作。

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(ID))
            {
                CraftHeaderInfo info = BLLFactory<CraftHeader>.Instance.FindByID(ID);
                if (info != null)
                {
                    SetInfo(info);

                    try
                    {
                        #region 更新数据
                        bool succeed = BLLFactory<CraftHeader>.Instance.Update(info, info.ID.ToString());
                        if (succeed)
                        {
                            SaveProcess(info.ID);
                            SaveAccessories(info.ID);
                            SaveIndicateSize(info.ID);
                            SaveColorPair(info.ID);

                            //可添加其他关联操作
                            ProcessDataSaved(this.btnSave, new EventArgs());

                            MessageDxUtil.ShowTips("保存成功");
                        }
                        #endregion
                    }
                    catch (Exception ex)
                    {
                        LogTextHelper.Error(ex);
                        MessageDxUtil.ShowError(ex.Message);
                    }
                }
            }
            else
            {

诸如工艺技术进度是二个列表数据,保存的时候,需求钦赐行列的习性进行操作,而且大家抬高贰个Seq的行列号,用来保存内容的相继,那样加载的时候,大家就依据那几个循序进行加载展现,不然会产出难题。

        private void SaveProcess(string headerId)
        {
            string condition = string.Format("Header_ID = '{0}' ", headerId);
            List<CraftProcessInfo> list = BLLFactory<CraftProcess>.Instance.Find(condition);
            //(e.Column == 1 && (e.Row >= 6 && e.Row < 30))
            int i = 0;
            for (int row = 6; row < 30; row++)
            {
                CraftProcessInfo info = GetProcess(i++, list);
                info.Header_ID = headerId;

                int col = 0;
                info.HandNo = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Process = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Models = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.NeedleWork = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Flower = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.DownLine = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.PinCode = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.KnifeGate = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Note = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item1 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item2 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item3 = this.fpSpread1_Sheet1.Cells[row, col++].Text;

                BLLFactory<CraftProcess>.Instance.InsertUpdate(info, info.ID);
            }
        }

其间GetProcess函数,正是叁个列表中找寻对应顺序的剧情,假如有,那么大家立异那个相应顺序的始末,假若没有,那么我们认为它是新的数据,那样就新增到数据库中,所以最终用了InserUpdate正是以此道理。当中GetProcess函数逻辑代码如下所示。

        private CraftProcessInfo GetProcess(int index, List<CraftProcessInfo> list)
        {
            CraftProcessInfo info = new CraftProcessInfo();
            if (list.Count > index)
            {
                info = list[index];
            }
            info.Seq = index + 1;//重新调整顺序号

            return info;
        } 

别的注意的时候,有个别单元格是合并列的,所以肯定要小心算好她的体系号哦。有些地点可能须求跳行。

        private void SaveAccessories(string headerId)
        {
            string condition = string.Format("Header_ID = '{0}' ", headerId);
            List<AccessoriesInfo> list = BLLFactory<Accessories>.Instance.Find(condition);
            //(e.Column == 1 && (e.Row >= 31 && e.Row < 35))
            int i = 0;
            for (int row = 31; row < 35; row++)
            {
                AccessoriesInfo info = GetAccessories(i++, list);
                info.Header_ID = headerId;

                int col = 1;
                info.Name = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Consumption = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Position = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                col++;//空跳一列
                info.Item1 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                col++;//空跳一列
                col++;//空跳一列
                info.Item2 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item3 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item4 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item5 = this.fpSpread1_Sheet1.Cells[row, col++].Text;
                info.Item6 = this.fpSpread1_Sheet1.Cells[row, col++].Text;

                BLLFactory<Accessories>.Instance.InsertUpdate(info, info.ID);
            }
        }

相关文章

网站地图xml地图