100165632.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 232 行 · 第 1/3 页
HTM
232 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public TestSchema() { ... }</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"> protected TestSchema(SerializationInfo info, StreamingContext context)</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 override DataSet Clone() { ... }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> protected override bool ShouldSerializeTables() { ... }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> protected override bool ShouldSerializeRelations() { ... }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> protected override void ReadXmlSerializable(XmlReader reader) { ... }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> protected override System.Xml.Schema.XmlSchema GetSchemaSerializable() </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 void InitVars() { ... }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; 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"> private void SchemaChanged(object sender, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> System.ComponentModel.CollectionChangeEventArgs e) </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">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">把这段代码作为本节的开始,您就可以看到在给</span><span lang="EN-US">XSD</span><span style="FONT-FAMILY: 宋体">模式添加元素后,代码所发生的变化。要注意的两个问题是:</span><span lang="EN-US">XSD</span><span style="FONT-FAMILY: 宋体">模式映射为</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,这个</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">是可以串行化的<span style="LETTER-SPACING: -1pt">——</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">注意受保护的构造函数可以由</span><span class="codeintext-PRODUCTION"><span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">ISerializable</span></span><span class="codeintext-PRODUCTION"><span style="FONT-FAMILY: 宋体">实现使用。</span></span><span style="FONT-FAMILY: 宋体">串行化的内容详见<span class="codeintext-PRODUCTION"><span style="FONT-FAMILY: 宋体">第</span></span></span><span class="codeintext-PRODUCTION"><span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">11</span></span><span class="codeintext-PRODUCTION"><span style="FONT-FAMILY: 宋体">章。</span></span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">添加元素</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要添加一个新的顶层元素,右击工作空间,从关联菜单中选择</span><span lang="EN-US">Add | New Element</span><span style="FONT-FAMILY: 宋体">。这将在屏幕上创建一个未命名的新元素。图</span><span lang="EN-US">22-27</span><span style="FONT-FAMILY: 宋体">显示了为这个示例的</span><span lang="EN-US">Product</span><span style="FONT-FAMILY: 宋体">元素设置的属性。</span></p>
<p align="center"><span lang="EN-US"><img height="74" src="22/image027.jpg" width="136" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 22-27</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在保存</span><span lang="EN-US">XSD</span><span style="FONT-FAMILY: 宋体">文件时,可以修改该</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">文件,并且生成许多新类,如下面的代码所示。下一节将讨论在文件</span><span class="codeintext-PRODUCTION"><span lang="EN-US" style="FONT-FAMILY: 'Times New Roman'">TestSchema.cs</span></span><span class="codeintext-PRODUCTION"><span style="FONT-FAMILY: 宋体">中生成的代码的最重要的方面。</span></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 class TestSchema : DataSet</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> private ProductDataTable tableProduct;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> [System.ComponentModel.DesignerSerializationVisibilityAttribute</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> (System.ComponentModel.DesignerSerializationVisibility.Content)]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public ProductDataTable Product</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> get </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> return this.tableProduct;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; 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">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">创建了</span><span lang="EN-US">ProductTable</span><span style="FONT-FAMILY: 宋体">类的一个新成员变量,这个对象由</span><span lang="EN-US">Product</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">DataSet.Products</span><span style="FONT-FAMILY: 宋体">返回</span><span lang="EN-US">Products</span><span style="FONT-FAMILY: 宋体">数据表。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">2. </span><span style="FONT-FAMILY: 黑体">生成的数据表</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">为添加到模式模板中的</span><span lang="EN-US">DataTable (Product)</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 delegate void ProductRowChangeEventHandler</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> (object sender, ProductRowChangeEvent e);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">public class ProductDataTable : DataTable, System.Collections.IEnumerable</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> internal ProductDataTable() : base("Product")</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> this.InitClass();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> [System.ComponentModel.Browsable(false)]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public int Count</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> get { return this.Rows.Count;}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public ProductRow this[int index]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> get { return ((ProductRow)(this.Rows[index]));}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public event ProductRowChangeEventHandler ProductRowChanged;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public event ProductRowChangeEventHandler ProductRowChanging;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> public event ProductRowChangeEventHandler ProductRowDeleted;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> public event ProductRowChangeEventHandler ProductRowDeleting;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">生成的</span><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">4</span><span style="FONT-FAMILY: 宋体">个事件,当引发这些事件时,会使用上面定义的委托,这个委托的参数是</span><span lang="EN-US">ProductRowChangeEvent</span><span style="FONT-FAMILY: 宋体">类的一个实例,该类也是由</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">定义的。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">生成的代码包含一个派生于</span><span lang="EN-US">DataRow</span><span style="FONT-FAMILY: 宋体">的类,它可以对表中的类进行类型安全的访问。创建新行有两种方式:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">调用</span><span lang="EN-US">NewRow (</span><span style="FONT-FAMILY: 宋体">或生成的</span><span lang="EN-US">NewProductRow)</span><span style="FONT-FAMILY: 宋体">方法,返回行类的一个新实例。把这个新行传递给</span><span lang="EN-US"> AddRow()</span><span style="FONT-FAMILY: 宋体">函数</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">或类型安全的</span><span lang="EN-US">AddProductRow)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">调用</span><span lang="EN-US">AddRow (</span><span style="FONT-FAMILY: 宋体">或生成的</span><span lang="EN-US">AddProductRow)</span><span style="FONT-FAMILY: 宋体">方法,其参数是一个对象数组,数组中的元素对应于表中的每一列。</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">AddProductRow</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; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> this.Rows.Add(row);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">public ProductRow AddProductRow ( ... )</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> ProductRow rowProductRow = ((ProductRow)(this.NewRow()));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> rowProductRow.ItemArray = new Object[0];</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> this.Rows.Add(rowProductRow);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; 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 style="FONT-FAMILY: 宋体">从代码中可以看出,第二个方法创建了一个新行,把该行插入到</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Rows</span><span style="FONT-FAMILY: 宋体">集合中,再把该对象返回给调用者。</span><span lang="EN-US">DataTable</span><span style="FONT-FAMILY: 宋体">上的其他方法用于引发事件。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">生成的数据行</span></h4>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?