100165608.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 343 行 · 第 1/4 页
HTM
343 行
<p class="MsoNormal"><span lang="EN-US">ProductDataTable</span><span style="FONT-FAMILY: 宋体">类包含更多的代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">[System.Diagnostics.DebuggerStepThrough()]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public class ProductDataTable : DataTable, System.Collections.IEnumerable </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnProductID;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnProductName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnSupplierID;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnCategoryID;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnQuantityPerUnit;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnUnitPrice;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnUnitsInStock;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnUnitsOnOrder;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnReorderLevel;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private DataColumn columnDiscontinued;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> internal ProductDataTable() : base("Product")</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.InitClass();</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span lang="EN-US">ProductDataTable</span><span style="FONT-FAMILY: 宋体">类派生于</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">,它实现</span><span lang="EN-US">IEnumerable</span><span style="FONT-FAMILY: 宋体">接口,为表中的每一列定义了一个私有的</span><span lang="EN-US">DataColumn</span><span style="FONT-FAMILY: 宋体">实例,通过调用私有的</span><span lang="EN-US">InitClass</span><span style="FONT-FAMILY: 宋体">成员,在构造函数中初始化这些实例。每一列都有一个内部的访问器,</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">类将使用这个访问器</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">后面介绍</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">[System.ComponentModel.Browsable(false)]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public int Count</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> get { return this.Rows.Count; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">internal DataColumn ProductIDColumn</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> get { return this.columnProductID; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">// Other row accessors removed for clarity – there is one for each of the columns</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">给表添加数据行是由</span><span lang="EN-US">AddProductRow()</span><span style="FONT-FAMILY: 宋体">的两个重载方法实现的</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">但它们的内容完全不同,但名称相同</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。第一个重载方法的参数是一个已经构造出来的</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">,且没有返回值。另一个重载方法则带一组参数值,每个参数对应于</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">中的一列,该重载方法构造一个新行,设置这个新行中的值,把该行添加到</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">,并给调用者返回该行。这些不同的函数不应有相同的名称。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">public void AddProductRow(ProductRow row)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.Rows.Add(row);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public ProductRow AddProductRow ( string ProductName , int SupplierID ,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> int CategoryID , string QuantityPerUnit ,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> System.Decimal UnitPrice , short UnitsInStock ,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> short UnitsOnOrder , short ReorderLevel ,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> bool Discontinued )</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ProductRow rowProductRow = ((ProductRow)(this.NewRow()));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> rowProductRow.ItemArray = new object[] </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> null,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ProductName,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> SupplierID,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> CategoryID,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> QuantityPerUnit,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> UnitPrice,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> UnitsInStock,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> UnitsOnOrder,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ReorderLevel,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Discontinued</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> };</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.Rows.Add(rowProductRow);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return rowProductRow;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">派生类中的</span><span lang="EN-US">InitClass</span><span style="FONT-FAMILY: 宋体">成员把表添加到</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,与此相同,</span><span lang="EN-US">ProductDataTable</span><span style="FONT-FAMILY: 宋体">上的</span><span lang="EN-US">InitClass</span><span style="FONT-FAMILY: 宋体">成员把列添加到</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">中,每一列的属性都按需要设置,再把该列添加到列集合的尾部。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void InitClass()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnProductID = new DataColumn ( "ProductID", </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> typeof(int), </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> null,</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> System.Data.MappingType.Element);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.Columns.Add(this.columnProductID);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> // Other columns removed for clarity</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnProductID.AutoIncrement = true;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnProductID.AllowDBNull = false;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnProductID.ReadOnly = true;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnProductName.AllowDBNull = false;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> this.columnDiscontinued.AllowDBNull = false;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public ProductRow NewProductRow()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return ((ProductRow)(this.NewRow()));</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">NewRowFromBuilder</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US"> NewRow()</span><span style="FONT-FAMILY: 宋体">方法内部调用,创建了一个强类型化的新行。</span><span lang="EN-US">DataRowBuilder</span><span style="FONT-FAMILY: 宋体">实例由</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">创建,其成员仅能在</span><span lang="EN-US">System.Data</span><span style="FONT-FAMILY: 宋体">程序集中访问。</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">protected override DataRow NewRowFromBuilder(DataRowBuilder builder)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return new ProductRow(builder);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">最后一个要讨论的类是</span><span lang="EN-US">ProductRow</span><span style="FONT-FAMILY: 宋体">,它派生于</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">。这个类用于提供对数据表中所有<span style="LETTER-SPACING: 0.2pt">字段的类型安全的访问。它封装了特定行的存储器,并提供成员来读取</span></span><span lang="EN-US" style="LETTER-SPACING: 0.2pt">(</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.2pt">和写入</span><span lang="EN-US" style="LETTER-SPACING: 0.2pt">)</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.2pt">表中的每个字段。</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?