关闭

C# WinForm几个编程技巧

标签: winformc#datasetstring数据库command
1089人阅读 评论(1) 收藏 举报
分类:
 
(1)        用窗体的静态方法作为显示窗体和使用窗体功能的入口
一个窗体往往会显示其他窗体以实现一定的功能。通过在被调用窗体中实现一个静态函数供调用窗体使用可以简化窗体间的交互,隐蔽被调用窗体的数据,从而加强封装特性。
如主窗体为FormMain,被调用窗体为FormChild。在FormChild中实现一个静态方法:
Static void DoSomething()
{
       new FormChild.ShowDialog();
//实现功能
//…
}
在主窗体中调用被调用窗体的DoSomething()方法:
FormChind.DoSomething();
这样就可以显示被调用窗体并由被调用窗体执行预设的功能,并且该静态函数封装了构造和初始化被调用窗体的逻辑。程序的结构更加清晰,类的职责更加明确。
(2)        判断用户在对话框中点击的按钮
对话框的ShowDialog方法会返回DialogResult类型的返回值。DialogResult是枚举类型,通过检查该枚举值,即可知道用户是通过单击哪个按钮关闭对话框的。
例如,要检测用户是否是单击了OK按钮从而关闭文件对话框,可以使用如下代码:
if (this.openFileDialogPhoto.ShowDialog()==DialogResult.OK)
{
       …
}
(3)        将数据库中读取的照片文件显示在控件中
从数据库中读取照片,照片的列row.phptoImage是byte 数组类型。要将照片直接显示在控件中,而非先存储在硬盘上再调入控件显示,需要使用MemoryStream类。具体方法如下:
MemoryStream mstream;
       if(row.photoImage.Length!=0)
       {
              mstream=new MemoryStream(row.photoImage);
              this.picPhoto.Image= new Bitmap(mstream);
       }
(4)        使用 Command 对象的 ExecuteScalar 方法
一般使用 Command 对象的 ExecuteReader 方法来将数据库的返回结果保存在 DataReader 中。如以下代码所示:
dbReader = cmd.ExecuteReader();
但如果返回结果是单个标量值,如一个整数或一个字符串,则可以执行 Command 对象的 ExecuteScalar 方法直接获取该值。
编码示例如下:
byte b;
b = (byte)cmd.ExecuteScalar();
 
(5)        为 Command 对象添加参数的两种方法
这两种方法其实是 Parameters 对象的 Add 方法的两种变体。第一种方法比较简单,就是直接使用 Add 方法添加参数,并同时指定参数的类型和值。代码如下:
cmd.Parameters.Add("@EmpID",System.Data.SqlDbType.Int).Value = iEmpID;
另外一种方法比较复杂,它需要先声明一个 SqlParameter 类型的对象,然后使用 Add 方法添加该参数对象。这种方法便于调试。代码如下:
SqlParameter paramEmpID = new SqlParameter("@EmpID", System.Data.SqlDbType.Int);
paramEmpID.Value = strSelfIntro;
cmd.Parameters.Add(paramEmpID);
(6)        解决Typed DataSet中空字段值的问题
Typed DataSet可以大大提高开发的效率。但是在某个字段值为空的情况下,使用Typed DataSet读取该字段会引发系统异常。要解决这个问题有两种方法:
1)        在数据库中为所有运行为空的字段设置缺省值
2)        修改VS.NET自动生成的XSD文件
在这里仅介绍第二种方法。对于值可以为空的字段,XSD文件中原来的描述应该类似如下代码(其中DeptName、Title和Telephone字段在数据库中可以为空值):
<xs:elementname="Name"type="xs:string"/>
<xs:elementname="LoginName"type="xs:string"/>
<xs:elementname="Email"type="xs:string"/>
<xs:elementname="DeptName"type="xs:string"minOccurs="0"/>
<xs:elementname="Title"type="xs:string"minOccurs="0"/>
<xs:elementname="Telephone"type="xs:string"minOccurs="0"/>
为了避免在使用Typed DataSet访问数据库时出现异常,可以手工修改定义,在字段描述中加上 codegen:nullValue=" ",从而避免错误的出现。修改后,XSD文件片断如下:
<xs:elementname="Name"type="xs:string"/>
<xs:elementname="LoginName"type="xs:string"/>
<xs:elementname="Email"type="xs:string"/>
<xs:elementname="DeptName"codegen:nullValue=""type="xs:string"minOccurs="0"/>
<xs:elementname="Title"codegen:nullValue=""type="xs:string"minOccurs="0"/>
<xs:elementname="Telephone"codegen:nullValue=""type="xs:string"minOccurs="0"/>
更多关于XSD文件修改的内容,请参考微软知识库文章:
(7)        在TreeView控件中使用拖放功能
在TreeView中使用拖放功能可以简化用户的操作,提供更加友好的界面。
TreeView控件中的拖放和一般控件相比更加复杂。需要三个事件处理函数配合使用。代码如下(其中tvDept是一个TreeView控件):
///<summary>
///用拖放的方式实现员工在部门间的移动
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void tvDept_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
{
      DoDragDrop(e.Item, DragDropEffects.Move);
}
 
///<summary>
///用拖放的方式实现员工在部门间的移动
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void tvDept_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
   e.Effect = DragDropEffects.Move;
}
 
///<summary>
///用拖放的方式实现员工在部门间的移动
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void tvDept_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
      try
{
         //执行业务逻辑,处理拖放事件
 
具体的相关方法请参考微软知识库文档:
http://support.microsoft.com/default.aspx?kbid=307968
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:238332次
    • 积分:3167
    • 等级:
    • 排名:第11229名
    • 原创:55篇
    • 转载:93篇
    • 译文:3篇
    • 评论:21条
    41-计算机软件维护