• 记录Winform开发过程中遇到的情况


      前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念。

      一、CSKIN美化框架的使用

      刚开始做的时候,发现Winform的界面是有点丑了,但又不想换成WPF,所以就找到了这个框架,挺好用的,下载一个dll,

    引用到项目里就好了。具体步骤:

      ①在其官网下载压缩包,http://www.cskin.net/,其内容文件如下。

      

      ②在VS的工具箱里新建个组,然后直接把下载中的一个dll文件给拖进去(这里我引用的是CSkin 4.0下的CSkin.dll),

    就算引用完成,之后这个组里就会有这个框架里所带的控件。它的使用方法和winform里的控件都一样,这一点还是挺方便的。

       

        
      具体的使用方法见使用教程,里面说的很清楚。,边一张图便是美化过后的界面。

         

        

     

    二、Aspose.Cells,DataTable,DataGridView的使用。

      这次因为有一个功能是显示Excel的内容到DataGridView上,虽然知道操作Excel有很多方法,但是用着感觉都不是太好。这次找到了一个操作Excel比较好的插件【Aspose.Cells】。听说是兼容性比较好,什么wps,office 07,13的都没问题,而且代码写得也比较少。 下面是一段Excel导出到DataTable的代码。

      /// <summary>
            /// 获取excel的内容到Datatable 
            /// </summary>
            /// <param name="excel"></param>
            /// <returns></returns>
            public static DataTable GetImportExcelDataTable(string fileName)
            {
                Workbook workbook = new Workbook(fileName);
                Worksheet sheet = workbook.Worksheets[0];
                Cells cells = sheet.Cells;
                //将表中的信息转到datatable
                DataTable table = cells.ExportDataTable(1,0,cells.MaxRow,6);   
                return RemoveEmpty( table);
             }
    
         /// <summary>
            /// 去除DataTable中整行都是空的数据
            /// </summary>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static DataTable RemoveEmpty(DataTable dt)
            {
                List<DataRow> removelist = new List<DataRow>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    bool IsNull = true;
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
                        {
                            IsNull = false;
                        }
                    }
                    if (IsNull)
                    {
                        removelist.Add(dt.Rows[i]);
                    }
                }
                for (int i = 0; i < removelist.Count; i++)
                {
                    dt.Rows.Remove(removelist[i]);
                }
                return dt;
            }
    View Code

       之后,要将datatable里的内容绑定到DataGridView上,我要改变显示的列名,我去设置DataGridView的上的内容,试了很长时间,也没成功,最后发现想要改变列名,的设置DataTable上的列名,之后再绑定到DataGridView。

                OpenFileDialog file = new OpenFileDialog();
                file.Filter = "Excel|*.xls;*.xlsx";
                if (file.ShowDialog() == DialogResult.OK)
                {
                    string excelName = file.FileName;
                    DataTable table = ExcelHelper.GetImportExcelDataTable(excelName);
                    table.Columns[0].ColumnName = "酒店名称";
                    table.Columns[1].ColumnName = "酒店编号";
                    table.Columns[2].ColumnName = "员工姓名";
                    table.Columns[3].ColumnName = "手机号";
                    table.Columns[4].ColumnName = "状态";
                    table.Columns[5].ColumnName = "邮箱";
                    dataGridView1.DataSource = table;
                    dataGridView1.Columns[4].FillWeight = 40; //这个是设置列宽的
                }

      还有一个是给DataGridView设置编号,这个也是有必要的,先找到RowPostPaint这个事件,之后在事件里写方法,之后DataGridView就能存在编号。

     

      private void dataGridView2_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
            {
                Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,       e.RowBounds.Location.Y,
              dataGridView1.RowHeadersWidth - 4, e.RowBounds.Height);
                TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
                       dataGridView2.RowHeadersDefaultCellStyle.Font, rectangle,
                       dataGridView2.RowHeadersDefaultCellStyle.ForeColor,
                       TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
            }

     

    三、Winform中全局的异常捕获处理

      因为在程序里会出行一些异常,如用户的特殊输入,但是我有不想写大量try catch语句,所以我就找到了一种方法能够全局处理异常。找到winfrom的程序入口的文件Program.cs,然后注册捕获异常事件,进行处理 ,类似于ASP.NET中Global里的Application_Error

     static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                //处理UI线程异常
                Application.ThreadException += Application_ThreadException;
                //处理未捕获的异常 
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
                //处理非UI线程异常   
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
    
            /// <summary>
            /// 处理应用程序域内的未处理异常(非UI线程异常)
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                try
                {
                    Exception ex = e.ExceptionObject as Exception;         
                
                }
                catch
                {
                 
                }
            }
    
            /// <summary>
            /// 处理应用程序的未处理异常(UI线程异常)
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
            {
                try
                {
                    //MessageBox.Show(e.Exception.Message);
                    if (e.Exception.Message.Contains("登录失败") ||e.Exception.Message.Contains("error: 40"))
                    {
                        MessageBox.Show(@"数据库远程登录失败,请检查网络链接");
                    }
                    else 
                    {
                        MessageBox.Show(@"请检查输入或文件中是否有特殊字符如:,'< > * ( ) """);
                    }
                  
                }
                catch { }
            }
        }
    View Code

    在测试的时候刚开始遇到一些疑惑,用VS调试的时候,这段代码捕获到异常后,弹出了我设置的提示框,但是程序还是抛异常了,本以为代码写错了,但最后发现,这个不是错误。用bin文件夹下的exe文件测试就不会有问题了,打包后还是没问题了。

    四、程序打包(非InstallShield方式)

      过了vs2010后,打包感觉好无语,操作步骤真是复杂,还非的下载InstallShield,因为是局域网,不是公网ip,在那个注册下载那个页面,国家地区那一列直接就不给机会选择,换种方式打包了。

     

     

     打包过程中还发现这种问题,也是搜了好久,这种解决办法是去掉项目属性中的签名,之后便能够发布成功。

     

     

    至此,从项目创建到发布都过了一遍,感觉还是怪怪的,好像还有个地方可以优化,就是用多线程,防止页面假死,先这样吧,慢慢再优化。

    项目发布到码云上,地址: http://git.oschina.net/sdadx/MDM   

     参考文章:1.Winform中的dataGridView添加自动编号 

          2.(C#)利用Aspose.Cells组件导入导出excel文件 

          3.winform 记录全局异常捕获

          4.WinForm多线程+委托防止界面假死

          5.CSKIN论坛 http://bbs.cskin.net/

      

     

  • 相关阅读:
    合格linux运维人员必会的30道shell编程实践题及讲解-07
    合格linux运维人员必会的30道shell编程实践题及讲解-06
    合格linux运维人员必会的30道shell编程实践题及讲解-05
    合格linux运维人员必会的30道shell编程实践题及讲解-04
    合格linux运维人员必会的30道shell编程实践题及讲解-03
    合格linux运维人员必会的30道shell编程实践题及讲解-02
    合格linux运维人员必会的30道shell编程实践题及讲解-01
    阿里云服务器环境部署
    centos7搭建docker私有库
    Hexo+Github--搭建个人博客(一)准备工作&&环境搭建
  • 原文地址:https://www.cnblogs.com/sdadx/p/6564507.html
Copyright © 2020-2023  润新知