﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-bob-文章分类-C#</title><link>http://www.blogjava.net/keweibo/category/52611.html</link><description>一专  Java 多能  C#,Delphi,Powerbuilder ... 
&lt;br&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "ca-pub-1944176156128447";
/* 468x15, 创建于 09-2-25 */
google_ad_slot = "5582725142";
google_ad_width = 468;
google_ad_height = 15;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 02 Jul 2014 02:24:28 GMT</lastBuildDate><pubDate>Wed, 02 Jul 2014 02:24:28 GMT</pubDate><ttl>60</ttl><item><title>DataTable更新数据操作(转)</title><link>http://www.blogjava.net/keweibo/articles/415278.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 30 Jun 2014 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/415278.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/415278.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/415278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/415278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/415278.html</trackback:ping><description><![CDATA[<div style="text-transform: none; text-indent: 0px; margin: 7px 0px 10px; width: 758px; zoom: 1; font: 14px/1.5 tahoma, helvetica, arial; white-space: normal; letter-spacing: normal; color: rgb(69,69,69); overflow: hidden; word-spacing: 0px; -webkit-text-stroke-width: 0px" id="content" class="content mod-cs-content text-content clearfix">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">BLL层&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp; public void Update(DataTable dt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (DataRow dr in dt.Rows)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dr.RowState == DataRowState.Deleted)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dr.RowState == DataRowState.Modified || dr.RowState == DataRowState.Added)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dr["usr_id"] == DBNull.Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("用户代码不能为空");<br />&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; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dal.Update(dt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">DAL层</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;public void Update(DataTable dt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter adapter = new SqlDataAdapter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.InsertCommand = new SqlCommand("INSERT INTO dbo.t6( com_id ,usr_id ) VALUES( @com_id ,@usr_id)", conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.InsertCommand.CommandType = CommandType.Text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.InsertCommand.Parameters.Add("@com_id", SqlDbType.VarChar, 4, "com_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.InsertCommand.Parameters.Add("@usr_id", SqlDbType.VarChar, 8, "usr_id");</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand = new SqlCommand("update t6 setwhereand usr_id", conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand.CommandType = CommandType.Text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand.Parameters.Add("@com_id", SqlDbType.VarChar, 4, "com_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand.Parameters.Add("@usr_id", SqlDbType.VarChar, 8, "usr_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand.Parameters.Add("@usr_id1", SqlDbType.VarChar, 8, "usr_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.UpdateCommand.Parameters["@usr_id1"].SourceVersion = DataRowVersion.Original;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand = new SqlCommand("delete from&nbsp;t6 whereand usr_id", conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand.CommandType = CommandType.Text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand.Parameters.Add("@com_id", SqlDbType.VarChar, 4, "com_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand.Parameters.Add("@usr_id", SqlDbType.VarChar, 8, "usr_id");</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand.Parameters["@com_id"].SourceVersion = DataRowVersion.Original;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.DeleteCommand.Parameters["@usr_id"].SourceVersion = DataRowVersion.Original;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.Update(dt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">前台</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp; public partial class DataTableUpdate : Form<br />&nbsp;&nbsp;&nbsp; {</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BLL.Users Bu = new BLL.Users();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public DataTable dtUsr = new DataTable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MOD.Users modObject = new MOD.Users();</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string _UserId = "";</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public DataTableUpdate()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataGridView1.AutoGenerateColumns = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">//窗口加载</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Form1_Load(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtUsr = Bu.GetList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataGridView1.DataSource = dtUsr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BindValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void BindValue()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb_com_id.DataBindings.Add("Text", dataGridView1.DataSource, "com_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb_UsrId.DataBindings.Add("Text", dataGridView1.DataSource, "usr_id");</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //手动修改可以; 代码赋值需要用下面这句话<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb_UsrId.DataBindings[0].DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void 保存_Click(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (DataRow dr in dtUsr.Rows)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dr.EndEdit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bu.Update(dtUsr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("保存成功！", "系统提示");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void 删除_Click(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (MessageBox.Show("您确认要删除用户：" + tb_UsrName.Text.Trim()+" ?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dataGridView1.CurrentCell == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataGridView1.Rows.Remove(dataGridView1.CurrentRow);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bu.Update(dtUsr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("删除成功！", "系统提示");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void 增加_Click(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataRow dr = dtUsr.NewRow();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dr["usr_id"] = _UserId;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtUsr.Rows.Add(dr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void 取消_Click(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtUsr.RejectChanges();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><u><strong>牛铁：<a style="color: rgb(63,167,203); text-decoration: underline" href="http://blog.csdn.net/fangxinggood/archive/2008/04/18/2304047.aspx">http://blog.csdn.net/fangxinggood/archive/2008/04/18/2304047.aspx</a></strong></u></p></div><img src ="http://www.blogjava.net/keweibo/aggbug/415278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2014-06-30 15:49 <a href="http://www.blogjava.net/keweibo/articles/415278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在数据表(DataTable)中操作数据(转)</title><link>http://www.blogjava.net/keweibo/articles/415272.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 30 Jun 2014 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/415272.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/415272.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/415272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/415272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/415272.html</trackback:ping><description><![CDATA[<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px">转自：<a href="http://blog.csdn.net/cui55/article/details/1371411">http://blog.csdn.net/cui55/article/details/1371411</a><br /><br />在<span class="Apple-converted-space">&nbsp;</span><strong>DataSet<span class="Apple-converted-space">&nbsp;</span></strong>中创建<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>之后，您执行的活动可以与使用数据库中的表时执行的活动相同。您可以添加、查看、编辑和删除表中的数据；可以监视错误和事件；并且可以查询表中的数据。在修改<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>中的数据时，您也可以验证更改是否正确，并决定是否以编程方式接受更改或拒绝更改。</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px">本节内容</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">将数据添至表中</font>:说明如何创建新行并将其添至表中。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">在创建<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>并使用列和约束定义其结构之后，您可以将新的数据行添至表中。要添加新行，可将一个新变量声明为<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>类型。调用<span class="Apple-converted-space">&nbsp;</span><strong>NewRow</strong><span class="Apple-converted-space">&nbsp;</span>方法时，将返回新的<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象。然后，<strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>会根据表的结构按<span class="Apple-converted-space">&nbsp;</span><strong>DataColumnCollection</strong><span class="Apple-converted-space">&nbsp;</span>的定义创建<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象。 
<p>以下示例演示了如何通过调用<span class="Apple-converted-space">&nbsp;</span><strong>NewRow</strong><span class="Apple-converted-space">&nbsp;</span>方法来创建新行。</p>
<p style="display: block">DataRow workRow = workTable.NewRow();</p>
<p>然后您可以使用索引或列名来操作新添加的行，如下例所示。</p>
<p style="display: block">workRow["CustLName"] = "Smith";<br />workRow[1] = "Smith";</p>
<p>在将数据插入新行后，<strong>Add</strong><span class="Apple-converted-space">&nbsp;</span>方法可用于将行添至<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection</strong>，如以下代码所示。</p>
<p style="display: block">workTable.Rows.Add(workRow);</p>
<p>您也可以通过传入值的数组（类型化为<span class="Apple-converted-space">&nbsp;</span><strong>Object</strong>），调用<span class="Apple-converted-space">&nbsp;</span><strong>Add</strong><span class="Apple-converted-space">&nbsp;</span>方法来添加新行，如下例所示。</p>
<p style="display: block">workTable.Rows.Add(new Object[] {1, "Smith"});</p>
<p>将类型化为<span class="Apple-converted-space">&nbsp;</span><strong>Object<span class="Apple-converted-space">&nbsp;</span></strong>的值的数组传递到<span class="Apple-converted-space">&nbsp;</span><strong>Add</strong><span class="Apple-converted-space">&nbsp;</span>方法，可在表内创建新行并将其列值设置为对象数组中的值。请注意，数组中的值会根据它们在表中出现的顺序相继与各列匹配。</p>
<p>以下示例将十行添至新建的<span class="Apple-converted-space">&nbsp;</span><strong>Customers</strong><span class="Apple-converted-space">&nbsp;</span>表中。</p>
<p style="display: block">DataRow workRow;<br /><br />for (int i = 0; i &lt;= 9; i++)&nbsp;<br />{<br />&nbsp; workRow = workTable.NewRow();<br />&nbsp; workRow[0] = i;<br />&nbsp; workRow[1] = "CustName" + i.ToString();<br />&nbsp; workTable.Rows.Add(workRow);<br />}</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">查看表中数据</font>:说明如何访问行中的数据，包括数据的原始版本和当前版本。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">可以使用<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>的<span class="Apple-converted-space">&nbsp;</span><strong>Rows</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>Columns</strong><span class="Apple-converted-space">&nbsp;</span>集合来访问<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>中的内容。也可以根据包括搜索标准、排序顺序和行状态等特定标准，使用<span class="Apple-converted-space">&nbsp;</span><strong>DataTable.Select</strong><span class="Apple-converted-space">&nbsp;</span>方法返回<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>中数据的子集。此外，用主键值搜索特定行时，还可使用<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><mshelp:link keywords="frlrfSystemDataDataRowCollectionClassFindTopic">Find</mshelp:link><span class="Apple-converted-space">&nbsp;</span>方法。 
<p><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>对象的<span class="Apple-converted-space">&nbsp;</span><strong>Select<span class="Apple-converted-space">&nbsp;</span></strong>方法返回一组与指定条件匹配的<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象。<strong>Select</strong><span class="Apple-converted-space">&nbsp;</span>采用筛选表达式、排序表达式和<span class="Apple-converted-space">&nbsp;</span><strong>DataViewRowState<span class="Apple-converted-space">&nbsp;</span></strong>的可选参数。筛选表达式根据<span class="Apple-converted-space">&nbsp;</span><strong>DataColumn</strong><span class="Apple-converted-space">&nbsp;</span>值（例如<span class="Apple-converted-space">&nbsp;</span><code class="ce">LastName = 'Smith'</code>。排序表达式遵循用于为列排序的标准 SQL 约定，例如<span class="Apple-converted-space">&nbsp;</span><code class="ce">LastName ASC, FirstName ASC</code>。有关编写表达式的规则，请参阅<strong>DataColumn</strong><span class="Apple-converted-space">&nbsp;</span>类的<span class="Apple-converted-space">&nbsp;</span><mshelp:link keywords="frlrfSystemDataDataColumnClassExpressionTopic">Expression</mshelp:link><span class="Apple-converted-space">&nbsp;</span>属性。</p>
<blockquote class="dtBlock"><strong class="le">提示</strong><span class="Apple-converted-space">&nbsp;</span>如果您将对<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>Select</strong><span class="Apple-converted-space">&nbsp;</span>方法执行多次调用，可通过先为<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>创建<span class="Apple-converted-space">&nbsp;</span><strong>DataView</strong>来提高性能。创建<span class="Apple-converted-space">&nbsp;</span><strong>DataView</strong><span class="Apple-converted-space">&nbsp;</span>会为表中的行编制索引。然后，<strong>Select</strong><span class="Apple-converted-space">&nbsp;</span>方法会使用该索引，这样将显著缩短生成查询结果的时间。有关为<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>创建<span class="Apple-converted-space">&nbsp;</span><strong>DataView</strong><span class="Apple-converted-space">&nbsp;</span>的信息，请参阅<a style="color: rgb(51,102,153); text-decoration: none" href="http://www.xx113.com/net/book/Asp.net/4-6.htm">创建和使用 DataView</a>。</blockquote>
<p><strong>Select</strong><span class="Apple-converted-space">&nbsp;</span>方法基于<span class="Apple-converted-space">&nbsp;</span><strong>DataViewRowState<span class="Apple-converted-space">&nbsp;</span></strong>确定要查看或操作的行的版本。下表说明了可能的<span class="Apple-converted-space">&nbsp;</span><strong>DataViewRowState</strong><span class="Apple-converted-space">&nbsp;</span>枚举值。</p>
<div class="tablediv" align="left">
<table class="dtTABLE" cellspacing="1" cellpadding="0">
<tbody>
<tr valign="top">
<th bgcolor="#f2e0c1">成员名称</th>
<th bgcolor="#f2e0c1">说明</th></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>CurrentRows</strong></td>
<td bgcolor="#f2e0c1">当前行，包括未更改的行、已添加的行和已修改的行。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Deleted</strong></td>
<td bgcolor="#f2e0c1">已删除的行。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>ModifiedCurrent</strong></td>
<td bgcolor="#f2e0c1">当前版本，它是原始数据的修改版本（请参阅<strong>ModifiedOriginal</strong>）。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>ModifiedOriginal</strong></td>
<td bgcolor="#f2e0c1">所有已修改行的原始版本。使用<span class="Apple-converted-space">&nbsp;</span><strong>ModifiedCurrent</strong><span class="Apple-converted-space">&nbsp;</span>时，当前版本可用。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Added</strong></td>
<td bgcolor="#f2e0c1">新行。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>None</strong></td>
<td bgcolor="#f2e0c1">无。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>OriginalRows</strong></td>
<td bgcolor="#f2e0c1">原始行，包括未更改的行和已删除的行。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Unchanged</strong></td>
<td bgcolor="#f2e0c1">未更改的行。</td></tr></tbody></table></div>
<p>在下面的示例中，<strong>DataSet</strong><span class="Apple-converted-space">&nbsp;</span>对象已经过筛选，这样，您可以只使用其<span class="Apple-converted-space">&nbsp;</span><strong>DataViewRowState</strong><span class="Apple-converted-space">&nbsp;</span>设置为<span class="Apple-converted-space">&nbsp;</span><strong>CurrentRows</strong>的行。</p>
<p style="display: block">DataRow[] currRows = workTable.Select(null, null, DataViewRowState.CurrentRows);<br /><br />if (currRows.Length &lt; 1 )<br />&nbsp; Console.WriteLine("No Current Rows Found");<br />else<br />{<br />&nbsp; foreach (DataColumn myCol in workTable.Columns)<br />&nbsp;&nbsp;&nbsp; Console.Write("/t{0}", myCol.ColumnName);<br /><br />&nbsp; Console.WriteLine("/tRowState");<br /><br />&nbsp; foreach (DataRow myRow in currRows)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; foreach (DataColumn myCol in workTable.Columns)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write("/t{0}", myRow[myCol]);<br /><br />&nbsp;&nbsp;&nbsp; Console.WriteLine("/t" + myRow.RowState);<br />&nbsp; }<br />}</p>
<p><strong>Select</strong><span class="Apple-converted-space">&nbsp;</span>方法可用于返回具有不同<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>值或字段值的行。以下示例返回一个引用所有已删除行的<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong>数组，并返回另一个引用所有已排序行（按照<span class="Apple-converted-space">&nbsp;</span><strong>CustLName<span class="Apple-converted-space">&nbsp;</span></strong>排序，其中<span class="Apple-converted-space">&nbsp;</span><strong>CustID</strong><span class="Apple-converted-space">&nbsp;</span>列大于 5）的<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>数组。</p>
<p style="display: block">// Retrieve all deleted rows.<br />DataRow[] delRows = workTable.Select(null, null, DataViewRowState.Deleted);<br /><br />// Retrieve rows where CustID &gt; 5, and order by CustLName.<br />DataRow[] custRows = workTable.Select("CustID &gt; 5", "CustLName ASC");</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">编辑表中的数据</font>:说明如何修改行中的数据，包括挂起对行的更改，直至验证并接受了建议的更改。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">当您在<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>中更改列值时，所做更改会立即置于行的<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>状态中。然后，<strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>会设置为<strong>Modified</strong>，并使用<span class="Apple-converted-space">&nbsp;</span><strong>DataRow<span class="Apple-converted-space">&nbsp;</span></strong>的<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法来接受或拒绝所做更改。<strong>DataRow</strong>还提供了三种可用于在编辑行时将行的状态挂起的方法。这些方法是<span class="Apple-converted-space">&nbsp;</span><strong>BeginEdit</strong>、<strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit</strong>。 
<p>当您直接在<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>中修改列值时，<strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>会使用<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong>、<strong>Default</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>Original<span class="Apple-converted-space">&nbsp;</span></strong>行版本来管理列值。除这些行版本以外，<strong>BeginEdit</strong>、<strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit</strong><span class="Apple-converted-space">&nbsp;</span>方法还使用第四个行版本：<strong>Proposed</strong>。</p>
<p>在执行编辑操作（通过调用<span class="Apple-converted-space">&nbsp;</span><strong>BeginEdit<span class="Apple-converted-space">&nbsp;</span></strong>开始，并且通过使用<span class="Apple-converted-space">&nbsp;</span><strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit<span class="Apple-converted-space">&nbsp;</span></strong>或者通过调用<strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges<span class="Apple-converted-space">&nbsp;</span></strong>结束）的过程中，<strong>Proposed</strong><span class="Apple-converted-space">&nbsp;</span>行版本会存在。</p>
<p>在编辑操作过程中，您可以通过计算<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>ColumnChanged</strong><span class="Apple-converted-space">&nbsp;</span>事件中的<span class="Apple-converted-space">&nbsp;</span><strong>ProposedValue</strong><span class="Apple-converted-space">&nbsp;</span>来将验证逻辑应用于各列。<strong>ColumnChanged</strong><span class="Apple-converted-space">&nbsp;</span>事件保存<span class="Apple-converted-space">&nbsp;</span><strong>DataColumnChangeEventArgs</strong>，可保持对正在更改的列和<strong>ProposedValue<span class="Apple-converted-space">&nbsp;</span></strong>的引用。计算了建议值后，可以对其进行修改或取消编辑。编辑结束时，行从<span class="Apple-converted-space">&nbsp;</span><strong>Proposed</strong><span class="Apple-converted-space">&nbsp;</span>状态中移出。</p>
<p>您可以通过调用<span class="Apple-converted-space">&nbsp;</span><strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>来确认编辑，也可以通过调用<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit</strong><span class="Apple-converted-space">&nbsp;</span>来取消编辑。请注意，尽管<span class="Apple-converted-space">&nbsp;</span><strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>确实已确认您所做的编辑，但在调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges<span class="Apple-converted-space">&nbsp;</span></strong>之前，<strong>DataSet</strong><span class="Apple-converted-space">&nbsp;</span>并没有实际接受更改。另外请注意，如果在<strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit<span class="Apple-converted-space">&nbsp;</span></strong>编辑结束之前调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong>，编辑将会终止，并接受<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong><span class="Apple-converted-space">&nbsp;</span>行版本的<span class="Apple-converted-space">&nbsp;</span><strong>Proposed</strong><span class="Apple-converted-space">&nbsp;</span>行值。调用<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges</strong><span class="Apple-converted-space">&nbsp;</span>会以同样的方式结束编辑，并放弃<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>Proposed</strong><span class="Apple-converted-space">&nbsp;</span>行版本。在调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges</strong><span class="Apple-converted-space">&nbsp;</span>之后调用<span class="Apple-converted-space">&nbsp;</span><strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit</strong><span class="Apple-converted-space">&nbsp;</span>不会起作用，因为编辑已经结束。</p>
<p>以下示例演示了如何将<span class="Apple-converted-space">&nbsp;</span><strong>BeginEdit<span class="Apple-converted-space">&nbsp;</span></strong>与<span class="Apple-converted-space">&nbsp;</span><strong>EndEdit</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>CancelEdit</strong><span class="Apple-converted-space">&nbsp;</span>一起使用。本示例也会检查<span class="Apple-converted-space">&nbsp;</span><strong>ColumnChanged</strong><span class="Apple-converted-space">&nbsp;</span>事件中的<span class="Apple-converted-space">&nbsp;</span><strong>ProposedValue</strong>，并决定是否取消编辑。</p>
<p style="display: block">DataTable&nbsp; workTable&nbsp; = new DataTable();<br />workTable.Columns.Add("LastName", typeof(String));<br /><br />workTable.ColumnChanged += new DataColumnChangeEventHandler(OnColumnChanged);<br /><br />DataRow workRow = workTable.NewRow();<br />workRow[0] = "Smith";<br />workTable.Rows.Add(workRow);<br /><br />workRow.BeginEdit();<br />// Causes the ColumnChanged event to write a message and cancel the edit.<br />workRow[0] = "";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />workRow.EndEdit();<br /><br />// Displays "Smith, New".<br />Console.WriteLine("{0}, {1}", workRow[0], workRow.RowState);&nbsp;&nbsp;<br /><br /><br />protected static void OnColumnChanged(Object sender, DataColumnChangeEventArgs args)<br />{<br />&nbsp; if (args.Column.ColumnName == "LastName")<br />&nbsp;&nbsp;&nbsp; if (args.ProposedValue.ToString() == "")<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Last Name cannot be blank. Edit canceled.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args.Row.CancelEdit();<br />&nbsp;&nbsp;&nbsp; }<br />}</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">行状态与行版本</font>:提供有关行的不同状态的信息。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">ADO.NET 用行状态和版本管理表中的行。行状态表示行的状态。当修改行时，行版本会维护存储于行中的值，包括当前值、原始值和默认值。例如，修改了某行中的一列后，该行会有一个<span class="Apple-converted-space">&nbsp;</span><strong>Modified</strong><span class="Apple-converted-space">&nbsp;</span>的行状态，并且会存在两个行版本：<strong>Current</strong>（包含当前行值）和<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong>（包含修改该列前的行值）。 
<p>每个<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象都具有<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>属性，您可以检查此属性来确定行的当前状态。下表给出了对各<strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>枚举值的简要说明。</p>
<div class="tablediv">
<div align="center">
<center>
<table class="dtTABLE" cellspacing="1" cellpadding="0">
<tbody>
<tr valign="top">
<th bgcolor="#f2e0c1">RowState</th>
<th bgcolor="#f2e0c1">说明</th></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Unchanged</strong></td>
<td bgcolor="#f2e0c1">自上次调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>之后，或自<span class="Apple-converted-space">&nbsp;</span><strong>DataAdapter.Fill<span class="Apple-converted-space">&nbsp;</span></strong>创建了行之后，未做出过任何更改。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Added</strong></td>
<td bgcolor="#f2e0c1">已将行添至表中，但尚未调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong>。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Modified</strong></td>
<td bgcolor="#f2e0c1">已更改了行的一些元素。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Deleted</strong></td>
<td bgcolor="#f2e0c1">已将该行从表中删除，并且尚未调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong>。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Detached</strong></td>
<td bgcolor="#f2e0c1">对于已经创建但不属于任何<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>的行，设置为<span class="Apple-converted-space">&nbsp;</span><strong>Detached</strong>。新建行的<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong>设置为<span class="Apple-converted-space">&nbsp;</span><strong>Detached</strong>。通过调用<span class="Apple-converted-space">&nbsp;</span><strong>Add</strong><span class="Apple-converted-space">&nbsp;</span>方法将新的<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>添至<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>之后，<strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>属性的值设置为<span class="Apple-converted-space">&nbsp;</span><strong>Added</strong>。 
<p>对于已经使用<span class="Apple-converted-space">&nbsp;</span><strong>Remove</strong><span class="Apple-converted-space">&nbsp;</span>方法（或是在使用<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法之后使用了<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法）从<strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>中移除的行，也设置为<span class="Apple-converted-space">&nbsp;</span><strong>Detached</strong>。</p></td></tr></tbody></table></center></div></div>
<p>在<span class="Apple-converted-space">&nbsp;</span><strong>DataSet</strong>、<strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>上调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>时，会移除行状态为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>的所有行。剩余的行会被赋予<span class="Apple-converted-space">&nbsp;</span><strong>Unchanged</strong><span class="Apple-converted-space">&nbsp;</span>行状态，并且<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong><span class="Apple-converted-space">&nbsp;</span>行版本中的值会改写为<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>行版本值。调用<strong>RejectChanges</strong><span class="Apple-converted-space">&nbsp;</span>时，会移除行状态为<span class="Apple-converted-space">&nbsp;</span><strong>Added</strong><span class="Apple-converted-space">&nbsp;</span>的所有行。剩余的行会被赋予<span class="Apple-converted-space">&nbsp;</span><strong>Unchanged</strong><span class="Apple-converted-space">&nbsp;</span>的行状态，并且<strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>行版本中的值会改写为<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong><span class="Apple-converted-space">&nbsp;</span>行版本值。</p>
<p>通过用列引用来传递<span class="Apple-converted-space">&nbsp;</span><strong>DataRowVersion</strong><span class="Apple-converted-space">&nbsp;</span>参数，您可以查看行的不同行版本，如下例所示。</p>
<p style="display: block">DataRow custRow = custTable.Rows[0];<br />string custID = custRow["CustomerID", DataRowVersion.Original].ToString();</p>
<p>下表给出了各<span class="Apple-converted-space">&nbsp;</span><strong>DataRowVersion</strong><span class="Apple-converted-space">&nbsp;</span>枚举值的简要说明。</p>
<div class="tablediv">
<div align="center">
<center>
<table class="dtTABLE" cellspacing="1" cellpadding="0">
<tbody>
<tr valign="top">
<th bgcolor="#f2e0c1">DataRowVersion</th>
<th bgcolor="#f2e0c1">说明</th></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Current</strong></td>
<td bgcolor="#f2e0c1">行的当前值。如果是有<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>的行，则不存在此行版本。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Default</strong></td>
<td bgcolor="#f2e0c1">特定行的默认行版本。<strong>Added</strong>、<strong>Modified</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>Unchanged</strong><span class="Apple-converted-space">&nbsp;</span>行的默认行版本是<strong>Current</strong>。<strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>行的默认行版本是<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong>。<strong>Detached</strong><span class="Apple-converted-space">&nbsp;</span>行的默认行版本是<span class="Apple-converted-space">&nbsp;</span><strong>Proposed</strong>。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Original</strong></td>
<td bgcolor="#f2e0c1">行的原始值。如果是有<span class="Apple-converted-space">&nbsp;</span><strong>Added</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>的行，则不存在此行版本。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>Proposed</strong></td>
<td bgcolor="#f2e0c1">行的建议值。在对行进行编辑操作期间，或对于不属于<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>的行，存在此行版本。</td></tr></tbody></table></center></div></div>
<p>通过调用<span class="Apple-converted-space">&nbsp;</span><strong>HasVersion</strong><span class="Apple-converted-space">&nbsp;</span>方法并将<span class="Apple-converted-space">&nbsp;</span><strong>DataRowVersion</strong><span class="Apple-converted-space">&nbsp;</span>作为参数传递，您可以测试<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>是否具有特定的行版本。例如，在调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>之前，<code class="ce">DataRow.HasVersion(DataRowVersion.Original)</code><span class="Apple-converted-space">&nbsp;</span>对新添加的行将返回<span class="Apple-converted-space">&nbsp;</span><strong>false</strong>。</p>
<p>例如，以下代码示例显示了表中所有已删除行的值。已删除的行没有<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>行版本，因此在访问列值时必须传递<span class="Apple-converted-space">&nbsp;</span><strong>DataRowVersion.Original</strong>。</p>
<p style="display: block">DataTable catTable = catDS.Tables["Categories"];<br /><br />DataRow[] delRows = catTable.Select(null, null, DataViewRowState.Deleted);<br /><br />Console.WriteLine("Deleted rows:/n");<br /><br />foreach (DataColumn catCol in catTable.Columns)<br />&nbsp; Console.Write(catCol.ColumnName + "/t");<br />Console.WriteLine();<br /><br />foreach (DataRow delRow in delRows)<br />{<br />&nbsp; foreach (DataColumn catCol in catTable.Columns)<br />&nbsp;&nbsp;&nbsp; Console.Write(delRow[catCol, DataRowVersion.Original] + "/t");<br />&nbsp; Console.WriteLine();<br />}</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">从表中删除行</font>:说明如何从表中移除行。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">用于从<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>对象中删除<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象的方法有两种：<strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>对象的<span class="Apple-converted-space">&nbsp;</span><strong>Remove</strong><span class="Apple-converted-space">&nbsp;</span>方法和<strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象的<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法。<strong>Remove</strong><span class="Apple-converted-space">&nbsp;</span>方法从<span class="Apple-converted-space">&nbsp;</span><strong>DataRowCollection<span class="Apple-converted-space">&nbsp;</span></strong>中删除<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong>，而<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法只将行标记为删除。当应用程序调用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法时，才会发生实际的删除。通过使用<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong>，您可以在实际删除之前先以编程方式检查哪些行标记为删除。如果将行标记为删除，其<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>属性会设置为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong>。 
<p>在将<span class="Apple-converted-space">&nbsp;</span><strong>DataSet</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>与<span class="Apple-converted-space">&nbsp;</span><strong>DataAdapter</strong><span class="Apple-converted-space">&nbsp;</span>和关系型数据源一起使用时，用<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法移除行。<strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法只是在<span class="Apple-converted-space">&nbsp;</span><strong>DataSet</strong><span class="Apple-converted-space">&nbsp;</span>或<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>中将行标记为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong>，而不会移除它。而<span class="Apple-converted-space">&nbsp;</span><strong>DataAdapter</strong><span class="Apple-converted-space">&nbsp;</span>在遇到标记为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>的行时，会执行其<span class="Apple-converted-space">&nbsp;</span><strong>DeleteCommand</strong><span class="Apple-converted-space">&nbsp;</span>以在数据源中删除该行。然后，就可以用<strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法永久移除该行。如果使用<span class="Apple-converted-space">&nbsp;</span><strong>Remove</strong><span class="Apple-converted-space">&nbsp;</span>删除该行，则该行将从表中完全移除，但<strong>DataAdapter</strong><span class="Apple-converted-space">&nbsp;</span>不会在数据源中删除该行。</p>
<p><strong>DataRowCollection</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>Remove</strong><span class="Apple-converted-space">&nbsp;</span>方法采用<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>作为参数，并将其从集合中移除，如下例所示。</p>
<p style="display: block">workTable.Rows.Remove(workRow);</p>
<p>作为对比，以下示例演示了如何调用<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>上的<span class="Apple-converted-space">&nbsp;</span><strong>Delete</strong><span class="Apple-converted-space">&nbsp;</span>方法来将其<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>改为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong>。</p>
<p style="display: block">workRow.Delete();</p>
<p>如果将行标记为删除，并且调用<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>对象的<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法，该行就会从<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>中移除。相比之下，如果调用<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges</strong>，行的<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>就会恢复到被标记为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted<span class="Apple-converted-space">&nbsp;</span></strong>之前的状态。</p>
<blockquote class="dtBlock"><strong class="le">注意</strong><span class="Apple-converted-space">&nbsp;</span>如果<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>是<span class="Apple-converted-space">&nbsp;</span><strong>Added</strong>，则意味着已将其添至表中，然后将其标记为<strong>Deleted</strong>，从表中移除。</blockquote></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">添加和读取行错误信息</font>:说明如何按行插入错误信息，以用于解决有关应用程序内行中数据的问题。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">为了避免在编辑<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>中的值时每次发生行错误都必须响应，可将错误信息添至行中，以便以后使用。<strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>对象通过对各行提供<span class="Apple-converted-space">&nbsp;</span><strong>RowError</strong><span class="Apple-converted-space">&nbsp;</span>属性来支持此功能。将数据添至<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>RowError</strong><span class="Apple-converted-space">&nbsp;</span>属性会将<strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>的<span class="Apple-converted-space">&nbsp;</span><strong>HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>属性标记为<span class="Apple-converted-space">&nbsp;</span><strong>true</strong>。如果<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>是<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>的组成部分，且<span class="Apple-converted-space">&nbsp;</span><strong>DataRow.HasErrors</strong>是<span class="Apple-converted-space">&nbsp;</span><strong>true</strong>，则<span class="Apple-converted-space">&nbsp;</span><strong>DataTable.HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>属性也是<span class="Apple-converted-space">&nbsp;</span><strong>true</strong>。这也适用于<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>所属的<span class="Apple-converted-space">&nbsp;</span><strong>DataSet</strong>。为错误做测试时，可以检查<span class="Apple-converted-space">&nbsp;</span><strong>HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>属性以确定错误信息是否已添至所有行。如果<span class="Apple-converted-space">&nbsp;</span><strong>HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>为<span class="Apple-converted-space">&nbsp;</span><strong>true</strong>，则可使用<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>的<strong>GetErrors</strong><span class="Apple-converted-space">&nbsp;</span>方法以便只返回和检查有错误的行，如下例所示。 
<p style="display: block">DataTable&nbsp; workTable = new DataTable("Customers");<br />workTable.Columns.Add("CustID", typeof(Int32));<br />workTable.Columns.Add("Total", typeof(Double));<br /><br />workTable.RowChanged += new DataRowChangeEventHandler(OnRowChanged);<br /><br />for (int i = 0; i &lt; 10; i++)<br />&nbsp; workTable.Rows.Add(new Object[] {i, i*100});<br /><br />if (workTable.HasErrors)<br />{<br />&nbsp; Console.WriteLine("Errors In Table " + workTable.TableName);<br /><br />&nbsp; foreach (DataRow myRow in workTable.GetErrors())<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; Console.WriteLine("CustID = " + myRow["CustID"]);<br />&nbsp;&nbsp;&nbsp; Console.WriteLine(" Error = " + myRow.RowError + "/n");<br />&nbsp; }<br />}<br /><br />protected static void OnRowChanged(Object sender, DataRowChangeEventArgs args)<br />{<br />&nbsp; // Check for zero values.<br />&nbsp; if (args.Row["Total"].Equals(0D))<br />&nbsp;&nbsp;&nbsp; args.Row.RowError = "Total cannot be 0.";<br />}</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">接受或拒绝对行的更改</font>:说明如何接受或拒绝对行的更改。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%">在检验过对<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>中的数据所做更改的准确性之后，可使用<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong>、<strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>或<span class="Apple-converted-space">&nbsp;</span><strong>DataSet<span class="Apple-converted-space">&nbsp;</span></strong>的<strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>方法来接受更改，此方法会将<span class="Apple-converted-space">&nbsp;</span><strong>Current</strong><span class="Apple-converted-space">&nbsp;</span>行值设置为<span class="Apple-converted-space">&nbsp;</span><strong>Original</strong><span class="Apple-converted-space">&nbsp;</span>值，并会将<span class="Apple-converted-space">&nbsp;</span><strong>RowState</strong><span class="Apple-converted-space">&nbsp;</span>属性设置为<span class="Apple-converted-space">&nbsp;</span><strong>Unchanged</strong>。接受或拒绝更改会清除所有<span class="Apple-converted-space">&nbsp;</span><strong>RowError</strong><span class="Apple-converted-space">&nbsp;</span>信息，并将<span class="Apple-converted-space">&nbsp;</span><strong>HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>属性设置为<span class="Apple-converted-space">&nbsp;</span><strong>false</strong>。接受或拒绝更改还可以影响在数据源中更新数据。有关更多信息，请参阅<a style="color: rgb(51,102,153); text-decoration: none" href="http://www.xx113.com/net/book/Asp.net/4-2-a.htm">使用 DataAdapter 和 DataSet 更新数据库</a>。 
<p>如果<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>上存在外键约束，使用<span class="Apple-converted-space">&nbsp;</span><strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>和<span class="Apple-converted-space">&nbsp;</span><strong>RejectChanges</strong><span class="Apple-converted-space">&nbsp;</span>接受或拒绝的更改就会根据<strong>ForeignKeyConstraint.AcceptRejectRule<span class="Apple-converted-space">&nbsp;</span></strong>传播至<span class="Apple-converted-space">&nbsp;</span><strong>DataRow</strong><span class="Apple-converted-space">&nbsp;</span>的子行。</p>
<p>以下示例检查有错误的行，在适用之处解决错误，拒绝无法解决错误的行。请注意，对于解决的错误，<strong>RowError</strong>值会重置为空字符串，导致将<span class="Apple-converted-space">&nbsp;</span><strong>HasErrors</strong><span class="Apple-converted-space">&nbsp;</span>属性设置为<span class="Apple-converted-space">&nbsp;</span><strong>false</strong>。当解决或拒绝了所有的有错误的行时，就会调用<strong>AcceptChanges</strong><span class="Apple-converted-space">&nbsp;</span>来接受对整个<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>的所有更改。</p>
<p style="display: block">if (workTable.HasErrors)<br />{<br /><br />&nbsp; foreach (DataRow errRow in workTable.GetErrors())<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if (errRow.RowError == "Total cannot exceed 1000.")<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errRow["Total"] = 1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errRow.RowError = "";&nbsp;&nbsp;&nbsp; // Clear the error.<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errRow.RejectChanges();<br />&nbsp; }<br />}<br /><br />workTable.AcceptChanges();</p></td></tr></tbody></table>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px"><font color="#ff0000">处理 DataTable 事件</font>:提供可用于<span class="Apple-converted-space">&nbsp;</span><strong>DataTable<span class="Apple-converted-space">&nbsp;</span></strong>的事件的相关信息，包括修改列值和添加或删除行时的事件。</p>
<table style="text-align: left; text-transform: none; text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-stroke-width: 0px" border="0" width="100%" bgcolor="#e6e6e6">
<tbody>
<tr>
<td width="100%"><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>对象提供一系列可由应用程序处理的事件。下表说明了<span class="Apple-converted-space">&nbsp;</span><strong>DataTable</strong><span class="Apple-converted-space">&nbsp;</span>事件。 
<div class="tablediv" align="left">
<table class="dtTABLE" cellspacing="1" cellpadding="0">
<tbody>
<tr valign="top">
<th bgcolor="#f2e0c1">事件</th>
<th bgcolor="#f2e0c1">说明</th></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>ColumnChanged</strong></td>
<td bgcolor="#f2e0c1">在值已成功插入列时发生。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>ColumnChanging</strong></td>
<td bgcolor="#f2e0c1">在已提交列值时发生。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>RowChanged</strong></td>
<td bgcolor="#f2e0c1">在已成功编辑表中的行后发生。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>RowChanging</strong></td>
<td bgcolor="#f2e0c1">当正在更改表中的行时发生。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>RowDeleted</strong></td>
<td bgcolor="#f2e0c1">在表中的某行已被标记为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>之后发生。</td></tr>
<tr valign="top">
<td bgcolor="#f2e0c1"><strong>RowDeleting</strong></td>
<td bgcolor="#f2e0c1">在表中的某行被标记为<span class="Apple-converted-space">&nbsp;</span><strong>Deleted</strong><span class="Apple-converted-space">&nbsp;</span>之前发生。</td></tr></tbody></table></div>
<p>以下示例创建 4 个事件：<strong>OnColumnChanged</strong>、<strong>OnColumnChanging</strong>、<strong>OnRowChanged</strong><span class="Apple-converted-space">&nbsp;</span>和<strong>OnRowChanging</strong>。这些事件中的每一个都在列或行更改时发生。</p>
<p style="display: block">workTable.ColumnChanged&nbsp; += new DataColumnChangeEventHandler(OnColumnChanged);<br />workTable.ColumnChanging += new DataColumnChangeEventHandler(OnColumnChanging);<br />workTable.RowChanged&nbsp;&nbsp;&nbsp;&nbsp; += new DataRowChangeEventHandler(OnRowChanged);<br />workTable.RowChanging&nbsp;&nbsp;&nbsp; += new DataRowChangeEventHandler(OnRowChanging);<br /><br />protected static void OnColumnChanged(object sender, DataColumnChangeEventArgs args)<br />{<br />&nbsp; Console.Write(" ColumnChanged: ");<br />&nbsp; Console.Write(args.Column.ColumnName + " changed to '" + args.ProposedValue + "'/n");<br />}<br /><br />protected static void OnColumnChanging(object sender, DataColumnChangeEventArgs args)<br />{<br />&nbsp; Console.Write("ColumnChanging: ");<br />&nbsp; Console.Write(args.Column.ColumnName + " equals '" + args.Row[args.Column] +<span class="Apple-converted-space">&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "', changing to '" + args.ProposedValue + "'/n");&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />}<br /><br />protected static void OnRowChanging(object sender, DataRowChangeEventArgs args)<br />{<br />&nbsp; if (args.Action != DataRowAction.Nothing)<br />&nbsp;&nbsp;&nbsp; Console.WriteLine("&nbsp;&nbsp; RowChanging: Action = " + args.Action + ", CustID = " + args.Row["CustID"]);<br />}<br /><br />protected static void OnRowChanged(object sender, DataRowChangeEventArgs args)<br />{<br />&nbsp; if (args.Action != DataRowAction.Nothing)<br />&nbsp;&nbsp;&nbsp; Console.WriteLine("&nbsp;&nbsp;&nbsp; RowChanged: Action = " + args.Action + ", CustID = " + args.Row["CustID"]);<br />}</p></td></tr></tbody></table><img src ="http://www.blogjava.net/keweibo/aggbug/415272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2014-06-30 11:08 <a href="http://www.blogjava.net/keweibo/articles/415272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Combobox出现System.Data.DataRowView的原因，以及指定ValueMember的时机问题 </title><link>http://www.blogjava.net/keweibo/articles/396365.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Wed, 13 Mar 2013 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/396365.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/396365.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/396365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/396365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/396365.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体">转自：<a href="http://blog.csdn.net/lubiaopan/article/details/5915774">http://blog.csdn.net/lubiaopan/article/details/5915774</a><br /><br />当使用</span><span style="font-family: Times New Roman">Combobox</span><span style="font-family: 宋体">控件时，出现</span><span style="font-family: Times New Roman">SelectedValue</span><span style="font-family: 宋体">的值为&#8220;</span><span style="font-family: Times New Roman">System.Data.DataRowView</span><span style="font-family: 宋体">&#8221;的原因有两个：<span style="color: #ff0000"><strong>在Combobox的DataSource不为空的情况下</strong></span>，要么是没有为</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">赋值，要么是赋值赋错了，这两种情况下系统就会把</span><span style="font-family: Times New Roman">SelectedValue</span><span style="font-family: 宋体">的默认值输出来（注意红色部分，如果DataSource为空，那么SelectedValue的值为null）</span><span style="font-family: 宋体">。但有时即使你对</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">赋了正确的值也会出现这个问题，这里有一个赋值时机选择的问题，请看下面的示例：</span> 
<p><span style="font-size: medium"><span style="font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">首先，构造如下所示的一个窗体</span><span style="font-family: Times New Roman">:</span></span></p>
<p><span style="font-size: medium"><span style="font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201009/30/0_12858126388y7q.gif" /></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: medium"><span style="font-family: 宋体">窗体有一个下拉框，名为</span><span style="font-family: Times New Roman">Combobox1</span><span style="font-family: 宋体">，还有一个文本框，名为</span><span style="font-family: Times New Roman">TextBox1</span><span style="font-family: 宋体">，功能很简单，当选择下拉框的某一项的时候，把该选择项对应的</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">的值显示到文本框中。下面是实现该功能的核心代码：</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: medium"><span style="font-family: 宋体"><span style="color: #0000ff"><strong>Code-1：</strong></span></span></span></p>
<p style="text-indent: 21pt" sizset="0" sizcache="2"><span style="font-size: small" sizset="0" sizcache="2"><span style="font-family: 宋体" sizset="0" sizcache="2"></p>
<div bg_c-sharp?>
<div>
<div><strong>[c-sharp]</strong> <a title="view plain" href="http://blog.csdn.net/lubiaopan/article/details/5915774#"><u>view plain</u></a><a title="copy" href="http://blog.csdn.net/lubiaopan/article/details/5915774#"><u>copy</u></a><a title="print" href="http://blog.csdn.net/lubiaopan/article/details/5915774#"><u>print</u></a><a title="?" href="http://blog.csdn.net/lubiaopan/article/details/5915774#"><u>?</u></a></div></div>
<ol><li><span>namespace&nbsp;FrmForTest&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;partial&nbsp;class&nbsp;Form1&nbsp;:&nbsp;Form&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Form1()&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.InitialCombobox();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;InitialCombobox()&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataTable&nbsp;table&nbsp;=&nbsp;new&nbsp;DataTable();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataColumn&nbsp;column;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataRow&nbsp;row;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column&nbsp;=&nbsp;new&nbsp;DataColumn("Name");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.Columns.Add(column);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column&nbsp;=&nbsp;new&nbsp;DataColumn("Value");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.Columns.Add(column);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;5;&nbsp;i++)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;=&nbsp;table.NewRow();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row["Name"]&nbsp;=&nbsp;"Test"&nbsp;+&nbsp;i;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row["Value"]&nbsp;=&nbsp;i.ToString();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.Rows.Add(row);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.comboBox1.DataSource&nbsp;=&nbsp;table;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.comboBox1.DisplayMember&nbsp;=&nbsp;"Name";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.comboBox1.ValueMember&nbsp;=&nbsp;"Value";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;comboBox1_SelectedIndexChanged(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.textBox1.Text&nbsp;=&nbsp;this.comboBox1.SelectedValue.ToString();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div><textarea style="display: none" rows="15" cols="84" name="code">namespace FrmForTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.InitialCombobox();
        }

        private void InitialCombobox()
        {
            DataTable table = new DataTable();
            DataColumn column;
            DataRow row;

            column = new DataColumn("Name");
            table.Columns.Add(column);

            column = new DataColumn("Value");
            table.Columns.Add(column);

            for (int i = 0; i &lt; 5; i++)
            {
                row = table.NewRow();
                row["Name"] = "Test" + i;
                row["Value"] = i.ToString();
                table.Rows.Add(row);
            }

            this.comboBox1.DataSource = table;
            this.comboBox1.DisplayMember = "Name";
            this.comboBox1.ValueMember = "Value";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.textBox1.Text = this.comboBox1.SelectedValue.ToString();
        }
    }
}
</textarea> </span></span>
<p>&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-family: 新宋体"><span style="font-size: medium">运行上面的代码，窗体初始化完毕后输出的结果如下：</span></span></p>
<p align="left"><span style="font-family: 新宋体"><span style="font-size: small"><span style="font-size: medium"><img alt="" src="http://hi.csdn.net/attachment/201009/30/0_1285811510X1QM.gif" /></span></span></span></p>
<p align="left">&nbsp;</p>
<p sizset="32" sizcache="0"><span style="font-family: 宋体" sizset="32" sizcache="0"><span style="font-size: small" sizset="32" sizcache="0"><span style="font-size: medium">文本框显示的是&#8220;</span><span style="font-family: 'Times New Roman'"><span style="font-size: medium">System.Data.DataRowView</span></span></span></span><span style="font-size: medium"><span style="font-family: 宋体">&#8221;，前面说过，只有在没有为</span><span style="font-family: Times New Roman">Combobox</span><span style="font-family: 宋体">指定</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">的值或指定错的情况下才会是该字符串，可程序已经正确指定了</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">为什么还是这个结果呢？我试着选择其他的下拉项，发现显示的结果变成了预想的值，原因何在？</span></span></p>
<p><span style="font-size: medium"><span style="font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">仔细观察程序发现原因在于</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">赋值的时机，上面的代码当执行完</span><span style="font-family: Times New Roman">DataSource</span><span style="font-family: 宋体">赋值语句之后，触发了</span><span style="font-family: 新宋体">SelectedIndexChanged</span><span style="font-family: 新宋体">事件，而此时还未指定ValueMember，所以窗体初次初始化后显示的是</span><span style="font-family: 宋体">&#8220;</span><span style="font-family: Times New Roman">System.Data.DataRowView</span><span style="font-family: 宋体">&#8221;，</span><span style="font-family: 宋体">解决方法很简单：只需</span></span><span style="font-size: medium"><span style="font-family: 宋体">把</span><span style="font-family: Times New Roman">DataSource</span><span style="font-family: 宋体">赋值语句放到</span><span style="font-family: Times New Roman">DisplayMember</span><span style="font-family: 宋体">、</span><span style="font-family: Times New Roman">ValueMember</span><span style="font-family: 宋体">语句之后。</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-size: medium"><span style="font-family: 宋体">好，这个问题解决了，新的问题又来了，请看下面的描述：</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-size: medium"><span style="font-family: 新宋体">突然想到Combobox还有一个事件是SelectedValueChanged，还是上面的程序Code-1，把<span style="font-family: 新宋体">SelectedIndexChanged替换为SelectedValueChanged，会是什么效果呢？试了一下，没有报错，并且窗体初始化完毕后显示的就是预期的值0。呵呵，又找到了一种解决方法。问题还没完，请接着往下看：</span></span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-size: medium"><span style="font-family: 新宋体"><span style="font-family: 新宋体">上面SelectedValueChanged的试验中，DataSource是在<span style="font-family: Times New Roman">DisplayMember</span><span style="font-family: 宋体">、</span><span style="font-family: Times New Roman">ValueMember前面的，如果放到它们两个后面呢？继续尝试，这次报错了&#8212;&#8212;&#8220;未将对象引用到对象的示例&#8221;，对程序进行跟踪，当执行完this.comboBox1.ValueMember = "Value"语句之后，程序转到了comboBox1_SelectedIndexChanged方法，在this.textBox1.Text = this.comboBox1.SelectedValue.ToString();语句处报错，SelectedValue的值为空，因为此时还没有给DataSource赋值，所以报这个错。</span></span></span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-size: medium"><span style="font-family: 新宋体"><span style="font-family: 新宋体"><span style="font-family: Times New Roman"><span style="color: #ff0000"><strong>现在可以总结了，当使用<span style="font-family: 新宋体">SelectedIndexChanged时，ValueMember在DataSource前进行赋值，当使用SelectedValueChanged时，ValueMember在DataSource后进行赋值。</strong></span></span></span></span></span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">还有一个问题很有意思，如下所示：</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">this.comboBox1.DisplayMember = "Name";</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">this.comboBox1.ValueMember = <span style="color: red">"ValueError";</span></span></span></p>
<p align="left"><span style="font-family: 新宋体"><span style="font-size: medium">&nbsp;&nbsp;&nbsp;this.comboBox1.DataSource = table;</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-size: medium"><span style="font-family: 新宋体">上面故意把ValueMember的值写错了，运行起来没有任何问题(是指没有报错，此时的SelectedValue值都为</span><span style="font-family: Times New Roman">System.Data.DataRowView</span><span style="font-family: 新宋体">)</span><span style="font-family: 新宋体">，然后我们对这三行代码的顺序做一下调整，如下：</span></span></p>
<p align="left"><span style="font-family: 新宋体"><span style="font-size: medium">&nbsp;&nbsp;&nbsp;this.comboBox1.DataSource = table;</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">this.comboBox1.DisplayMember = "Name";</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">this.comboBox1.ValueMember = <span style="color: red">"ValueError";</span></span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">上面ValueMember的值依旧是错的，但是对其赋值操作放到了DataSource语句之后，运行程序，在ValueMember赋值语句处报错如下：<span style="color: red">&#8220;无法绑定到值成员</span>&#8221;。</span></span></p>
<p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 新宋体"><span style="font-size: medium">当指定了DataSource的值后再对ValueMember赋错，如果此时赋值赋错的话，运行时就会报错，如果是在DataSource语句之前对ValueMember赋值则不会报错，大家在应用的时候一定要注意。</span></span></p><img src ="http://www.blogjava.net/keweibo/aggbug/396365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2013-03-13 11:11 <a href="http://www.blogjava.net/keweibo/articles/396365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++调用c#的dll（转） </title><link>http://www.blogjava.net/keweibo/articles/396322.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 12 Mar 2013 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/396322.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/396322.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/396322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/396322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/396322.html</trackback:ping><description><![CDATA[<p>一、使用/clr编译MFC可执行文件或规则C# DLL函数.<br />&nbsp;&nbsp;&nbsp; 1、打开&#8220;项目属性&#8221;对话框，方法是右键单击&#8220;解决方案资源管理器&#8221;中的项目并选择&#8220;属性&#8221;。<br />&nbsp;&nbsp;&nbsp; 2、展开&#8220;配置属性&#8221;旁边的节点并选择&#8220;常规&#8221;。在右侧窗格中的&#8220;项目默认值&#8221;下，将&#8220;公共语言运行库支持&#8221;设置为<strong>&#8220;公共语言运行库支持（/clr）&#8221;。<br /></strong>&nbsp;&nbsp;&nbsp; 3、在相同的窗格中，确保将&#8220;MFC的使用&#8221;设置为&#8220;<strong>在共享DLL中使用MFC</strong>&#8221;。<br />&nbsp;&nbsp;&nbsp; 4、在&#8220;配置属性&#8221;下，展开&#8220;C/C++&#8221;旁边的节点并选择&#8220;常规&#8221;。请确保将&#8220;调试信息格式&#8221;设置为&#8220;程序数据库/Zi&#8221;（而不是&#8220;/ZI&#8221;）。<br />&nbsp;&nbsp;&nbsp; 5、在&#8220;配置属性&#8221;下，选择&#8220;C/C++&#8221;，然后选择&#8220;代码生成&#8221;。请确保将&#8220;运行时库&#8221;设置为&#8220;多线程调试DLL（/MDd）&#8221;或&#8220;多线程DLL（/MD）&#8221;之一。<br />二、在代码引用需要的dll.<br />&nbsp;using &lt;mscorlib.dll&gt;.&nbsp; <br />&nbsp;<strong>using "DownloaFiles.dll"&nbsp;&nbsp; //换成需要的dll文件。</strong>&nbsp; <br />&nbsp;using namespace System； <br />&nbsp;using namespace ADMessage_test；&nbsp; //换成dll中类所使用的namespace. <br />三、在C# DLL函数调用代码前加入#pragma managed<br />&nbsp;&nbsp;&nbsp; 这是manage和unmanage混合编程在MFC下的一种实现方式。<br />&nbsp;&nbsp;&nbsp; 以上介绍C++调用C# DLL函数，希望对你有所帮助。</p>
<p>四 、几点要记住：</p>
<p>　　1 使用#using引用C# DLL，而不是#include.我就是想当然的使用了后者，所以浪费了一上午的时间；</p>
<p>　　2 别忘了using namespace CSLib；</p>
<p>　　3 使用C++/clr语法，采用正确的访问托管对象，即：使用帽子&#8216;^&#8217;，而不是星星&#8216;*&#8217;。<br /><br /><br />PS：附上自己成功运行C++代码<br /></p>
<p>#include "stdafx.h"<br />#include &lt;iostream&gt;<br />//#using "..\..\SFCSDLL.dll" //右击项目--&gt;引用...，添加新引用，将DLL添加到项目中，可以不用此行代码</p>
<p>using namespace std;<br />using namespace SFCSDLL;</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />&nbsp;Class1 ^c = gcnew Class1();</p>
<p>&nbsp;c-&gt;SFCSDLL_Create_Connection("127.0.0.1", 0, 0, 0, 0);<br />&nbsp;c-&gt;SFCSDLL_Get_DLLVersion();<br />&nbsp;c-&gt;SFCSDLL_Close_Connection();</p>
<p>&nbsp;cout&lt;&lt;"end...";<br />&nbsp;system("pause");<br />&nbsp;return 0;<br />}</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/keweibo/aggbug/396322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2013-03-12 15:13 <a href="http://www.blogjava.net/keweibo/articles/396322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# DataGridView显示行号的方法</title><link>http://www.blogjava.net/keweibo/articles/392802.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 11 Dec 2012 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/392802.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/392802.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/392802.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/392802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/392802.html</trackback:ping><description><![CDATA[<div id="content" class="content mod-cs-content text-content clearfix">
<div>
<p><span>网上最常见的做法是用</span><span>DataGridView</span><span>的</span><span>RowPostPaint</span><span>事件在</span><span>RowHeaderCell</span><span>中绘制行号：</span></p>
<p><span>private</span><span>void</span><span>dataGridView1_RowPostPaint(</span><span>object</span><span>sender,&nbsp;DataGridViewRowPostPaintEventArgs&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.Graphics.DrawString((e.RowIndex&nbsp;+&nbsp;1).ToString(),&nbsp;e.InheritedRowStyle.Font,&nbsp;new&nbsp;SolidBrush(Color.CadetBlue),&nbsp;e.RowBounds.Location.X&nbsp;+&nbsp;15,&nbsp;e.RowBounds.Location.Y&nbsp;+&nbsp;5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>catch</span><span>(Exception&nbsp;ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span>"</span><span>添加行号时发生错误，错误信息：</span><span>"</span><span>+</span><span>ex.Message,&nbsp;</span><span>"</span><span>操作失败</span><span>"</span><span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></p>
<p><strong><span>但是这种方法在大数据量的时候性能比较差，每次滚动数据都会触发</span><span>RowPostPaint</span><span>事件。</span></strong></p></div></div><img src ="http://www.blogjava.net/keweibo/aggbug/392802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-12-11 14:54 <a href="http://www.blogjava.net/keweibo/articles/392802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2008 自动生成属性的get、set </title><link>http://www.blogjava.net/keweibo/articles/391417.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 16 Nov 2012 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/391417.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/391417.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/391417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/391417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/391417.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p>在VS2008里，也可以像Eclipse那样自动生成get 、set方法。<br /><br />下面是两个具体操作的方法：<br /></p>
<p>1、在编写的字段上单击右键-----&gt;重构-------&gt;封装字段<br /></p>
<p>2、在空白行处，输入&#8220;prop&#8221;再按Tab键</p></div><img src ="http://www.blogjava.net/keweibo/aggbug/391417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-11-16 09:34 <a href="http://www.blogjava.net/keweibo/articles/391417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS中C#读取app.config数据库配置字符串的三种方法(转)</title><link>http://www.blogjava.net/keweibo/articles/391207.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 12 Nov 2012 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/391207.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/391207.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/391207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/391207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/391207.html</trackback:ping><description><![CDATA[原文：<a href="http://hi.baidu.com/mindox/item/3278dc352c7ba68fb80c0389">http://hi.baidu.com/mindox/item/3278dc352c7ba68fb80c0389</a><br /><br />
<p>关于VS2008或VS2005中数据库配置字符串的三种取法<br />VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDataAparter,SqlConnection等控件时如影随行地提示你让去选择,或者是新建字符串。如果要用代码的方式取得这个字符串则有三种方式：</p>
<p>app.config内容：</p>
<p>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp; &lt;configSections&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/configSections&gt;<br />&lt;appSettings&gt;<br />&nbsp;&nbsp;&nbsp; &lt;add key="connectionstring" value="Data Source=你的数据库器（本机可用LocalHost,如果是EXPRESS开发版则必须是.\SQLEXPRESS);Initial Catalog=数据库名字;User ID=用户名;Password=你自己的密码 /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;add key="TemplatePATH" value="Template" /&gt;<br />&lt;/appSettings&gt;<br />&lt;connectionStrings&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="SxzzManager.Properties.Settings.sxzzConnectionString"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionString="Data Source=你的数据库器;Initial Catalog=数据库名字;User ID=sa;Password=你自己的密码"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerName="System.Data.SqlClient" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="TestConnectionString" connectionString="Data Source=你的数据库器;Initial Catalog=数据库名字;User ID=sa;Password=你自己的密码"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerName="System.Data.SqlClient" /&gt;<br />&nbsp;&nbsp; &lt;/connectionStrings&gt;<br />&lt;/configuration&gt;</p>
<p>说明：<br />其中<br />《1》<br /><strong>&lt;</strong><em><strong>appSettings&gt;<br />&nbsp;&nbsp;&nbsp; &lt;add key="connectionstring" value="Data Source=你的数据库器（本机可用LocalHost,如果是EXPRESS开发版则必须是.\SQLEXPRESS);Initial Catalog=数据库名字;User ID=用户名;Password=你自己的密码 /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;add key="TemplatePATH" value="Template" /&gt;<br />&lt;/appSettings&gt;<br /></strong></em>为手工所加。<br />《2》<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em><strong>&lt;add name="SxzzManager.Properties.Settings.sxzzConnectionString"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionString="Data Source=你的数据库器;Initial Catalog=数据库名字;User ID=sa;Password=你自己的密码"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerName="System.Data.SqlClient" /&gt;<br /></strong></em>为在VS2008中添加数据源时自动生成的内容。<br />《3》<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em><strong>&lt;add name="TestConnectionString" connectionString="Data Source=你的数据库器;Initial Catalog=数据库名字;User ID=sa;Password=你自己的密码"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; providerName="System.Data.SqlClient" /&gt;<br /></strong></em>为手工添加。<br />要取得《1》中所示的连接字符串用如下语句：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ConString = System.Configuration.ConfigurationSettings.AppSettings["connectionstring"];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string ConString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"];</p>
<p>要取得《2》中所示的连接字符串有两种方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;1&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string constr = System.Configuration.ConfigurationManager.ConnectionStrings["<em>SxzzManager.Properties.Settings.sxzzConnectionString</em>"].ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;2&gt;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string constr = SxzzManager.Properties.Settings.Default["<em>sxzzConnectionString</em>"].ToString();//"其中"sxzzConnectionString"可以在VS2008中菜单＝》项目＝》属性＝》设置＝》名称&nbsp;&nbsp; 弹出的对话框中显示。其实就是"<em>SxzzManager.Properties.Settings.sxzzConnectionString</em>"中最后一个点后面的字符串。<br />要取得《3》中所示的连接字符串则中能用《2》中的一个字符串<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string constr = ConfigurationManager.ConnectionStrings["TestConnectionString"].ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string constr = ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString;</p><br /><br /><br /><strong style="color: red">补充：如果VS不能识别ConfigurationManager类，则需要在引用中添加&#8220;System.Configuration&#8221;引用即可</strong><img src ="http://www.blogjava.net/keweibo/aggbug/391207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-11-12 15:42 <a href="http://www.blogjava.net/keweibo/articles/391207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何编写C# Windows服务（转）</title><link>http://www.blogjava.net/keweibo/articles/390464.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Tue, 30 Oct 2012 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/390464.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/390464.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/390464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/390464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/390464.html</trackback:ping><description><![CDATA[转自：<a href="http://www.csharpwin.com/csharpspace/5575r154.shtml">http://www.csharpwin.com/csharpspace/5575r154.shtml</a><br /><br />1、新建C# Windows服务：windows service工程 
<p><a href="http://images.51cto.com/files/uploadimg/20090825/1548000.jpg" target="_blank"><img class="fit-image" border="0" alt="新建windows service工程" src="http://www.csharpwin.com/upload/1548000.jpg" width="343" height="275" /></a></p>
<p>&nbsp;&nbsp;&nbsp; 2、新建windows service工程后，系统自动生成一个Service1.cs文件，默认是其设计视图。选择查看其代码，默认有构造函数、OnStart、OnStop三个函数，如下图所示：</p>
<p><a href="http://images.51cto.com/files/uploadimg/20090825/1548001.jpg" target="_blank"><img class="fit-image" border="0" alt="设计视图" src="http://www.csharpwin.com/upload/1548001.jpg" width="342" height="162" /></a>&nbsp;</p>
<p>&nbsp;&nbsp; 3、新建了C# Windows服务之后，还要设置该服务运行的周期，左侧的ToolBox中有两个timmer，一个在组件下，一个在windows form下，可惜<span style="color: red"><strong>这两个都不能用</strong></span>，我们要手工新建一个timmer，并设置其属性和事件。</p><pre><ol class="dp-c"><li class="alt"><span class="keyword"><strong><font color="#006699">public</font></strong></span><span>&nbsp;WindowsServiceDemo()&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Timers.Timer&nbsp;t&nbsp;=&nbsp;</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span>&nbsp;System.Timers.Timer(1000);</span><span class="comment"><font color="#008200">//实例化Timer类，设置间隔时间为10000毫秒；&nbsp;&nbsp; </font></span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.Elapsed&nbsp;+=&nbsp;</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span>&nbsp;System.Timers.ElapsedEventHandler(TimeElapse);</span><span class="comment"><font color="#008200">//到达时间的时候执行事件；&nbsp;&nbsp; </font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.AutoReset&nbsp;=&nbsp;</span><span class="keyword"><strong><font color="#006699">true</font></strong></span><span>;</span><span class="comment"><font color="#008200">//设置是执行一次（false）还是一直执行(true)；&nbsp;&nbsp; </font></span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.Enabled&nbsp;=&nbsp;</span><span class="keyword"><strong><font color="#006699">true</font></strong></span><span>;</span><span class="comment"><font color="#008200">//是否执行System.Timers.Timer.Elapsed事件；&nbsp; </font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="keyword"><strong><font color="#006699">public</font></strong></span><span>&nbsp;</span><span class="keyword"><strong><font color="#006699">void</font></strong></span><span>&nbsp;TimeElapse(</span><span class="keyword"><strong><font color="#006699">object</font></strong></span><span>&nbsp;source,&nbsp;System.Timers.ElapsedEventArgs&nbsp;e)&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">//EventLog&nbsp;log&nbsp;=&nbsp;new&nbsp;EventLog();&nbsp; </font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">//log.Source&nbsp;=&nbsp;"我的应用程序";&nbsp; </font></span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">//log.WriteEntry("1秒调用一次",&nbsp;EventLogEntryType.Information);&nbsp; </font></span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;fs&nbsp;=&nbsp;</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span>&nbsp;FileStream(@</span><span class="string"><font color="#0000ff">"d:\timetick.txt"</font></span><span>,&nbsp;FileMode.OpenOrCreate,&nbsp;FileAccess.Write);&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamWriter&nbsp;m_streamWriter&nbsp;=&nbsp;</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span>&nbsp;StreamWriter(fs);&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_streamWriter.BaseStream.Seek(0,&nbsp;SeekOrigin.End);&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_streamWriter.WriteLine(</span><span class="string"><font color="#0000ff">"过了一秒&nbsp;"</font></span><span>&nbsp;+&nbsp;DateTime.Now.ToString()&nbsp;+&nbsp;</span><span class="string"><font color="#0000ff">"\n"</font></span><span>);&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_streamWriter.Flush();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_streamWriter.Close();&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs.Close();&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></pre>
<p>&nbsp;&nbsp; 4、服务编写之后，还不能由SCM(服务控制管理器)进行管理，需要给该服务添加装载器。在Service1.cs的设计视图，点击右键，选择&#8220;添加装载器&#8221;，系统默认就会添加ProjectInstaller.cs这个类。</p>
<p><a href="http://images.51cto.com/files/uploadimg/20090825/1548002.jpg" target="_blank"><img class="fit-image" border="0" alt="Service1.cs的设计视图" src="http://www.csharpwin.com/upload/1548002.jpg" width="270" height="232" /></a>&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 5、添加该类后，在该类的设计视图上可看到serviceInstaller1和serviceProcessInstaller1，分别设置其属性。</p>
<p>&nbsp;&nbsp;&nbsp; 设置serviceInstaller1的运行方式为手动或者自动</p>
<p>&nbsp;&nbsp;&nbsp; 设置serviceInstaller1的ServiceName,设置为什么，服务列表中就显示什么</p>
<p>&nbsp;&nbsp;&nbsp; 设置serviceProcessInstaller1的运行账号为LocalSystem</p>
<p>&nbsp;&nbsp;&nbsp; 6、编译该工程</p>
<p>&nbsp;&nbsp;&nbsp; 7、使用vs自带的命令行工具，运行installutil 编译生成的exe</p>
<p>&nbsp;&nbsp;&nbsp; 8、在系统的服务中可看到我们创建的服务。</p>
<p>&nbsp;&nbsp;&nbsp; 需要注意的是:</p>
<p>&nbsp;&nbsp;&nbsp; 如果你修改了这个服务，路径没有变化的话是不需要重新注册服务的，如果路径发生了变化，需要先卸载这个服务<span style="color: red">InstallUtil.exe /u</span>参数，然后再重新安装这个服务，不能直接安装。还有就是C# Windows服务是没有界面的，不要企图用控制的输出方式来输出一些信息，你只能添加一个EventLog，通过WriteEntry()来写日志。<br /></p><img src ="http://www.blogjava.net/keweibo/aggbug/390464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-10-30 15:37 <a href="http://www.blogjava.net/keweibo/articles/390464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断文件是否被占用（独享模式）</title><link>http://www.blogjava.net/keweibo/articles/390409.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Mon, 29 Oct 2012 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/390409.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/390409.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/390409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/390409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/390409.html</trackback:ping><description><![CDATA[<p>try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (File.Open(@"C:testfile.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.None))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("ok");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(ex.Message.ToString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />测试代码：<br /><br />使用File.Create(@"C:testfile.txt")创建测试文本文件，没调用Close（）方法释放。<br />当执行上面的代码时，会抛出异常，提示文件正在被使用之类的异常信息。<br /><br /><span style="color: red">针对在Window环境下，手动创建TXT文档，并进行编辑（不保存），以上判断代码不适用。</span></p><img src ="http://www.blogjava.net/keweibo/aggbug/390409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-10-29 16:45 <a href="http://www.blogjava.net/keweibo/articles/390409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>File.Create(path)创建文件后需要调用Close()方法释放</title><link>http://www.blogjava.net/keweibo/articles/390257.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Fri, 26 Oct 2012 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/390257.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/390257.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/390257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/390257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/390257.html</trackback:ping><description><![CDATA[使用 File.Create(strFilePath) 创建文件后，对文件进行写入，发现未成功，内容没有写进去，<br />在操作系统中打开新建的文件提示&#8220;正在被使用&#8221;的提示信息。<br /><br />//文件不存在则创建<br />File.Create(strFilePath).<span style="color: red">Close</span>();<br /><br /><img src ="http://www.blogjava.net/keweibo/aggbug/390257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-10-26 11:40 <a href="http://www.blogjava.net/keweibo/articles/390257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 C# 进行 label 打印 的两种方式 (转)</title><link>http://www.blogjava.net/keweibo/articles/387627.html</link><dc:creator>Ke</dc:creator><author>Ke</author><pubDate>Thu, 13 Sep 2012 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/387627.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/387627.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/387627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/387627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/387627.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文:http://blog.csdn.net/JustLovePro/article/details/2246339两种打印方式：机器码打印、调用CodeSoft.调用CodeSoft打印：&nbsp;利用第三方软件codesofe进行label设计，然后在程序中调用打印。 &nbsp;这种方式维护起来比较方便，手动调整label各参数指标即可。 &nbsp;准备工作：&nbsp;1.安装打印机...&nbsp;&nbsp;<a href='http://www.blogjava.net/keweibo/articles/387627.html'>阅读全文</a><img src ="http://www.blogjava.net/keweibo/aggbug/387627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">Ke</a> 2012-09-13 11:26 <a href="http://www.blogjava.net/keweibo/articles/387627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>