精华内容
下载资源
问答
  • ACCESS数据库窗体

    千次阅读 2014-07-17 09:41:48
    1、窗体并不直接存储数据,只是以数据表为基础而创建数据操作的结果最终都存储在数据表中。 2、窗体中的信息分为两类:一是处理的或查询的记录信息;二是设计者附加的提示信息。 3、记录:可以是、查询、...

    1、窗体并不直接存储数据,只是以数据表为基础而创建,数据操作的结果最终都存储在数据表中。
    2、窗体中的信息分为两类:一是处理的表或查询的记录信息;二是设计者附加的提示信息。
    3、记录源:可以是表、查询、SQL 语句,用于指定窗体操作的数据来源。
    4、窗体的组成和结构:窗体的每个部分称为”节“;窗体由五个部分构成:主体、窗体页眉、窗
    体页脚、页面页眉、页面页脚。
    ①窗体页眉/页脚、页面页眉/页脚都是成对出现、或删除的。
    ②在窗体视图中,只显示窗体页眉、窗体页脚、主体三个部分。
    ③在打印预览时可显示窗体的五个部分,即页面页眉/页脚只在“打印预览”时可以显示。
    ④整个窗体宽度由窗体的宽度属性决定,主体、窗体页眉、窗体页脚部分没宽度属性。
    ⑤整个窗体的高度由主体、窗体页眉、窗体页脚三部分高度之和决定。
    5、窗体分类:纵栏式、表格式、数据表、多项目窗体、主子窗体、数据透视表、分割窗体、导航
    窗体。
    ①在利用图表向导创建图表的过程中,所允许的最多字段数为 6 个。
    ②数据透视表窗体中数据分为:行字段、列字段、汇总或明细字段。
    ③主子窗体中使用的数据表之间必须要事先建立联系。
    ④子窗体中还可以再包含子窗体,可以嵌套多达七层的子窗体。
    ⑤主子窗体有三种创建方式:一是同时创建主窗体和子窗体,二是将已有的窗体作为子窗体添加到
    另一个已有的窗体中,三是直接自动创建。
    6、窗体属性对话框选项卡有:格式、数据、事件、其它、全部等 5 个。
    7、窗体的常见属性:记录源、标题(caption)、滚动条、导航按钮、分隔线、边框样式、宽度、图
    片、图片类型、图片缩放模式。
    ①窗体名称是在窗体保存时指定,控件通过属性窗口的名称属性进行设置。
    ②设置窗体的图片属性性后,主体、窗体页眉、窗体页脚的颜色都将被窗体背景图覆盖了。
    ③对于数据源,对窗体而言称为“记录源”,对控件而言称为“控件来源”。
    8、控件类型:绑定型(结合型)、非绑定型(非结合型)、计算型。
    9、控件基本属性:名称(name)、控件来源、标题(caption)、左边距(left)、上边距(top)、背景色
    (BackColor)、前景颜色 ForeColor、可见性(Visible)、可用(Enable)、Tab 键索引。
    更多ACCESS知识请到 Access 2013从入门到精通

    http://www.kesjc.com/wendalanmu/321.html

    展开全文
  • 知识点:创建Windows应用程序的方法,窗体的基本属性和方法、基本控件的使用、事件处理、消息框的使用 1、创建windows应用程序的方法 Windows应用程序是目前应用软的主流,用户使用方便且功能强大。所以掌握...

    知识点:创建Windows应用程序的方法,窗体的基本属性和方法、基本控件的使用、事件处理、消息框的使用

    1、创建windows应用程序的方法

             Windows应用程序是目前应用软的主流,用户使用方便且功能强大。所以掌握windows应用程序的开发是软件开发的必备技能。Windows应用程序由一个个窗体组成。

    1.1  应用程序和windows应用程序

    • 应用程序:为满足用户不同领域、不同问题的应用需求而提供的那部分软件。比如办公程序软件word、Excel;多媒体软件如媒体播放器、图像软件ps、crd;互联网软件如浏览器、即时通讯QQ微信……

    • windows应用程序:计算机操作系统有很多,比如windows系统、UNIX系统、DOS系统……。顾名思义,应用在windows系统上的程序就是windows应用程序。

            应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服

    展开全文
  • 创建数据访问层

    2007-02-25 21:38:00
    我们还需要创建数据库来存储数据创建代码来获取并且更改数据创建 Web 页面来收集并且描述数据。本文是在 ASP.NET 2.0 中实现公共开发模式的长篇技术探究系列中的第一个指南。我们将会从创建一个软件架构开始,这...

    介绍

    与 Web 开发者一样,我们需要考虑如何对数据进行操作。我们还需要创建数据库来存储数据,创建代码来获取并且更改数据,创建 Web 页面来收集并且描述数据。本文是在 ASP.NET 2.0 中实现公共开发模式的长篇技术探究系列中的第一个指南。我们将会从创建一个软件架构开始,这个架构中包含了一个使用类型化的 DataSet 的数据访问层(DAL)、一个执行自定义业务规则的业务逻辑层(BLL),以及一个由若干共享公共页面布局的 ASP.NET 页面所组成的表现层。一旦这个后端基础被铺设完毕,我们就将转移到数据的报告任务,并且说明如何从 Web 应用程序中对数据进行显示、描述、收集,以及验证。另外,这些指南都作出了简单化调整并且使用了大量的屏幕快照来提供逐步的可视化指导,以帮助你通过每一个步骤。每个指南都有可用的 C# 与 Visual Basic 版本并且包括了一个完整的源代码下载。(注意:第一个指南的内容是相当长的,但是其他的部分则被分别呈现成相对比较容易吸收的更多部分。)

    在这些指南中我们将会使用 Microsoft SQL Server 2005 Express Edition 版本中的 Northwind 数据库,这个数据库被存放在 App_Data 目录中。除了数据库文件之外,App_Data 目录同样还包含了创建这个数据库的 SQL 脚本,以便在万一你需要使用其他数据库版本的时候才考虑使用。这些脚本同样也可以直接从 Microsoft 下载,如果你愿意的话。如果你使用了其他 SQL Server 版本中的 Northwind 数据库,那么你就需要更新应用程序 Web.config 文件中的 NORTHWNDConnectionString 设置。这个 Web 应用程序是使用 Visual Studio 2005 Professional Edition 并且作为一个基于文件系统的网站工程而被建立的。但是,所有的这些指南同样能够很好地在 Visual Studio 2005 的免费版本 Visual Web Developer 中运作。

    在这个指南中我们将从非常基础的开始并且创建数据访问层(DAL),然后在第二个指南中创建业务逻辑层(BLL),然后在第三个指南中操作页面布局与导航。并且以后的所有指南都需要建立在前三个指南的基础之上。因此,我们会在第一个指南中涵盖大量的内容,OK,现在就启动你的 Visual Studio,然后我们就开始!

    第 1 步:创建一个 Web 工程并且连接到数据库

    在能够创建数据访问层(DAL)之前,我们首先需要创建一个网站并且设置数据库。首先从创建一个新的基于文件系统的 ASP.NET 网站作为开始。要完成这个任务,就需要转到 New 菜单并且选择 New Web Site,之后会显示 New Web Site 对话框。选择 ASP.NET Web Site 模板,在 Location 下拉列表框中设置成 File System,并且选择一个目录来存储这个网站,然后把编程语言设置成 C#。

    o_0101.png

    图 1:创建一个新的基于文件系统的网站

    这将创建一个拥有一个名为 Default.aspx 的 ASP.NET 页面和一个 App_Data 目录的新网站。

    在网站被创建之后,接下来就是在 Visual Studio 的 Server Explorer 中添加数据库的引用。通过在 Server Explorer 中添加数据库,你就能够在 Visual Studio 中添加数据库、存储过程、视图,等等。你同样也能够通过 Query Builder 以手工或者图形化的方式来查看数据表的数据或者创建你自己的查询。另外,在我们为 DAL 建立类型化的 DataSet 时,我们需要把 Visual Studio 定位到将被构造成类型化 DataSet 的数据库中。虽然我们能够在那个时候提供连接的信息,但是 Visual Studio 会自动把已经在 Server Explorer 中被注册的数据库组装进一个下拉列表框中。

    为 Server Explorer 添加 Northwind 数据库的步骤取决于你是否需要在 App_Date 目录中使用 SQL Server 2005 Express Edition 数据库或是你想要使用一个 Microsoft SQL Server 2000 或者 2005 数据库服务器的安装来作为替代。

    使用 App_Data 目录中的数据库

    如果你没有可供连接的 SQL Server 2000 或者 2005 数据库服务器,又或者你只是想要避免把这个数据库添加到数据库服务器中,那么你就可以使用位于被下载网站的 App_Data 目录中的 Northwind 数据库的 SQL Server 2005 Express Edition 版本(NORTHWIND.MDF)。

    存放在 App_Data 目录中的数据库会自动添加到 Server Explorer 中。假设你已经在你的机器中安装了 SQL Server 2005 Express Edition,那么你应该能够在 Server Explorer 中看到一个名为 NORTHWIND.MDF 的节点,因此你可以展开并且浏览它的数据表、视图、存储过程,等等(如图 2)。

    App_Data 目录同样能够保持 Microsoft Access .mdb 文件,与它们的 SQL Server 副本一样,也会自动被添加到 Server Explorer 中。如果你不想要使用任何 SQl Server 选项,那么你随时都可以下载 Northwind 数据库的 Microsoft Access 文件版本并且把它存放到 App_Data 目录中。切记,无论如何,Access 数据库都没有 SQL Server 那么丰富的特征,并且也不是被设计成用在网站开发情节中的。另外,本系列中将近 35 个以上的指南中都将对数据库级别的特定特征进行利用,并且这些特征都不会被 Access 所支持。

    连接到 Microsoft SQL Server 2000 或者 2005 数据库服务器中的数据库

    作为选择,你可以连接到一个被安装在数据库服务器中的 Northwind 数据库。如果数据库服务器没有安装 Northwind 数据库,那么你首先必须通过被包括在这个指南的下载中的安装脚本或者直接从 Microsoft 网站上下载 Northwind 的 SQL Server 2000 版本和安装脚本把它添加到数据库服务器中。

    一旦你完成了这个数据库的安装,就可以转到 Visual Studio 中的 Server Explorer,右键单击 Data Connections 节点,然后选择 Add Connection。如果你没有看到 Server Explorer,就需要选择 View / Server Explorer 菜单,或者按下 Ctrl+Alt+S 快捷键来显示它。这将会显示 Add Connection 对话框,因此你可以指定要连接到的服务器、识别信息,以及数据库的名称。一旦你已经成功地配置了数据库连接信息并且点击了 OK 按钮,那么这个数据库就会被添加成 Data Connections 节点下面的一个子节点。然后你可以展开这个数据库节点来浏览它的数据表、视图、存储过程,等等。

    o_0102.png

    图 2:添加数据库连接来连接到你的数据库服务器的 Northwind 数据库

    第 2 步:创建数据访问层

    在操作数据的时候有一个选项就是把特定的数据逻辑直接嵌入到表示层(在 Web 应用程序中,ASP.NET 页面就被用来构成表示层)中。这可能需要获取在 ASP.NET 页面的代码部分编写了 ADO.NET 代码的窗体或者在标记部分使用 SqlDataSource 控件。无论是哪一种情况,这种方法都把数据访问逻辑紧耦合到了表示层中。然而,被推荐的方法则是从表现层中分离出数据访问逻辑。这个被分离的层将被引用成数据访问层,简称 DAL,并且典型地被实现成一个分离的类库工程。已分层架构的好处是能够充分地文档化的(关于这些优势的信息,请参考本指南中的最后部分:[进一步阅读])并且也是我们在这个指南系列中将要使用的方法。

    所有特定的底层数据源代码(比如创建数据库连接、发布 SELECT、INSERT、UPDATE、以及 DELETE 命令,等等)都应该位于 DAL 中。表示层不应该包含这些数据访问代码的任何引用,而是应该为所有数据请求而对 DAL 进行调用。数据访问层通常包含了用来访问底层数据库数据的方法。例如,Northwind 数据库中拥有记录产品的出售以及它们的所属目录的 Products 与 Categories 数据表,因此我们的 DAL 中将拥有下列方法:

    • GetCategories(),将会返回所有目录的相关信息
    • GetProducts(),将会返回所有产品的相关信息
    • GetProductsByCategoryID(categoryID),将会返回所有属于特定目录的产品
    • GetProductByProductID(productID),将会返回一个特定的产品信息

    在调用的时候,这些方法会连接到数据库,发布适当的查询,并且返回结果。重要的是我们应该如何返回这些结果。这些方法能够简单地返回一个通过数据库查询而被组装的 DataSet 或者 DataReader,但是使用强类型化的对象来返回这些结果却是最理想的方式。强类型化的对象是一种在编译时被严格定义的结构,反之亦然。松散类型化的对象则是一种直到运行时都是无法被了解的结构。

    例如,DataReader 与 DataSet(默认)都是松散的类型化对象,直到它们的结构通过使用对它们进行组装的数据库查询所返回的数据列而被定义为止。如果要从松散的类型化 DataTable 中访问特定的列,我们就需要使用这样的语法:DataTable.Rows[index]["columnName"]。这个范例中的 DataTable 的松散类型化通过我们需要使用一个字符串或者序列索引来访问列名称的实际情况而被展示。强类型化的 DataTable 在另一方面将拥有每个被实现成属性的列,因此代码将会像这样:

    DataTable.Rows[index].columnName

    如果要返回强类型化的对象,那么开发者既能够创建属于他们自己的自定义业务对象也可以使用类型化的 DataSet。开发者把业务对象实现成了一个类,而这个类的属性则典型地反射了业务对象所呈现的底层数据表的列。一个类型化的 DataSet 就是你通过使用 Visual Studio 并且基于数据库结构而被生成的类,并且这个类包含有符合结构而被强类型化的成员。类型化的 DataSet 本身则是由扩展了 ADO.NET DataSet、DataTable,以及 DataRow 等等的这些类所组成。除了强类型化的 DataTable 之外,类型花的 DataSet 现在同样也包括了 TableAdapter(是提供方法来组装 DataSet 的 DataTable,并且在 DataTable 中产生更改然后返回到数据的类)。

    提示:关于使用类型化的 DataSet 与使用自定义业务逻辑的优势与劣势的更多信息,请参考:[设计数据层组件]与[通过层来传递数据]。

    我们将会在这些指南的架构中使用强类型化的 DataSet。图 3 就说明了应用程序中使用类型化 DataSet 的不同层之间的工作流程。

    o_0103.png

    图 3:所有数据访问代码都被转移到 DAL 中

    创建类型化的 DataSet 与 TableAdapter

    要开始创建我们的 DAL,我们首先需要把一个类型化的 DataSet 添加到工程中。要完成这个任务,就需要右键单击 Solution Explorer 中的工程节点并且选择 Add a New Item。然后从模板列表中选择 DataSet 选项并且把它命名成 Northwind.xsd。

    o_0104.png

    图 4:选择把一个新的 DataSet 添加到你的工程中

    在单击 Add 之后,并且在被提示把这个 DataSet 添加到 App_Code 目录中的时候,请选择 Yes。这时候就会显示类型化的 DataSet 的 Designer,并且 TableAdapter Configuration Wizard 也会启动,并且允许你把你的第一个 TableAdapter 添加到类型化的 DataSet 中。

    一个类型化的 DataSet 就相当于一个强类型化的数据集合;它由若干强类型化的 DataTable 实例所组成,而每个 DataTable 则由若干强类型化的 DataRow 实例所组成。我们将要为每个我们需要在这个指南系列中进行操作的底层数据表来创建一个强类型化的 DataTable。让我们先从为 Products 数据库创建一个 DataTable 来作为开始。

    切记,强类型化的 DataTable 并不包括任何以及如何从它们的底层数据表中访问数据相关的信息。为了获取数据来组装 DataTable,我们使用了一个 TableAdapter 类,这个类的作用与我们的数据访问层是一样的。至于我们的 Products DataTable,TableAdapter 将会包含我们将要从表示层中对这些方法进行调用的 GetProducts()、GetProductByCategoryID(categoryID) 等等方法。而 DataTable 的任务就是作为一个被用来在层之间传递数据的强类型化对象。

    TableAdapter Configuration Wizard 开始会提示你选择需要进行操作的数据库。下拉列表框显示出了 Server Explorer 中的数据库。如果你没有在 Server Explorer 中添加 Northwind 数据库,那么你就可以在这个时候单击 New Connection 按钮来完成添加操作。

    o_0105.png

    图 5:从下拉列表框中选择 Northwind 数据库

    在选择数据库并且单击 Next 之后,你将被询问是否需要把连接字符串保存到 Web.config 文件中。通过保存连接字符串,你就可以避免在 TableAdapter 类中对它进行硬编码,从而简化在将来的某个时候对连接字符串所作的改变。如果你选择把连接字符串保存到配置文件中,那么它就会被存放在 <connectionStrings> 配置段中,从而能够有选择性地被加密来改进安全性或者在以后通过 IIS GUI Admin Tool 中全新的 ASP.NET 2.0 Property Page 而被更改,这对于管理员来说也是比较理想的方式。

    o_0106.png

    图 6:把连接字符串保存到 Web.config 文件

    接下来,我们需要为第一个强类型化的 DataTable 而定义结构并且为我们的 TableAdapter 提供在组装强类型化的 DataSet 时所使用的第一个方法。通过创建一个从需要在我们的 DataTable 中被反射的数据表中返回列的查询,这两个步骤就能够同时被完成。在向导的最后部分我们将为这个查询而提供一个方法名称。这些任务一旦被完成,这个方法就能够从我们的表示层中被调用。这个方法将执行被定义的查询并且组装成一个强类型化的 DataTable。

    要开始定义 SQL 查询,我们就必须首先指出我们应该如何让 TableAdapter 来发布查询。我们可以使用一个特别的 SQL 声明来创建一个新的存储过程,或者也可以使用一个现有的存储过程。在这些指南中,我们将要使用的是特别的 SQL 声明。关于使用存储过程的范例,请参考 Brian Noyes 的文章:[使用 Visual Studio 2005 DataSet Designer 来建立一个数据访问层]。

    o_0107.png

    图 7:使用特别的 SQL 声明来查询数据

    现在我们能够以手工的方式来输入 SQL 查询。在 TableAdapter 中创建第一个方法的时候,你通常需要这个查询能够返回在适当的 DataTable 中被表示的列。我们还能够通过创建一个从 Products 数据表中返回所有列与所有行的查询来完成这个任务:

    o_0108.png

    图 8:在文本框中输入 SQL 查询

    作为选择,也可以使用 Query Builder 并通过图形化的方式来构造这个查询,如图 9 所示。

    o_0109.png

    图 9:通过 Query Editor,以图形化的方式来创建查询

    在创建查询之后,但是在转到下一个步骤之前,单击 Advanced Options 按钮。在 Web Site Projects 中,"Generate Insert, Update, and Delete statements" 是默认时唯一被选中的高级选项;如果你从一个 Class Library 中或者一个 Windows Project 中运行这个向导,那么 "Use optimistic concurrency" 选项将同样也是被选中的。现在我们让 "Use optimistic concurrency" 选项保持未选择的状态。并且在将来的指南中讲解并发优化。

    o_0110.png

    图 10:只选择 "Generate Insert, Update, and Delete statements" 选项

    在核实高级选项之后,单击 Next 继续转到最终步骤。在这时我们将被询问需要在 TableAdapter 中添加哪个方法。并且可以通过两个模式来组装数据:

    • 填充一个 DataTable

      通过这种方式而被创建的方法会获取一个 DataTable 来作为参数并且基于查询的结果来对它进行组装。例如,ADO.NET DataAdapter 类会以它的 Fill() 方法来实现这个模式。

    • 返回一个 DataTable

      通过这种方式而被创建的方法会为你填充 DataTable 并且把它作为方法的返回值。

    你可以通过 TableAdapter 来实现这些模式中的任何一种或者全部。你同样可以对被提供的方法进行重命名。让我们保持所有的复选框都是被选中的,尽管我们在这些指南中只会使用后面的模式。同样,让我们把普通的 GetData 方法重命名为更合适的 GetProducts。

    如果最终的复选框 "GenerateDBDirectMethods" 被选中,那么就会为 TableAdapter 创建 Insert()、Update(),以及 Delete() 方法。如果你想要保持这个选项是未被选中的,那么所有的更新就需要通过 TableAdapter 中唯一的 Update() 方法来完成,这个方法还会获取类型化的 DataSet、一个 DataTable、一个单独的 DataRow,或者一个 DataRow 数组。(如果你没有从图 9 所示的高级属性中选中 "Generate Insert, Update, and Delete statements" 选项,那么复选框的设定就不会起作用。)现在让我们保持这个复选框是未被选中的。

    o_0111.png

    图 11:把方法的名称从 GetData 改成 GetProducts

    单击 Finish 完成向导。在向导被关闭之后,我们就会返回到 DataSet Designer 中来,并且其中还会显示我们刚才所创建的 DataTable。你可以看见 Products DataTable 的数据列的列表(ProductID、ProductName,等等),以及 ProductsTableAdapter 的方法(Fill() 与 GetProducts())。

    o_0112.png

    图 12:被添加到类型化的 DataSet 中的 Products DataTable 与 ProductsTableAdapter

    现在我们已经拥有了一个类型化的 DataSet,它包含了一个单独的 DataTable(Northwind.Products)以及一个定义了 GetProducts() 方法的强类型化的 DataAdapter 类(NorthwindTableAdapters.ProductsTableAdapter)。这些对象都能够在代码中被用来访问所有产品的列表,如下所示:

    NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter();
    Northwind.ProductsDataTable products;
    
    products = productsAdapter.GetProducts();
    
    foreach (Northwind.ProductsRow productRow in products)
        Response.Write("Product: " + productRow.ProductName + "<br />");

    这个代码交不需要我们编写任何与特定的数据访问相关的代码。我们并没有实例化任何的 ADO.NET 类,我们也没有引用到任何连接字符串、SQl 查询,或者存储过程。取而代之的是,TableAdapter 为我们提供了所有用于底层数据访问的代码。

    在这个范例中被使用的每个对象都是强类型化的,并且允许 Visual Studio 来提供 IntelliSense 与编译时的类型检查。并且所有通过 TableAdapter 而被返回的 DataTable 最好是能够被绑定到 ASP.NET 的数据 Web 控件中(比如 GridView、DetailsView、DropDownList、CheckBoxList,等等)。下列范例说明了如何把通过 GetProducts() 方法而被返回的 DataTable 绑定到一个 GridView 控件,所有的这些只需要在 Page_Load 事件处理器中使用三行代码就能够很好地被完成。

    AllProducts.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs" Inherits="AllProducts" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>View All Products in a GridView</title>
        <link href="Styles.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>
                All Products</h1>
            <p>
                <asp:GridView ID="GridView1" runat="server"
                 CssClass="DataWebControlStyle">
                   <HeaderStyle CssClass="HeaderStyle" />
                   <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                </asp:GridView>
                &nbsp;</p>
    
        </div>
        </form>
    </body>
    </html>
    AllProducts.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using NorthwindTableAdapters;
    
    public partial class AllProducts : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ProductsTableAdapter productsAdapter = new
             ProductsTableAdapter();
            GridView1.DataSource = productsAdapter.GetProducts();
            GridView1.DataBind();
        }
    }

    o_0113.png

    图 13:被显示在 GridView 中的产品列表

    这个范例虽然在我们的 ADP.NET 页面的 Page_Load 事件处理器中编写了所必需的三行代码,但是在将来的指南中我们将会讲解如何使用 ObjectDataSource 声明来从 DAL 中获取数据。通过使用 ObjectDataSource,我们将不需要编写任何代码并且还能够获取很棒的分页与排序支持!

    第 3 步:把参数化的方法添加到数据访问层

    现在我们的 ProductTableAdapter 类只拥有一个方法 GetProducts(),它用来返回数据库中的所有产品。虽然操作所有产品是明确有用的,但是在我们需要获取与特定产品或者与属于特定目录的所有产品的相关信息的时候,我们就可以在数据访问层中添加这样的功能:为 TableAdapter 添加参数化的方法。

    让我们添加 GetProductsByCategoryID(categoryID) 方法。要在 DAL 中添加新的方法,就需要返回到 DataSet Designer,然后右键单击其中的 ProductsTableAdapter 部分,并选择 Add Query。

    o_0114.png

    图 14:右键单击 TableAdapter 然后选择 Add Query

    我们首先被提示是否需要使用一个特别的 SQL 声明或者是一个新的还是现有的存储过程来访问数据库。我们再次选择使用一个特别的 SQL 声明。然后,我们会被询问将被使用的 SQL 查询类型。因为我们需要返回属于一个被指定目录中的所有产品,所以我们就需要编写一个返回数据行的 SELECT 声明。

    o_0115.png

    图 15:选择创建一个能够返回数据行的 SELECT 声明

    下一步就是定义被用来访问数据的 SQL 查询。因为我们只需要返回属于一个特定目录的产品,所以我使用了与 GetProducts() 方法中相同的 SELECT 声明,但是添加了下列 WHERE 子句:WHERE CategoryID = @CategoryID。参数 @CategoryID 表示我们使用 TableAdapter 向导所创建的方法将需要一个拥有适当类型的输入参数(即一个允许为空的整数)。

    o_0116.png

    图 16:输入只用来返回被指定目录中的产品的查询

    在最后的步骤中我们可以选择所使用的数据访问模式,并且自定义被产生的方法名称。关于 Fill 模式,我们将使用 FillByCategoryID 来作为名称,关于返回 DataTable 的返回模式(GetX 方法),我们则使用 GetProductsByCategoryID 来作为名称。

    o_0117.png

    图 17:选择 TableAdapter 的方法名称

    在完成这个向导之后,DataSet Designer 中就会包括新的 TableAdapter 方法。

    o_0118.png

    图 18:现在就可以通过目录来查询产品了

    花一点时间来使用相同的方式添加一个 GetProductByProductID(productID) 方法。

    这些参数化的查询能够直接从 DataSet Designer 中进行测试。右键单击 TableAdapter 中的方法然后选择 Preview Data。接下来,输入要使用的参数值并且单击 Preview。

    o_0119.png

    图 19:属于 Beverages 目录中的产品都将会被显示

    通过在我们的 DAL 中使用 GetProductsByCategoryID(categoryID) 方法,现在我们就能够创建 ASP.NET 页面来显示被指定目录中的产品。下列范例说明了 Beverages 目录中的所有产品,这个目录的 CategoryID 是 1。

    Beverages.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs" Inherits="Beverages" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
        <link href="Styles.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>Beverages</h1>
            <p>
                <asp:GridView ID="GridView1" runat="server"
                 CssClass="DataWebControlStyle">
                   <HeaderStyle CssClass="HeaderStyle" />
                   <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                </asp:GridView>
                &nbsp;</p>
        </div>
        </form>
    </body>
    </html>
    Beverages.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using NorthwindTableAdapters;
    
    public partial class Beverages : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ProductsTableAdapter productsAdapter = new
             ProductsTableAdapter();
            GridView1.DataSource =
              productsAdapter.GetProductsByCategoryID(1);
            GridView1.DataBind();
        }
    }

    o_0120.png

    图 20:Beverages 目录中的所有产品被显示

    第 4 步:插入、更新,并且删除数据

    现在有两个通用的模式被用来插入、更新,并且删除数据。第一个模式,我们将其称之为数据库直接模式,包括了它所创建的方法,并且在被调用的时候会发布一个 INSERT、UPDATE,或者 DELETE 命令给操作单独数据库记录的数据库。这种方法通常被传递进一系列的标量值(整数、字符串、Boolean、DateTime,等等)来对应要插入、更新,或者删除的值。例如,符合这个模式的 Products 数据表的删除方法将获取一个整数参数,来表示要删除的记录的 ProductID,尽管插入方法将会为 ProductName 获取一个字符串、为 UnitPrice 获取一个十进制数字、为 UnitsOnStock 获取一个整数,等等。

    o_0121.png

    图 21:每个插入、更新,以及删除请求都会直接发送到数据库中

    另一个模式,我将把它归纳成批量更新模式,用来更新方法调用中的整个 DataSet、DataTable,或者 DataRow 集合。开发者可以使用这个模式来删除、插入,并且更改 DataTable 中的 DataRow,然后把这些 DataRow 或者 DataTable 传递到一个更新方法中。然后这个方法对被传递进来的 DataRow 进行枚举,并且检测它们是否或者没有被更改、被添加,或者被删除(通过 DataRow 的 RowState 属性值来判断),并且为每条记录发布适当的数据库请求。

    o_0122.png

    图 22:在 Update 方法被调用的时候,所有的改变都能够与数据同步

    TableAdapter 在默认时使用的是批量更新模式,但是同样也支持直接数据库模式。这是因为我们在创建 TableAdapter 的时候从 Advanced Properties 中选中了 "Generate Insert, Update, and Delete statements" 选项,所以 ProductsTableAdapter 中包含了一个 Update() 方法,并且实现了批量更新模式。特别要说的是,TableAdapter 包含了能够被传递到类型化的 DataRow 中的一个 Update() 方法。如果你在第一次创建 TableAdapter 的时候保持 "GenerateDBDirectmethods" 复选框是被选中的,那么直接数据库模式同样也会通过 Insert()、Update(),以及 Delete() 方法而被实现。

    这些数据更改模式都使用了 TableAdapter 的 InsertCommand、UpdateCommand,以及 DeleteCommand 属性来把它们的 INSERT、UPDATE,以及 DELETE 命令发布到数据库。你还可以通过在 DataSet Designer 中单击 TableAdapter 然后转到 Properties 窗口中来检查并且更改 InsertCommand、UpdateCommand,以及 DeleteCommand 的属性。(这需要确保你已经选中了 TableAdapter,并且 ProductsTableAdapter 对象在 Properties 窗口的下拉列表框中是被选中的。)

    o_0123.png

    图 23:TableAdapter 拥有 InsertCommand、UpdateCommand,以及 DeleteCommand 属性

    要检查或者更改任何这些数据库命令属性,可以单击 CommandText 子属性,然后 Query Builder 就会出现。

    o_0124.png

    图 24:配置 Query Builder 中的 INSERT、UPDATE,和 DELETE 声明

    下列代码范例说明了如何使用批量更新模式来翻倍所有未被拆开并且备货等于或者少于 25 个单位的产品的价格:

    NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
      new NorthwindTableAdapters.ProductsTableAdapter();
    
    // 翻倍每种产品的价格,如果它没有被拆开并且备货等于或者少于 25 个单位
    Northwind.ProductsDataTable products = productsAdapter.GetProducts();
    foreach (Northwind.ProductsRow product in products)
       if (!product.Discontinued && product.UnitsInStock &lt;= 25)
          product.UnitPrice *= 2;
    
    // 更新产品
    productsAdapter.Update(products);

    下面的代码说明了如何使用数据库直接模式并且通过编程来删除一个特定产品,然后更新一个特定产品,然后添加一个新产品:

    NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter();
    
    // 删除 ProductID 是 3 的产品
    productsAdapter.Delete(3);
    
    // 更新 Chai(ProductID 是 1),把 UnitsOnOrder 设置成 15
    productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
      18.0m, 39, 15, 10, false, 1);
    
    // 添加一个新产品
    productsAdapter.Insert("New Product", 1, 1,
      "12 tins per carton", 14.95m, 15, 0, 10, false);

    创建自定义的插入、更新,和删除方法

    通过数据库直接方法而创建的 Insert()、Update(),和 Delete() 方法可能会有一点琐碎,尤其是在拥有多个列的数据表的情况下。回顾前面的代码范例,Products 数据表的列映射到了 Update() 方法的每个输入参数并且 Insert() 方法在没有 IntelliSense 的帮助下也不是特别清晰的。这也许是在我们只需要更新一两个单独列的时候,或者需要一个将要、或许会返回最新被插入到记录的 IDENTITY(自动增量)字段的值的自定义 Insert() 方法。

    如果要创建这样的自定义方法,就可以返回到 DataSet Designer。右键单击 TableAdapter 并且选择 Add Query,返回到 TableAdapter 向导。在第二个屏幕中我们就可以指定需要被创建的查询类型。让我们创建一个方法来添加新产品并且返回最新被添加的记录中的 ProductID 值。因此,我们选择创建一个 INSERT 查询。

    o_0125.png

    图 25:创建一个方法把新行添加到 Products 数据表中

    在 InsertCommand 的 CommandText 出现之后的下一个屏幕中。通过在查询的未尾部分添加 SELECT SCOPE_IDENTITY() 来增加这个查询,它将返回被插入到相同范围中的 IDENTITY 列的最后标识值。(更多关于 SCOPE_IDENTITY() 以及你为什么需要在 @@IDENTITY 中使用 SCOPE_IDENTITY() 的信息,请参考相关的技术文档。)并且确保你在添加 SELECT 声明的时候已经在 INSERT 声明的未尾部分使用了分号(;)。

    o_0126.png

    图 26:增加返回 SCOPE_IDENTITY() 值的查询

    最后,把新方法命名为 InsertProduct。

    o_0127.png

    图 27:把新方法的名称设置成 InsertProduct

    在你返回 DataSet Designer 的时候,你就会看到 ProductsTableAdapter 中包含了一个新的方法 InsertProduct。如果这个新方法没有 Products 数据表中每个列的参数,就有可能是你忘记在 INSERT 声明的结尾部分使用分号。所以,需要配置 InsertProduct 方法并且确保你使用分号来划分了 INSERT 和 SELECT 声明。

    默认时,在插入方法的时候会发布非查询方法,表示它们会返回受影响行的数量。但是,我们需要通过 InsertProduct 方法来返回由查询所返回的值,而不是被影响行的数量。要完成这个任务,就可以把 InsertProduct 方法的 ExecuteMode 属性调整成 Scalar。

    o_0128.png

    图 28:把 ExecuteMode 属性改成 Scalar

    下列代码说明了这个新的 InsertProduct 方法正在活动:

    NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter();
    
    // 添加一个新产品
    int new_productID = Convert.ToInt32(productsAdapter.InsertProduct("New Product", 1, 1, "12 tins per carton", 14.95m, 10, 0, 10, false));
    
    // 经过重新考虑,删除这个产品
    productsAdapter.Delete(new_productID);

    第 5 步:完成数据访问层

    注意:ProductsTableAdapters 类从 Products 数据表中返回了 CategoryID 和 SupplierID 值,但是并没有包括 Categories 数据表中的 CategoryName 列或者 Suppliers 数据表中的 CompanyName 列,尽管这些都是我们在显示产品信息的时候很可能需要显示的列。所以我们能够添加 TableAdapter 的初始化方法 GetProducts(),来同时包括 CategoryName 和 CompanyName 列的值,它们将更新强类型的 DataTable 来很好地包括这些新列。

    虽然这样做能够呈现一个问题,但是,与 TableAdapter 中不基于这个初始化方法并且用来插入、更新,并且删除数据的方法一样,自动生成的用来插入、更新,并且删除的方法并不会受到子句中的子查询的影响。谨慎地把我们的查询作为子句添加到 Categories 和 Suppliers 中要胜于使用 JOIN,并且我们将避免重写这些用来更改数据的方法。右键单击 ProductsTableAdapter 中的 GetProducts() 方法并且选择 Configure。然后,把 SELECT 子句调整成如下所示:

    SELECT     ProductID, ProductName, SupplierID, CategoryID,
    QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
    (SELECT CategoryName FROM Categories
    WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
    (SELECT CompanyName FROM Suppliers
    WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
    FROM         Products

    o_0129.png

    图 29:更新 GetProducts() 方法的 SELECT 声明

    在把 GetProducts() 方法更新成使用这个新查询之后,这个 DataTable 中就会包括两个新列:CategoryName 和 SupplierName。

    o_0130.png

    图 30:Products DataTable 中有两个新列

    最好还是花一点时间来更新 GetProductsByCategoryID(categoryID) 方法中的 SELECT 子句。

    如果你使用 JOIN 语法来更新 GetProducts() 中的 SELECT 声明,那么 DataSet Designer 就不能自动生成使用数据库直接模式来插入、更新,并且删除数据库数据的方法。作为替代,你可以使用本指南中较早部分的 InsertProduct 方法中相同的方式来手动创建它们。此外,你还将手动提供 InsertCommand、UpdateCommand,和 DeleteCommand 属性值,如果你需要使用批量更新模式的话。

    添加其余的 TableAdapters

    直到现在,我们只看到了单个数据表的单个 TableAdapter 操作。但是,Northwind 数据库中包含有几个我们需要在 Web 应用程序中进行操作的相关数据表。类型化的 DataSet 也能够包含多个相关的 DataTable。因此,要完成我们的 DAL,我们就需要为指南中使用的其他数据表而添加 DataTable。要添加新的 TableAdapter 到类型化的 DataSet 中,就需要打开 DataSet Designer,在 Designer 中右击,并且选择 Add / TableAdapter。这将创建一个新的 DataTable 和 TableAdapter 并且帮助你通过我们在本指南较早部分所介绍的向导。

    花几分钟的时间来创建下列 TableAdapter 和使用下列查询的方法。注意:ProductsTableAdapter 中的查询包括了提取每个产品目录和提供者名称的子查询。另外,如果你已经完成了下列任务,那么你就已经添加了 ProductsTableAdapter 类的 GetProducts() 方法和 GetProductsByCategoryID(categoryID) 方法。

    • ProductsTableAdapter
      • GetProducts:

        SELECT ProductID, ProductName, SupplierID, CategoryID, 
        QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
        ReorderLevel, Discontinued , (SELECT CategoryName FROM 
        Categories WHERE Categories.CategoryID = 
        Products.CategoryID) as CategoryName, (SELECT CompanyName 
        FROM Suppliers WHERE Suppliers.SupplierID = 
        Products.SupplierID) as SupplierName
        FROM Products
      • GetProductsByCategoryID:

        SELECT ProductID, ProductName, SupplierID, CategoryID, 
        QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
        ReorderLevel, Discontinued , (SELECT CategoryName FROM 
        Categories WHERE Categories.CategoryID = 
        Products.CategoryID) as CategoryName, 
        (SELECT CompanyName FROM Suppliers WHERE 
        Suppliers.SupplierID = Products.SupplierID) as SupplierName
        FROM Products
        WHERE CategoryID = @CategoryID
      • GetProductsBySupplierID

        SELECT ProductID, ProductName, SupplierID, CategoryID, 
        QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
        ReorderLevel, Discontinued , 
        (SELECT CategoryName FROM Categories WHERE 
        Categories.CategoryID = Products.CategoryID) 
        as CategoryName, (SELECT CompanyName FROM Suppliers 
        WHERE Suppliers.SupplierID = Products.SupplierID) 
        as SupplierName
        FROM Products
        WHERE SupplierID = @SupplierID
      • GetProductByProductID

        SELECT ProductID, ProductName, SupplierID, CategoryID, 
        QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
        ReorderLevel, Discontinued , (SELECT CategoryName 
        FROM Categories WHERE Categories.CategoryID = 
        Products.CategoryID) as CategoryName, 
        (SELECT CompanyName FROM Suppliers 
        WHERE Suppliers.SupplierID = Products.SupplierID) 
        as SupplierName
        FROM Products
        WHERE ProductID = @ProductID
    • CategoriesTableAdapter
      • GetCategories

        SELECT CategoryID, CategoryName, Description
        FROM Categories
      • GetCategoryByCategoryID

        SELECT CategoryID, CategoryName, Description
        FROM Categories
        WHERE CategoryID = @CategoryID
    • SuppliersTableAdapter
      • GetSuppliers

        SELECT SupplierID, CompanyName, Address, City, 
        Country, Phone
        FROM Suppliers
      • GetSuppliersByCountry

        SELECT SupplierID, CompanyName, Address, 
        City, Country, Phone
        FROM Suppliers
        WHERE Country = @Country
      • GetSupplierBySupplierID

        SELECT SupplierID, CompanyName, Address, 
        City, Country, Phone
        FROM Suppliers
        WHERE SupplierID = @SupplierID
    • EmployeesTableAdapter
      • GetEmployees

        SELECT EmployeeID, LastName, FirstName, 
        Title, HireDate, ReportsTo, Country
        FROM Employees
      • GetEmployeesByManager

        SELECT EmployeeID, LastName, FirstName, 
        Title, HireDate, ReportsTo, Country
        FROM Employees
        WHERE ReportsTo = @ManagerID
      • GetEmployeeByEmployeeID

        SELECT EmployeeID, LastName, FirstName, 
        Title, HireDate, ReportsTo, Country
        FROM Employees
        WHERE EmployeeID = @EmployeeID

    o_0131.png

    图 31:添加了四个 TableAdapter 之后的 DataSet Designer

    在 DAL 中添加自定义代码

    被添加到类型化的 DataSet 中的 TableAdapter 和 DataTable 都被表达成了一个 XML 结构定义文件(Northwind.xsd)。另外,你还可以在 Solution Explorer 中右击 Northwind.xsd 文件并且选择 View Code 来查看这些结构的信息。

    o_0132.png

    图 32:Northwinds 数据库中类型化的 DataSet 的 XML 结构定义(XSD)文件

    在已编译或者运行时(如果是必需的话),这个结构信息会被转译成设计时的 C# 或者 Visual Basic 代码,到时候你就能够逐步地通过调试器来完成这些任务。要查看自动生成的代码,你可以转到 Class View 并且追溯 TableAdapter 类或者类型化的 DataSet 类。如果你没有在屏幕上看到 Class View,那么可以转到 View 菜单并且从那里进行选择,或者单击 Ctrl + Shift + C。然后,从 Class View 中你就能够看到类型化的 DataSet 类和 TableAdapter 类的属性、方法,以及事件。要查看特定方法的代码,可以双击 Class View 中的方法名称或者右击方法然后选择 Go To Definition。

    o_0133.png

    图 33:检查通过从 Class View 中选择 Go To Definition 而自动生成的代码

    虽然自动生成的代码可能是伟大的时间救星,但是被生成的代码通常都是非常通用的并且需要经过自定义才能够适应应用程序的需要。并且扩展自动生成的代码也是有风险的,因为生成代码的工具可能会自行决定 “生成” 的时机并且覆盖掉你的自定义。在 .NET 2.0 的类的部分新概念中将更加容易地把类分割进多个文件中。这允许我们把自定义的方法、属性,和事件添加到自动生成的类中,从而不需要担心 Visual Studio 会覆盖掉我们的自定义。

    要示范如何自定义 DAL,就先让我们把 GetProducts() 方法添加到 SuppliersRow 类中。SuppliersRow 类呈现了 Suppliers 数据表中的一个单独记录;每个提供者都能够提供零到多个产品,所以 GetProducts() 将会返回指定提供者的产品。要完成这个任务,就需要在 App_Code 目录中创建一个名为 SuppliersRow.cs 的新类文件然后添加下列代码:

    using System;
    using System.Data;
    using NorthwindTableAdapters;
    
    public partial class Northwind
    {
        public partial class SuppliersRow
        {
            public Northwind.ProductsDataTable GetProducts()
            {
                ProductsTableAdapter productsAdapter =
                 new ProductsTableAdapter();
                return
                  productsAdapter.GetProductsBySupplierID(this.SupplierID);
            }
        }
    }

    这个特定的类会通知编译器:需要建立 Northwind.SuppliersRow 类来包括我们刚才所定义的 GetProducts() 方法。如果你建立了你的工程然后返回到 Class View 中,那么你将看到 GetProducts() 现在已经列表成了 Northwind.SuppliersRow 的一个方法。

    o_0134.png

    图 34:GetProducts() 方法现在已经是 Northwind.SuppliersRow 类的一部分了

    GetProducts() 方法现在能够被用来枚举特定提供者的产品集合,如下代码所示:

    NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter = new NorthwindTableAdapters.SuppliersTableAdapter();
    
    // 获取所有提供者
    Northwind.SuppliersDataTable suppliers =
      suppliersAdapter.GetSuppliers();
    
    // 枚举提供者
    foreach (Northwind.SuppliersRow supplier in suppliers)
    {
        Response.Write("Supplier: " + supplier.CompanyName);
        Response.Write("<ul>");
    
        // 列出这个提供者的产品
        Northwind.ProductsDataTable products = supplier.GetProducts();
        foreach (Northwind.ProductsRow product in products)
            Response.Write("<li>" + product.ProductName + "</li>");
    
        Response.Write("</ul><p>&nbsp;</p>");
    }

    这个数据同样能够显示在任何 ASP.NET 数据 Web 控件中。下列页面使用了一个拥有两个字段的 GridView 控件:

    • 一个显示每个提供者名称的 BoundField。
    • 一个包含绑定到由每个提供者的 GetProducts() 方法所返回结果的 BulletedList 控件的 TemplateField。

    在将来的指南中我们将检查如何显示相关的详细报告。但是现在,这个范例被设计成用来说明使用被添加到 Northwind.SuppliersRow 类中的自定义方法。

    SuppliersAndProducts.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SuppliersAndProducts.aspx.cs" Inherits="SuppliersAndProducts" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
        <link href="Styles.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>
                Suppliers and Their Products</h1>
            <p>
                <asp:GridView ID="GridView1" runat="server"
                 AutoGenerateColumns="False"
                 CssClass="DataWebControlStyle">
                    <HeaderStyle CssClass="HeaderStyle" />
                    <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                    <Columns>
                        <asp:BoundField DataField="CompanyName"
                          HeaderText="Supplier" />
                        <asp:TemplateField HeaderText="Products">
                            <ItemTemplate>
                                <asp:BulletedList ID="BulletedList1"
                                 runat="server" DataSource="<%#
                  ((Northwind.SuppliersRow)((System.Data.DataRowView)
                  Container.DataItem).Row).GetProducts() %>"
                                        DataTextField="ProductName">
                                </asp:BulletedList>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
                &nbsp;</p>
    
        </div>
        </form>
    </body>
    </html>
    SuppliersAndProducts.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using NorthwindTableAdapters;
    
    public partial class SuppliersAndProducts : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            SuppliersTableAdapter suppliersAdapter = new
              SuppliersTableAdapter();
            GridView1.DataSource = suppliersAdapter.GetSuppliers();
            GridView1.DataBind();
        }
    }

    o_0135.png

    图 35:提供者的公司名称被列在左边的列中,而他们的产品则列在右边

    概述

    在建立 Web 应用程序的时候创建 DAL 应该是第一个步骤,并且发生在你开始创建表示层之前。在 Visual Studio 中,创建基于类型化的 DataSet 的 DAL 的任务能够在 10 到 15 分钟之内就被完成。本指南的所有进度都依赖于这个 DAL。另外,在下一个指南中我们将定义更多的业务规则并且了解如何在一个单独的业务逻辑层中实现它们。

    编程快乐!

    进一步的阅读

    更多关于本指南中已讨论主题的信息,请参考下列资源:

    转载于:https://www.cnblogs.com/Laeb/archive/2007/02/25/654893.html

    展开全文
  • 本文所讨论内容: 关于Windows窗体控件的新内容 运用‘主题’ 绑定和显示数据 其他数据细节特征 本文使用以下技术:C# 与 Windows 窗体 微软的 .net 框架 1.0 版确实很好地满足了我们的要求。.

    本文内容基于微软 Visual Studio 2005 发布前的预览版,之前代号为“Whidbey”。其中所有信息在正式版中都可能会有所改变。

    本文所讨论内容:

  • 关于Windows窗体控件的新内容
  • 运用‘主题’
  • 绑定和显示数据
  • 其他数据细节特征
  • 本文使用以下技术: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浏览历史纪录和开始|运行命令等许多系统资源。复合列表框与列表框控件新增了对最进使用过的列表项进行格式化的支持。
    Figure 1 新的 Windows 窗体特性

    Windows 主题支持

      当像以往一样创建一个新的Windows窗体工程后,你会发现一个新的变化:默认的Windows主题支持。一个Windows主题就是一组个性化的用户设定,它展示了Windows用户界面的外观。你可以通过在桌面上单击鼠标右键并在弹出的“显示属性对话框”中选择“属性”|“主题”属性页来指定桌面主题。
      因为Windows主题是由用户指定的,所以Windows窗体承担了表现它的责任。虽然现有版本的.NET框架支持Windows主题,但是1.0版本需要开发者在文件系统的指定位置添加一个拥有特殊名字的文件来实现。而1.1版通过提供Application.EnableVisualStyles方法并将每个控件的FlatStyle属性值设为"System"来支持Windows主题,从而简化了1.0版的实现过程。 Visual Studio 2005 将会进一步改进此过程,在建立新的Windows窗体工程时默认调用EnableVisualStyles 方法使窗体默认支持Windows主题:

    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",窗体在运行时会依据主题的改变动态地作出反应,却不需要编写一行代码,这种关于主题的灵敏性对开发者是有利的。

    控制布局与配置

      支持 Windows 主题只需要创建一个工程或窗体,并放入需要的控件。然而,对窗体上的控件进行布局,并对其进行配置是件耗时的工作,尤其是那些复杂的窗体。为了简便,Windows窗体设计器加入了一些新特性,目的就是减少这些琐碎事情所消耗的设计时间。这些特性包括吸附对齐、编辑属性模式以及智能标记,这些特性使操作控件更加容易。你仍旧可以使用Visual Studio的布局工具条来水平或垂直对齐控件,你只需对窗体上的那些控件操纵一次。除此之外,你可以使用吸附对齐来达到与拖拽控件一样的效果,同时避免了在使用布局工具条时选择控件和工具条按钮所带来的设计时间的浪费。吸附式对齐表现为一条或多条有粘性的蓝色线条,控件在这些线条的导引下与邻近的控件对齐。


    Figure 2 编辑属性

      另一个新特性, 编辑属性模式, 允许你用Tab键遍历控件并在页面上直接改变它们的属性。首先在Windows窗体设计器的上下文菜单中点击选择与其同名的菜单项使编辑属性模式被激活。下一步就是遍历控件并按照你的要求修改属性。过程如Figure 2所示。编辑完成后,点击“返回布局模式”回到正常的编辑模式。设置属性是一个改变控件的简便方法。用另外一个更合适的控件来完全替换当前控件可不容易,你需要删除这个控件,然后将一个新控件拖入窗体并重新配置它。应付像这样复杂的多步设计任务,智能标记正好派上用场,它将设计时的多步任务合并为一步,并在相关控件附近显示菜单项图标作为其标记,智能标记也可以处理简单的设计时任务,这经常会发生,例如在将一个文本框拖放入一个窗体时改变它的"Text"属性。

    控件与数据绑定

      集成开发环境的另一项改进是Visual Studio 2005中的Windows窗体提供了新的控件,并改进了广受欢迎的旧控件例如文本框和复合列表框。Figure 3显示了一个用新增控件和使用中的改进控件创建的小型浏览器,创建他们所需要的代码比在Windows窗体的上个版本中要少。


    Figure 3 使用新控件的Web浏览器

      这个简单的例子展示了怎样用Visual Studio 2005中增强的工具箱创建丰富的程序,同时减少了代码的编写。例如,设计这个功能齐全的小型浏览器仅仅花了大约10分钟,并且只编写了85行代码来实现传统的全部网页浏览事件,它还实现了URL访问历史记录功能。网页导航和HTML呈现的实际工作是由右侧块形容器中的WebBrowser控件完成的。分割条和左右块形容器都是由一个SplitContainer控件提供的。
      Figure 3 中显示的复合列表框展示了新型的自动完成支持功能。自动完成功能通过3个属性来实现,首先是AutoCompleteMode,它可以让你选择样式枚举值来设置自动完成样式:
    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相比具有显示更多种类数据的能力,新增了一组更加丰富类型,包括图像。诸如冻结列(与Excel中的相似)这样的精彩特性和运行时列的重新排序(与Outlook中的相似)。
    • 构成它的子控件在导航、编辑、验证、自绘和错误处理等方面拥有有超过100个事件

      结合过去广泛的设计经验,这些新特性使我们可以快速自定义控件而不用写很多代码,其实是将对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的类型名设置它们的数据源属性,类型名默认为"工程命名空间 。类型数据集名"的形式,而随后指定数据成员的步骤保持不变。

    DataContainer控件

      GidView 控件是复杂绑定控件的一个例子,它意味着控件知道怎样管理数据绑定以支持查询、插入、更新和删除操作。相反,简单数据绑定控件不知道这些,需要你通过数据源绑定管理器来实现与复杂绑定控件相同的功能,特别是带有那种VCR样式控件的用户界面。当你偏爱列表样式的数据而不是表格式的数据时,你可以使用简单数据绑定控件。这种方法需要你手动将一系列适当的控件分区域地添加到窗体中,例如标签和文本框,结果就像Figure 6显示的那样。


    Figure 6 基本用户界面

      当你可以手动实现如此细致的窗体时,在Visual Studio 2005 中你也可以通过DataContainer绑定一个类型化数据集一次性实现这个窗体。仅需要简单地从DataContainer的智能标签中选择名称为这个窗体的菜单项。
      这一特性会依据选择的数据源为你自动生成所有的控件区域。而且,DataContainer将会加载并保存这些数据,还会默认地添加VCR样式的导航与编辑控件而不用编写代码。结果如Figure 7所示。


    Figure 7 带有VCR控件的分区域样式的用户界面

      如果你的界面需求改变了而且你发现表格样式的用户界面更合适,你可以用DataContainer来完成如此艰巨的任务,你只需要从DataContainer 中选择适当的智能标记选项。设计器便删除所有现存的控件,代之以一个DataGrid(在未来版本的Visual Studio中也许会是一个GridView)。

    Master-detail绑定

      多功能的DataContainer也是构建master-detail用户界面的强大工具,这种界面提供了一种基于窗体的可视化效果,来展示关系数据库中经常用到的一对多关系。例如显示雇员--订单关系,我们只需要简单地将订单表添加到类型化数据集中就可以正确配置。


    Figure 8 Master-detail窗体

      既然我们已经生成了master用户界面(如Figure 7所示),我们接下来所要做的就是将一个GridView拖拽到窗体上,并将其数据源属性设为DataContainer,数据成员属性设为订单--订单明细关系(这里为订单--雇员外键约束),结果如 Figure 8。

    ClickOnce 部署

      当你在窗体中设置好了所有的控件,并编写了使它们共同工作的代码,你将要部署此应用程序。为大量的用户们部署一个企业级的Windows窗体应用程序将会面临一个关于安装与版本变更的严峻挑战,所以上一辈的开发者更愿意舍弃丰富的Windows用户界面而转向Web应用程序并享受其所带来的部署的便利性。
      在.NET中,微软开始创建一个底层结构,它使得发布Windows窗体应用程序与发布ASP.NET应用程序一样轻松。在Visual Studio 2005之前, .NET框架支持no-touch部署, 其允许Windows窗体应用程序从一个URL或一个统一名称转换(UNC)文件路径进行部署,并在客户机中的一个沙箱中运行,这个沙箱具有代码访问安全(CAS)性。在Visual Studio 2005中No-touch部署进化到了ClickOnce部署,并出现了一些新的特性给Windows窗体程序开发者提供了一个像部署Web应用程序一样平滑的底层结构。 特别地,ClickOnce部署还提供了对一些经过改进的功能的支持,如程序发送、版本更新与回滚、对客户端应用程序安装的更多控制、更新许可和包含在Visual Studio所有结构中的设计时配置支持。

    配置流水线型部署

      在设计时,通过在Visual Studio2005的工程配置属性中设置发布属性页的各项属性,可以对ClickOnce部署进行配置。依据你的底层结构和用户群,不同的部署资源(文件服务器、Web服务器或者FTP服务器)有其特定的意义。ClickOnce部署允许你指定哪些将要被发布和安装以及安装方式(例如,通过网页进行安装)。可以通过配置来决定应用程序是否被安装到客户机器的物理驱动器上。如果客户端安装完成,你可以规定在程序装载或运行之前是否进行更新检查,或多长时间进行更新检查,或是强迫要求更新--对进行关键性的更新操作来说是个有用的功能。它也可以指定安装程序前的必备条件,.NET框架程序本身就是这样。而且在安全属性页中可以设定一些安全设置。
      当将要发布时,你可以通过点击“工程”|“发布工程”菜单一步生成并发布你的应用程序,它既生成了应用程序也发布了应用程序。发布应用程序的过程由发布向导程序进行管理,它主要查看你的发布配置设定,并允许你在发布前更改这些配置。在发布过程中最后弹出的一个窗体列出了所有需要确定的选项,并且提供了一个选项用来确定是发布程序还是返回修改设定。之后发布向导根据你的选择按照要求发布应用程序。

    部署程序

      部署程序开始于用户打开部署Web页面并点击发布此程序所需的超链接。应用程序被链接到一个.Deploy文件而不是一个可以自运行的程序。.deploy文件是ClickOnce部署程序所必须的两个文件之一,它指定了程序部署与更新需求。第二个文件是.manifest文件, 它指定了程序运行所需要的文件。这相当于程序的装配清单。.deploy与.manifest文件都在客户端被ClickOnce部署服务处理,System.DeploymentFramework.Service.exe. 这个服务随.NET框架一同被安装,并且第一此启动时需要一个.deploy文件。它会以对话框的形式要求确认下载,而用户不会看到任何的后台操作。下载完成后,真正的应用程序会被加载到AppHost.exe程序,并由其运行。应用程序会存储在本地的缓存中,直到你指定没有客户端安装操作。以后应用程序启动总需要这个.deploy文件,并且在本地缓存中被执行直到.debug文件指定在服务器端有新的版本。
      如果应用程序运行在要求更高可配置安全性的领域(例如互联网或者局域网),ClickOnce部署程序可以为用户提供达到相应级别的程序访问许可证,以确保程序的正确执行。如果没有许可程序永远不会启动,根本就不会给其运行的机会。

    ClickOnce 部署的版本控制与回滚

      如果部署了一个程序,一个图标便会添加在“开始”菜单上并且在控制面板|添加删除程序中新增了一项。从添加删除程序中,你可以完全卸载应用程序或者返回到前一个版本,如果存在前一个版本的话。流水线部署程序的版本控制功能主要依赖于你使用AssemblyVersion属性所指定的版本号,AssemblyVersion属性在AssemblyInfo.cs文件中被生成,AssemblyInfo.cs文件是每一个Windows窗体工程默认生成的。就像这样:
          [assembly: AssemblyVersion("1.0.*")]
      版本号被用来决定是否有一个新的版本可以用于下载。它也用来命名部署文件夹和程序所在的客户端临时文件夹。两个文件夹的名称转换形式为程序名_主号_辅号_生成号_修订号。
      ClickOnce 部署是一项十分强大的技术,它为我们带来了很多好处,在本文中无法一一描述。然而,使用ClickOnce部署的主要动机是为了部署、安装和控制版本的方便。想要了解关于它的更多信息,请参考本期MSDN杂志中由Brian Noyes撰写的名为 "ClickOnce: Deploy and Update Your Smart Client Projects Using a Central Server" 的文章。

    总结

      当你考虑 Visual Studio 2005 中大量的新特性时,你会意识到,我们仅仅刚刚开始讨论这些你会在Windows窗体开发中用到的各种技术。这些包括改进的ADO.NET和新的通过对象--关系映射访问关系数据库的方法,它利用了展新的ObjectSpaces技术。这里所写的内容只向你介绍了一些最重要的新特性,并解释了Visual Studio的易用性所带来的生产效率的提高,从集成开发环境和设计器的改进到以前版本中控件的改进(如文本框和复合列表框)和一些全新的控件(例如GridView和WinBar)。GridView 和 DataContainer控件与增强的类型化数据集一起 ,帮助你创造丰富的数据表现形式和将数据更快地加入到应用程序。最后,ClickOnce部署简化了Windows窗体程序部署的全过程,同时提供了与传统安装程序的兼容性。

    作者简介

      Michael Weinhardt 现在正与 Chris Sells 一起更新他的新书《C# Windows 窗体程序设计》,并为 MSDN 在线杂志撰写专栏文章“Windows 窗体探密”。访问 http://www.mikedub.net 获取更多信息。
      Chris Sells 是一位 MSDN 在线杂志的内容策划,目前主要研究代号为“长角”的下一版 Windows 操作系统 (http://msdn.microsoft.com/longhorn )。关于 Chris 和他各项研究成果的更多信息参见 http://www.sellsbrothers.com
     
    本文出自 MSDN MagazineMay 2004 期刊,可通过当地报摊获得,或其最好是 订阅

    本文由 VCKBASE MTT团队 翻译
    展开全文
  • C#窗体应用基础

    2012-12-09 16:23:00
    Windows窗体分布类 partial类 public partial class Form1 : Form 这里面包含了两个新内容:partial和Form。 Partial是“部分的”意思,这是.NET Framework2.0引人的一个新特性——分布类。在C#当中,为了...
  • .Net2.0正式版的正式发布,对我们程序开发人员来说无疑是一件很大的喜事,已经很多的人开始了解并使用.NET2.0。...本文将带领大家使用VisualStudio2005来创建一个N层数据库应用的示例,并介绍一些NET2.0和Visual...
  • 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端...浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端。在这篇文章中,我们将会知道怎样创建Windows 窗体控件并且在IE中使用。在
  • 本书Visual Studio 2005基本工具,工作任务主线,深入浅出地介绍了C#程序设计的基础知识和编程方法,几乎涵盖了C#基础编程中的所有内容。 本书内容全面、翔实,适合高职高专院校计算机类相关专业的学生使用...
  • 引言在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来...通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端。在这篇文章中,我们将会知道怎样创建Windows窗体控件并且在IE中使用。在浏览
  • 一.引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能。不过现在开发者可以很容易的通过Microsoft.NET ...在这篇文章中,我们将会知道怎样创建Windows窗体控件并且在IE中使
  • (1)背景图片:选中窗体在属性栏的图片中选择保存号的背景图片,图片缩放模式选择拉伸。 (2)装饰图片:在设计栏下选择插入图像,选择保存好的校徽图像,调整相应大小及位置。 (3)分割线:选择直线控件,调整...
  • 1、制作后台管理主界面窗体(每完成一个窗体,记得进行功能测试) 制作效果: 第一步:打开上次未完成的KTV_MS项目,打开方法:菜单栏【文件】——【打开】——【项目/解决方案】,在自己的电脑上找到上次的项目...
  • 用HTML做窗体程序界面

    万次阅读 2018-05-20 15:59:33
    --------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------       古老的使用方式...
  • Form1.cs:窗体文件:程序对窗体编写的代码一般都存放在这个文件(还有拖动控件时的操作和布局,还有设置一般的属性) F4:跳到设置属性的界面 F7:跳到逻辑代码文件 From.Designer.cs:窗体设计文件:一般拖动控件...
  • Powerbuilder9.0实用教程代码

    热门讨论 2004-01-16 00:00:00
    对于书中源代码除了数据库外其他都能正常使用,而示例中数据库需要用户在自己的计算机上注册后才能使用,如果不注册数据源就运行应用程序是检索不到任何数据的,下面连接学生选课系统数据库例具体介绍如何连接...
  • 1、为窗体指定数据来源(数据表/查询等); 2、拖入编辑控件,指定绑定字段; 3、结束。 为此,我设计了几个基类窗体,给它们分成几个场景(如无数据/单表数据/主从/多关联等),在不同的业务模型下,我选取...
  • 一.引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能。不过现在开发者可以很容易的通过Microsoft.NET ...在这篇文章中,我们将会知道怎样创建Windows窗体控件并且在IE中使
  • .NET 2.0里强类型数据创建多层应用 .Net 2.0正式版的正式发布,对我们程序开发人员来说无疑是一件很大的喜事,已经很多的人开始了解并使用.NET 2.0。Visual Studio 2005 的一些新的
  •  OLEDB数据提供程序所对应的数据源驱动程序 驱动程序 提供程序 SQLOLEDB 用于SQL Server的Microsoft OLE DB提供程序 MSDAORA 用于Oracle的Microsoft OLE DB提供程序 ...
  • mesa3d代码阅读笔记

    千次阅读 2014-08-10 16:32:58
    最近准备去阅读Mesa3d(采用7.6.1版本)的代码,代码量很大,感觉到十分困难。以后是否能够读下去,并且理解它的整个实现过程,不能确定。但既然阅读了,就应该积累起来,特写下本系列笔记。 1 编译Mesa3d 7.6.1...
  • 在Visual Studio 2005中, 类型化数据集可以被直接绑定到那些实现了数据源和数据成员属性的控件中,而不必添加数据集对象到窗体中。 DefaultInstance  任何曾经大量使用类型化数据集的人都知道,一般来说每一个新的...
  • .NET 2.0正式版的正式发布,对我们程序开发人员来说无疑是一件很大的喜事,已经很多的人开始了解并使用...本文将带领大家使用Visual Studio 2005来创建一个N层数据库应用的示例,并介绍一些NET 2.0和 Visual Stud...
  • WM_COPYDATA:--------->当一个应用程序传递数据给另一个应用程序时发送本消息 WM_CANCELJOURNAL:--------->当用户取消程序日志激活状态时,发送本消息给那个应用程序。该消息使用空窗口句柄发送 WM_NOTIFY:--------->...
  • Chris Sells 和 Sam Gentile适用于:Microsoft®Visual C++® .NETWindows Forms摘要:本文讨论了如何使用 Visual C++ .NET 的托管扩展针对 Windows 窗体编程,并提供了使用直接访问 ...此外,本文还对 Windows 窗体

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,005
精华内容 1,602
关键字:

以表为数据源创建分割窗体