msgbartop
用铅笔写日记,记录那最原始的美丽
msgbarbottom

10-3-14 关于winform项目的一些经验之谈

前一段时间做了一个小型的桌面应用程序,语言是c#.

其实也谈不上是c/s,因为没有用到像mssql、mysql这类的庞大的数据库.

考虑到要娇小玲珑,使用了sqlite,大大增强了运行效率.

做完后,唯一的感觉就是又学到了不少东西,只有动手去做,才能发现自己的不足.

下面就是我总结的一些新知识:(当然,都是谷歌来的)

首先来说sqlite,它的定位是超轻量级的开源数据库,而且它不需要server端.
故而被一些软件用来做配置文件的存放,如腾讯的聊天记录.

sqlite 本身不支持.net,不过有第三方的移植版,如 ADO.NET 2.0 Provider for SQLite、C#-SQLite等,我使用的前者,因为它提供了最标准的接口--System.Data.SQLite,符合C#的习惯.
而且听说nhibernate 用的也是它.
这是它的官网: http://sqlite.phxsoftware.com/.

它最大的好处可以与visual studio 完美结合,提供了Sqlite dateadapter 等组件,如图
sqlite 组件

这样可以实现可视化的面向数据库的操作。随便拖一拖控件,设置、勾选一些参数就可以了。真正的无编码编程呀!!
如图:
sqlite dataset

建议可以看看官网的视频教程:http://sqlite.phxsoftware.com/sqlite.wmv

不要像我一开始一样,不知道有这个。一边在网上找实例代码,一边看api.真是吃力不讨好.

还有要说的就是:都说sqlite 不支持外键,我试了下,可以设置。不过外键约束貌似不起作用 囧rz

再者,如果用sqlite administrator 打开数据库文件后,有可能会导致程序不能打开数据库,可以用sqlite administrator 把文件转成Version 3的,扩展名为*.s3db.而且sqlite administrator插入中文会乱码,这是个问题.

说完sqlite,再谈c#读取INI文件。
因为有些设置是要放到sqlite外保存的,比如sqlite db 的路径,本来是要用xml的.
突发奇想要用ini文件.找到了解决方案:

//调用win32系统kernel
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

//写入方法
//parameter 下同
//Section 区域名
//Key 键名
//Value 值名
//inipath ini文件路径

public void IniWriteValue(string Section, string Key, string Value,string inipath)
{
WritePrivateProfileString(Section, Key, Value, inipath);
}

//读取方法
public string IniReadValue(string Section, string Key,string inipath)
{
StringBuilder temp = new StringBuilder(500);
int i = GetPrivateProfileString(Section, Key, "", temp, 500, inipath);
return temp.ToString();
}

还有个问题就是即时刷新数据的问题.

比如说你在一个新窗口添加完数据,关闭后回到父窗口,理应要刷新一下的.
解决方案有很多种,有人是用到了全局变量,静态方法。

不过我看到了一种更好的,比较推崇的方法,就是利用模式窗口,因为模式窗口被调用完,总是会返回一个DialogResult的.
我们恰巧可以用来做判断.

//主窗体代码
form.ShowDialog();
if (form.DialogResult == DialogResult.OK)
{
//刷新操作
}
//子窗体代码
//在FormClosed事件触发时
this.DialogResult = DialogResult.OK;

同样的方法还可以用在登录窗体和主窗体之间.

最后一个问题就是,昨天有人问我的一个问题,是关于键盘按键的事件.

比如你在填好用户名和密码后,按回车键就会自动提交,免去了点击提交按钮.
其实就是一个窗体的KeyDown事件.
关键代码如下:

if(e.KeyCode==Keys.Enter)
{
loginbtn.PerformClick();
}

组合键也是这样,如ctrl+enter。只是多加了些条件而已 :)

项目完成后的部署,也碰到了一个问题.
就是我打成的安装包在用户机器安装时候,报什么缺少sqlite.dll 程序集,要我通过gacutil.exe工具添加到全局程序集GAC.
我日啊,用户机器哪来的vs??干脆把debug下面的东西拿过来用了

最后,bs一下微软的维修死丢丢,调试时候经常崩溃,重新打开后,丢失很多了代码.

访客的留言

    1. Sapphire Sapphire

      回车那个可以设置accept button。。。
      看api才是切实提高编程水平的最佳路径,比如DialogResult ,只要看过API的都会想到。。

    2. vk vk

      以前学了点c++,现在全忘了。。

      1. 语言这种东西,一个月不摸就差不多了

写下你的评论 »

(若看不到,请刷新。)