100165648.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 231 行 · 第 1/4 页

HTM
231
字号
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void button1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">Click(object sender, System.EventArgs e)</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //create a dataset</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; DataSet ds = new DataSet(&quot;XMLProducts&quot;);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //connect to the northwind database and </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //select all of the rows from products table</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //make sure your login matches your version of SqlServer</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; SqlConnection conn = new SqlConnection</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (@&quot;server=GLYNNJ</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">CS\NetSDK;uid=sa;pwd=;database=northwind&quot;);</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; SqlDataAdapter da = new SqlDataAdapter(&quot;SELECT * FROM Products&quot;,conn);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在创建了</span><span lang="EN-US">SqlDataAdapter</span><span style="FONT-FAMILY: 宋体">对象</span><span lang="EN-US">da </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> DataSet</span><span style="FONT-FAMILY: 宋体">对象</span><span lang="EN-US">ds</span><span style="FONT-FAMILY: 宋体">后,再实例化</span><span lang="EN-US">MemoryStream</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">StreamReader </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">StreamWriter</span><span style="FONT-FAMILY: 宋体">对象。</span><span lang="EN-US">StreamReader </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> StreamWriter</span><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">MemoryStream</span><span style="FONT-FAMILY: 宋体">来浏览</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; MemoryStream memStrm=new MemoryStream();</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; StreamReader strmRead=new StreamReader(memStrm);</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; StreamWriter strmWrite=new StreamWriter(memStrm);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">MemoryStream</span><span style="FONT-FAMILY: 宋体">的原因是不必把数据写入磁盘。还可以使用基于</span><span lang="EN-US">Stream</span><span style="FONT-FAMILY: 宋体">类的其他对象,例如</span><span lang="EN-US">FileStream</span><span style="FONT-FAMILY: 宋体">。接着,填充</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">,把它绑定到</span><span lang="EN-US">DataGrid</span><span style="FONT-FAMILY: 宋体">上。</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">中的数据现在应显示在</span><span lang="EN-US">DataGrid</span><span style="FONT-FAMILY: 宋体">中:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; da.Fill(ds,&quot;products&quot;);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //load data into DataGrid</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; dataGrid1.DataSource=ds;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; dataGrid1.DataMember=&quot;products&quot;;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">下一步是生成</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">XML</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">。调用</span><span lang="EN-US">DataSet </span><span style="FONT-FAMILY: 宋体">类的</span><span lang="EN-US">WriteXml()</span><span style="FONT-FAMILY: 宋体">方法,它生成一个</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档。</span><span lang="EN-US">WriteXml</span><span style="FONT-FAMILY: 宋体">有两个重载方法,一个重载方法的参数是带有文件路径和名称的字符串,另一个重载方法的参数是模式。这个模式是一个</span><span lang="EN-US">XmlWriteMode</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'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">IgnoreSchema</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">WriteSchema</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">DiffGram</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果不希望</span><span lang="EN-US">WriteXml</span><span style="FONT-FAMILY: 宋体">方法把内联模式写入</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文件的开头,就使用</span><span lang="EN-US">IgnoreSchema</span><span style="FONT-FAMILY: 宋体">,如果要写入内联模式,就使用</span><span lang="EN-US">WriteSchema</span><span style="FONT-FAMILY: 宋体">。本节的后面介绍</span><span lang="EN-US">DiffGram</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="a6" style="MARGIN-TOP: 3.25pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; ds.WriteXml(strmWrite,XmlWriteMode.IgnoreSchema);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; memStrm.Seek(0,SeekOrigin.Begin);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //read from the memory stream to an XmlDocument object</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; doc.Load(strmRead);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //get all of the products elements</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; XmlNodeList nodeLst=doc.GetElementsByTagName(&quot;ProductName&quot;);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //load them into the list box</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; foreach(XmlNode nd in nodeLst)</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; listBox1.Items.Add(nd.InnerText);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">private void listBox1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">SelectedIndexChanged(object sender,</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.EventArgs e)</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //when you click on the listbox,</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //a message box appears with the unit price</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; string srch=&quot;XMLProducts/products[ProductFTEL=&quot; + </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' &quot; '+ listBox1.SelectedItem.ToString() + ' &quot; ' + &quot;]&quot;;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; XmlNode foundNode=doc.SelectSingleNode(srch);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; if(foundNode!=null)</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(foundNode.SelectSingleNode(&quot;UnitPrice&quot;).InnerText);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; else</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(&quot;Not found&quot;);</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; 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">23-9</span><span style="FONT-FAMILY: 宋体">所示的屏幕图中,可以查看列表框中的数据和绑定的数据网格。</span></p>
<p align="center"><span lang="EN-US"><img height="352" src="23/image009.jpg" width="278" border="0" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span> &nbsp;<span lang="EN-US">23-9</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果只需要该模式,可调用</span><span lang="EN-US">WriteXmlSchema()</span><span style="FONT-FAMILY: 宋体">而不是</span><span lang="EN-US">WriteXml()</span><span style="FONT-FAMILY: 宋体">。这个方法有</span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体">个重载方法,第一个重载方法的参数是一个字符串,其中包含了</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档的路径和文件名,第二个重载方法使用基于</span><span lang="EN-US">XmlWriter</span><span style="FONT-FAMILY: 宋体">类的一个对象。第三个重载方法使用基于</span><span lang="EN-US">TextWriter</span><span style="FONT-FAMILY: 宋体">类的对象。第四个重载方法派生于</span><span lang="EN-US">Stream</span><span style="FONT-FAMILY: 宋体">类。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果要把</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档存入磁盘,就应执行下述操作:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">string file = &quot;c:\\test\\product.xml&quot;;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">ds.WriteXml(file);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在磁盘上会生成一个格式正确的</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档,并可以由另一个流、</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">来读取,或者由另一个应用程序或网站使用。因为没有指定</span><span lang="EN-US">XmlMode</span><span style="FONT-FAMILY: 宋体">参数,所以这个</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">包含了模式。在本例中,把流作为</span><span lang="EN-US">XmlDocument.Load</span><span style="FONT-FAMILY: 宋体">方法的参数。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">准备好</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">后,使用与前面一样的</span><span lang="EN-US">Xpath</span><span style="FONT-FAMILY: 宋体">语句加载</span><span lang="EN-US">listbox</span><span style="FONT-FAMILY: 宋体">。如果仔细查看,会发现</span><span lang="EN-US">listBox1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">SelectedIndexChanged</span><span style="FONT-FAMILY: 宋体">事件有了少许变化。它没有显示元素的</span><span lang="EN-US">InnerText</span><span style="FONT-FAMILY: 宋体">,而是使用</span><span lang="EN-US">SelectSingleNode</span><span style="FONT-FAMILY: 宋体">进行另一个</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 宋体">搜索,获得</span><span lang="EN-US">UnitPrice</span><span style="FONT-FAMILY: 宋体">元素。所以每次单击列表框中的一个产品时,都会显示一个带有</span><span lang="EN-US">UnitPrice</span><span style="FONT-FAMILY: 宋体">的消息框。现在数据有两个视图,但更重要的是,可以使用两个不同的模型来处理数据。可以使用</span><span lang="EN-US">System.Data</span><span style="FONT-FAMILY: 宋体">命名空间来操纵数据,也可以使用</span><span lang="EN-US">System.XML</span><span style="FONT-FAMILY: 宋体">命名空间来处理数据。这样应用程序就可以有某些非常灵活的设计,因为现在不必把一个对象模型绑定到程序上,这是</span><span lang="EN-US">ADO.NET </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> System.Xml</span><span style="FONT-FAMILY: 宋体">组合的强大之处。相同数据可以有多个视图,访问数据也有多种方式。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下一个示例去掉了</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个流,使用内置于</span><span lang="EN-US">System.XML</span><span style="FONT-FAMILY: 宋体">命名空间中的一些</span><span lang="EN-US">ADO</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 XmlDocument doc = new XmlDocument();</span></p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?