分类: C/C++
2008-08-01 17:02:53
本文使用以下技术:C# 与 Windows 窗体
微软的 .NET 框架 1.0
版确实很好地满足了我们的要求。.NET在以下两方面有重要的意义,它不仅根本性地改变了开发者构建与发布 Windows 应用程序的方法,而且还创建了一个巨大的具有很好伸缩特性的技术平台,Visual Studio2005
就是一个很好的例子,它在用户的可定制性和改进的功能性方面都表现的很好。这些变化影响的范围主要集中在 Microsoft
.NET框架中的 Windows 窗体子集,从核心的 System.Windows.Forms 命名空间扩展到多种多样的支持性技术,既有旧的也有新的,包括ADO.NET,ObjectSpaces 以及 ClickOnce 部署。
在 Visual Studio
2005 的各个方面都能发现生产效率的提高,包括增强的集成开发环境,改进的控件和数据设计器,还有代码生成器。由于不必手工编写各种各样预定格式的代码,代码编写狂们可能会感到沮丧,而我们就可以有更多的时间来享受我们的生活了。
System.Windows.Forms
一些重要的工作已经在 System.Windows.Forms
中做好了,激动人心的新技术中便包含了 Windows 窗体。就在我写本文的同时,可用的命名空间数量和公用类型与成员的组成分别增加了67% 和 127%,这无疑标志着 Visual
Studio 2005 是一个卓越的产品。当然本文中我们没有足够的篇幅来讲述每一件事, Figure 1
向我们展示了主要改进方面的概览,这些新增与加强的改进覆盖面较广,例如更好的主题支持,改进的数据绑定,以及 GridView 控件。
类别 | 描述 |
---|---|
布局控件 | SplitContainer, FlowLayout, and TableLayout container
用于在设计时和运行时管理控件的控件. |
数据绑定控件 | GridView 控件用来丰富表格样式数据的表现形式, 查询方式, 与处理方式。 DataContainer用来简化数据绑定和数据绑定用户界面的设计,支持VCR样式的用户界面设计和master-detail 用户界面设计。 |
用户界面构造组件 | MainMenu组件现在支持给菜单项添加图片。WinBar控件提供了与Microsoft Office一样的工具条。WebBrowser控件是一个封装了shdocvw.dll的托管浏览器。 |
控件与组件 | ControlArray使提供单一的接口得到恢复 |
管理 | 用来管理许多控件,它们可以使不同的类型。ComponentArray 是代替ControlArray的不错方法,它面向组件。 |
异步调用支持 | 后台工作的组件覆盖了工作线程的创建与管理(技术上不从System.Windows.Forms中实现,但确实Windows窗体可以实现).声音文件在声音组件中加载。图像文件在图片框控件中加载。 |
基本改进 | 对文本框和复合列表框控件自动完成功能的支持,可自动完成包括IE浏览历史纪录和开始|运行命令等许多系统资源。复合列表框与列表框控件新增了对最进使用过的列表项进行格式化的支持。 |
public class Form1 : System.Windows.Forms.Form { ... [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } ... }在以前,将控件的FlatStyle属性值设为"System"就意味着操作系统决定了控件显示时的外观。现在,当FlatStyle属性设置为默认值"Standard"时, Visual Studio 2005的大部分控件都会依据当前正在使用的Windows主题来呈现自己。这与先通过系统设定然后保存你在设计器中的设定结果基本上是一样的。无论FlatStyle 属性为"Standard"还是"System",窗体在运行时会依据主题的改变动态地作出反应,却不需要编写一行代码,这种关于主题的灵敏性对开发者是有利的。
enum AutoCompleteMode { None = 0x0, // No autocompletion AutoSuggest = 0x1, // Possible matches chosen from drop-down list AutoAppend = 0x2, // Possible matches // appended to text // while typing AutoSuggestAppend = 0x3 // AutoSuggest and // AutoAppend combined }除了选择"None",其他选项都需要你设置AutoCompleteSource属性,其值为系统预先设定好的AutoCompleteSource枚举值 :
enum AutoCompleteSource { FileSystem = 0x1, // File system HistoryList = 0x2, // All URLs from History list RecentlyUsedList = 0x4, // All URLs from Recently Used list AllURL = 0x6, // HistoryList RecentlyUsedList AllSystemSources = 0x7, // FileSystem AllURL CustomSource = 0x40, // AutoCompleteCustomSource None = 0x80 // No source }
设定自定义源的复合列表框需要我们提供自动完成选项,这些选项可以来自存储在AutoCompleteCustomSource属性中的元素的集合。目前,复合列表框和文本框是仅有的提供自动完成功能的控件。
GridView
工具箱中的大多数控件都支持数据绑定,通过底层的数据绑定构件来绑定各种各样的数据源。在目前许多情形下,尤其是原型和快速开发中,数据绑定都是关键。Windows窗体开发小组用改进的类型化数据集明显地加强了数据绑定命名空间,包括GridView和DataContainer,并为快速开发加强了设计时支持。这些特性让你开发分区域样式的用户界面或表格样式的用户界面时感到一样的轻松。
有时表格样式的用户界面更适合展现绑定的数据,并且另一方面,微软在其前一个版本的.NET框架中包含了DataGrid控件。对于Visual
Studio 2005来说,Windows窗体开发小组响应了社区中关于DataGrid的反馈并决定构造一个新的表格控件,System.Windows.Forms.GridView
(参见 Figure 4)。
Figure 4 GridView 列
也许DataGrid与GridView(表格视图)最明显的区别就是GridView的对象模型,它已经被抽象为一个基于列、行的自然表格结构,允许开发者通过大量直观的定位函数来操纵每一个单元格,包括以下几点:
结合过去广泛的设计经验,这些新特性使我们可以快速自定义控件而不用写很多代码,其实是将对DataGrid的特定编码塞进了GridView的方法、属性和事件中。其中的一个例子就是在DataGrid中通过单击单元格来选择一行,
而现在以GridView的SelectionMode
属性的方式暴露出来。当然没有一个控件是十全十美的,当它们表现出不足时,开发者应该依靠其扩展特性来组合出具有自定义特性的控件。GridView控件的底层实现都是基于多种单元格、行和列的,你可以继承并进行扩展。总的来说,GridView作为表格样式的控件比DataGrid更加引人注目。
类型化的数据集
GridView 控件是可以绑定数组、集合和类型化数据集的控件家族中的一员。类型化数据集的优点是:.NET框架允许控件在设计器中进行绑定以帮助开发者看到设计好的用户界面。GridView通过在设计时自动生成数据源中每一个字段的数据来实现这项功能。Visual
Studio
2005增强了类型化数据集从而使我们的生活更轻松。你将减少花在设计窗体上的时间,类型化数据集现在可以将数据源中的元数据完整的呈现出来,包括外键约束和递增种子以及步骤控制。如Figure 5所示。
Figure 5 默认的类型化数据集
设计器同时也产生一个填充查询,它封装了查询相关表的Select语句并且在类型化数据集中以同名方法实现。有时,系统初始指定的Select、Insert、Update和Delete语句不好用。例如,填充方法将返回所有的雇员信息,而很多时候你只是需要返回一名员工的信息。在这种情况下,使用自己指定的查询语句并填充才是明智之举。类型化数据集设计器允许你添加自己的查询语句,通过在适当表格的上下文菜单中选择“添加”|“查询”来实现。
“数据表查询向导”对话框可以帮助你构造你自己的查询语句,之后数据表会被新数据更新。当你完成类型化数据集的配置后,你会将他绑定到用户界面中的一个或多个控件中。在Visual
Studio 2005中, 类型化数据集可以被直接绑定到那些实现了数据源和数据成员属性的控件中,而不必添加数据集对象到窗体中。
DefaultInstance
任何曾经大量使用类型化数据集的人都知道,一般来说每一个新的类型化数据集类仅在应用程序的一个地方被使用。因为Windows窗体开发小组了解我们并希望使我们更轻松,他们已经在每个通用的类型化数据集类中设置了一个静态属性DefaultInstance,通过调用它来获取这个单一实例。如下实现:
public static EmployeeTDS DefaultInstance { get { if (_defaultInstance == null) { _defaultInstance = new Northwind(); } return _defaultInstance; } }你可以这样使用DefaultInstance属性:
public class Form1 : System.Windows.Forms.Form { ... private void Form1_Load( object sender, System.EventArgs e) { // Load data EmployeeTDS.DefaultInstance.LoadData(); } ... }数据绑定控件使用DefaultInstance的类型名设置它们的数据源属性,类型名默认为"工程命名空间 。类型数据集名"的形式,而随后指定数据成员的步骤保持不变。
[assembly: AssemblyVersion("1.0.*")]版本号被用来决定是否有一个新的版本可以用于下载。它也用来命名部署文件夹和程序所在的客户端临时文件夹。两个文件夹的名称转换形式为程序名_主号_辅号_生成号_修订号。