前两天开发了个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[];
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;
}

  之后,要将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[].ColumnName = "酒店名称";
table.Columns[].ColumnName = "酒店编号";
table.Columns[].ColumnName = "员工姓名";
table.Columns[].ColumnName = "手机号";
table.Columns[].ColumnName = "状态";
table.Columns[].ColumnName = "邮箱";
dataGridView1.DataSource = table;
dataGridView1.Columns[].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 - , e.RowBounds.Height);
TextRenderer.DrawText(e.Graphics, (e.RowIndex + ).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 { }
}
}

在测试的时候刚开始遇到一些疑惑,用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/

  

记录Winform开发过程中遇到的情况的更多相关文章

  1. 本篇将记录python开发过程中常见问题

    1.Django 外键on_delete的使用 之前用的Django1.8 换成2.0后,出现以下问题: TypeError: init() missing 1 required positional ...

  2. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结

    开发<客户关系管理系统(CRM)>软件过程,也就是一个标准的Winform程序的开发过程,我们可以通过这个典型的软件开发过程来了解目前的开发思路.开发理念,以及一些必要的高效率手段.本篇随 ...

  3. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  4. android(java) 开发过程中经验及总结记录

    android(java) 开发过程中经验及总结记录

  5. sqlServer 查询表中31到40的记录,考虑id不连续的情况

    SQL   查询表中31到40的记录,考虑id不连续的情况 写出一条sql语句输出users表中31到40记录(数据库为SQL Server,以自动增长的ID作为主键,注意ID可能不是连续的)? -- ...

  6. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  7. 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法

    这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...

  8. 软件开发过程中的审查 (Review)

    http://blog.csdn.net/horkychen/article/details/5035769 软件开发过程中的审查 (Review)   希望别人做些什么->定义出流程 希望别人 ...

  9. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

随机推荐

  1. Centos6.5 mysql折腾记

    1.yum安装mysql [root@localhost ~]# yum -y install mysql-server 安装结果 Installed: mysql-server.x86_64 0:5 ...

  2. .net判断System.Data.DataRow中是否包含某列

    大家对将DataRow转成实体对象并不陌生,转成实体的时候一般都会加上这个判断  if (row["字段名"] != null && row["字段名&q ...

  3. Android之AppWidget 开发浅析

    什么是AppWidget AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图: 图中我用黄色箭头指示的即为AppWidget,一些用户使用比较频繁 ...

  4. 《JAVASCRIPT高级程序设计》事件处理程序和事件类型

    一.事件流 谈到事件,首要要理解事件流的概念:事件流是指从页面接受事件的顺序:“DOM2级事件”规定事件流包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段.目前大部分的浏览器的事件流是事件冒泡, ...

  5. 编写JQuery插件-4

    封装对象方法的插件 jQuery.fn.extend() 的两种写法 以添加一个点击按钮为例: 方法一: (function ($) { $.fn.mask = function(options){ ...

  6. jquery 高级 学习笔记

    --jquery 和 原生js可以共存,但不能混用.jquery 可以通过get()方法 转换为原生js. $("#div1").get(0).innerHTML; get() 需 ...

  7. C# Web.config 配置handlers 和 httpHandlers

    <system.web> <httpHandlers> <add verb="*" path="*.js.axd" type=&q ...

  8. R语言爬虫 rvest包 html_text()-html_nodes() 原理说明

    library(rvest) 例子网页:http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=010000% ...

  9. 表单界面的兼容PC手机端解决方案

    就当写一篇随笔吧~上星期还在做加盟模块(兼容微信端),这星期已经加班做快递扫码模块(react+node),所以我感觉只有弹药备足了才能稍微轻松些应对各种需求.实话说在同个部门的大佬面前差距确实大,如 ...

  10. [Noi2014]魔法森林( 动态mst lct)

    以前一直觉得lct特别难写,自从学了丽洁姐的lct之后,觉得lct居然能这么短,这个主程序能40行左右解决~~~~ 这道嘛~~虽说能用spfa解决,但还是写下lct吧 把边按a值排序后一条一条插入并维 ...