科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道ADO.NET中的视图和过滤器

ADO.NET中的视图和过滤器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ADO.NET中有一层对象,用来创建任意数据源的抽象模型。其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等。

作者:巧巧读书 来源:巧巧读书 2008年7月25日

关键字: ADO.NET 电子邮件 Foxmail

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  预排视图

  在上面的举例中,datagrid必须负责预排视图中的数据行,以便刷新用户界面。这个自动机制是.NET

  数据绑定的产物。Datagrid是通过DataSource属性来获取数据的数据绑定控件。DataView是一个可数据绑定的类,可构建DataSource属性的内容。

  如果你想使用datagrid之外的另一个控件,应该怎么办呢?又如果你不想使用自动数据绑定呢?应该怎样预排视图中所选的数据行呢?

  DataView的Table属性指向相应的数据表,但DataTable并不保存过滤信息。所以,预排表中的数据注定是不可行的。虽然DataTableDataView是紧密相联的,但它们各自保持独立,并执行独立的功能。

  以下Visual Basic.NET代码段显示了如何遍历视图中所有的数据行,并加入到listbox中。

  Dim dv As New DataView()

  dv = ds.Tables("Employees").DefaultView

  dv.RowFilter = "employeeid >5"

  ListBox1.Items.Clear()

  Dim buf As String

  Dim dr As DataRowView

  For Each dr In dv

  buf = ""

  buf &= dr("lastname").ToString()& ", " &dr("firstName").ToString()

  ListBox1.Items.Add(buf)

  Next

  正如前面说提到的,DataView是可枚举的类,因此你可以安全的将它传给For..Each语句。Count属性存储了视图中数据行数,以便在For..Next循环中使用。

  要访问视图中某一行,可以使用DataRowView类。DataRowView可表示DataRow的视图,就像DataView表达DataTable定制的视图一样。

  总的来说,DataRow最多有四种状态:default,original,current和proposed。这些状态由DataRowVersion枚举类型设置,由RowVersion属性表达。

  DataRow的视图只能是其中某一种状态。

  数据行的默认(default)版本只有当其列在构造时设定了默认值时才有。而初始(original)版本是指在最后一次调用表的AcceptChanges后,从数剧源中得到数据行或快照。当前(Current)版本是指当前的数据行,包括所有当时发生的更新。Proposed状态只存在于调用BeginEdit和EndEdit的编辑过程中。

  可以通过访问DataRow相同的语法访问DataRowView。这里最重要的属性叫Item。

  排序和其他便捷的特性

  DataView支持Sort属性,可以用来对视图中的内容排序。Sort由用逗号分隔的列名表达式进行排序。通过在任何列名后加ASC或者DESC限定词,可以使得字段按照上升或者下降的顺序排列。如果没有方向限定词,默认顺序为ASC。

  DataView是内存中的对象,所以排序在本地进行,无需调用数据库服务器。

  RowStateFilter是DataView另一有趣的属性。它可以用任何预定义的标准来过滤DataTable中的内容。下表中是DataViewRowState枚举类型的所有取值:

  

CurrentRows 包括所有未更新的、新的和修改的数据行
Deleted 所有自上次调用AcceptChanges后删除的数据行
ModifiedCurrent 所有自上次调用AcceptChanges后修改过的数据行
ModifiedOriginal 所有自上次调用AcceptChanges后original版本的数据行
New 所有自上次调用AcceptChanges后新添加的行
OriginalRows 返回初始数据行,包含unchanged和deleted 的
Unchanged 所有未更新的数据行

  如果要操作非连接的数据,所有更新都在对DataTable调用AcceptChanges后生效。对单一行的更新在调用DataRowAcceptChanges后生效。类似的,这些更新可以通过调用DataTableDataRow对象的RejectChanges来取消。

  DataView对象还有一些属性,如AllowEdit,AllowDeleteAllowNew,用来得到或设定是否允许更新的值。它们的默认值设为True,允许任何种类的更新。如果在标志设为False时,你想要完成相应的更新操作,会有一个运行时错误发生。

  DataViewManager类

  DataTable对象的DefaultView属性用来返回一个DataView对象,作为数据表中内容的默认视图。它按照自然顺序读取数据并显示表中所有的行,而不使用任何过滤。

  theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView

  如果需要数据特定的视图,你可以进行排序并/或对DefaultView对象直接进行过滤。

  m_ds.Tables("Employees").DefaultView.Sort = "lastname"

  theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView

  DataViewManager类是用来存储DataSet中所有表的视图设置。

  可以通过传递一个合法的非空的DataSet给类的构造函数来创建DataViewManager

  Dim dvm As DataViewManager

  dvm = New DataViewManager(m_ds)

  也可以通过DataSet对象的DefaultViewManager属性直接得到:

  Dim dvm As DataViewManager = m_ds.DefaultViewManager

  重要的是DataViewManager类是同一个DataSet相关联的。下面是另一种可行的方法:

  Dim dvm As New DataViewManager()

  dvm.DataSet = m_ds

  DataViewManager最重要的属性是DataViewSettings,一个DataViewSetting对象的集合。

  Dim dvs As DataViewSetting

  dvs = dvm.DataViewSettings("Employees")

  dvs.Sort = "lastname"

  DataViewSetting对象包含了表视图的参数信息。当将数据绑定到对数据敏感的控件时,使用DataViewManager而不是DataSet或DataTable可以保留你的视图设置(过滤和排序字段)

  theMasterGrid.DataSource = dvm

  theMasterGrid.DataMember = "Employees"

  在这里,视图按照DataViewSetting中对Employees表指定的自动进行排序和过滤。换而言之,DataViewSetting类是对特定表的视图的一种缓存。

  下一步

  上述例子程序用filter实现了master/detail结构。如果使用.NET中特有的数据绑定控件(如datagrid),能够更好的达到这个目的。在以后的专栏中,我将论述内存中的数据关系,以及它们是如何影响master/detail结构的设计的。

  对话:你是否需要控件或组件?

  在.NET中有很多术语经常可以替代使用。这里特别指出的是:类,组件,对象和控件。在此,我提供了一张表,来表述每个术语的恰当的含义。我们经常将它们当成同义词。

  需要牢记在心的是整个.NET架构是由类组成的。所以你从中得到的任何东西,首先,是一个类。在.NET环境中,控件和组件不是同一种类。至于对象,可以认为是运行着的.NET类的实例。

  组件是一个特殊的类,它实现了Icomponent接口或派生于实现了Icomponent接口的类。

  控件是提供了用户界面功能的组件。在.NET架构中,可以找到两类控件:客户端的Windows Forms 控件和ASP.NETserver 控件。

  Icomponent接口包含在Idisposable接口中,并提供了一种确定的方法清除资源。

  Public Interface IComponent

  Inherits IDisposable

  这种释放资源的方法和标准的.NET垃圾收集器可以二者选一。通过实现Idisposable,你定义了一个Dispose方法。这样通过编程,你可以显式的释放对象而无须等待垃圾收集器来处理。

  .NET组件知道怎样在应用程序域(application domain)中如何串联。这有两种方法:通过引用或通过值,基本功能分别内建于MarshalByRefComponet和MarshalByValueComponent类中。.NET component类,事实上,实现了Idisposable,但直接或间接继承了上述两个类中的一个。

  应用程序域是一种轻量级进程。通过引用来列集对象意味着proxy/stub实体对会被创建并处理远程调用。而通过值则意味着该对象的序列化的拷贝传递越过域的边界。

  控件是更特殊化的对象,它还提供了用户界面元素。当然,一个控件总是一个component,但反之不一定成立。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章