zoukankan      html  css  js  c++  java
  • 记录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/

      

     

  • 相关阅读:
    CODING x 百果园 _ 水果零售龙头迈出 DevOps 体系建设第一步
    Nocalhost 亮相 CD Foundation 国内首届 Meetup,Keith Chan 将出席致辞
    做云原生时代标准化工具,实现高效云上研发工作流
    打造数字化软件工厂 —— 一站式 DevOps 平台全景解读
    WePack —— 助力企业渐进式 DevOps 转型
    CODING Compass —— 打造行云流水般的软件工厂
    Nocalhost —— 让云原生开发回归原始而又简单
    CODING 代码资产安全系列之 —— 构建全链路安全能力,守护代码资产安全
    Nocalhost:云原生开发新体验
    使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
  • 原文地址:https://www.cnblogs.com/sdadx/p/6564507.html
Copyright © 2011-2022 走看看