??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲avav天堂av在线网爱情,亚洲AV成人无码网天堂,亚洲成AV人在线观看网址http://www.tkk7.com/kuxiaoku/category/21188.html收藏zh-cnMon, 02 Apr 2007 00:08:39 GMTMon, 02 Apr 2007 00:08:39 GMT60DataGrid的数据过滤示?/title><link>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107845.html</link><dc:creator>苦笑?/dc:creator><author>苦笑?/author><pubDate>Thu, 18 Jan 2007 16:16:00 GMT</pubDate><guid>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107845.html</guid><wfw:comment>http://www.tkk7.com/kuxiaoku/comments/107845.html</wfw:comment><comments>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kuxiaoku/comments/commentRss/107845.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kuxiaoku/services/trackbacks/107845.html</trackback:ping><description><![CDATA[<p>q个CZ演示了怎么样在DataGrid中筛选数?/p> <p>/*DataDridFilterForm.aspx</p> <p>前台E序</p> <p>*/</p> <p><%@ Page language="c#" Codebehind="DataGridFilterForm.aspx.cs" AutoEventWireup="false" Inherits="DataDridFilterDemo.DataDridFilterForm" %><br><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><br><HTML><br> <HEAD><br>  <title>WebForm1</title><br>  <meta name="vs_snapToGrid" content="True"><br>  <meta name="vs_showGrid" content="True"><br>  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"><br>  <meta name="CODE_LANGUAGE" Content="C#"><br>  <meta name="vs_defaultClientScript" content="JavaScript"><br>  <meta name="vs_targetSchema" content="<a ><br> </HEAD><br> <body MS_POSITIONING="GridLayout"><br>  <form id="Form1" method="post" runat="server"><br>   <FONT face="宋体"><br>    <asp:DropDownList id="ddlCategory" style="Z-INDEX: 101; LEFT: 120px; POSITION: absolute; TOP: 16px"<br>     runat="server" Width="106px" Height="26px" AutoPostBack="True"></asp:DropDownList><br>    <asp:Label id="lblCategory" style="Z-INDEX: 102; LEFT: 32px; POSITION: absolute; TOP: 24px"<br>     runat="server">Category:</asp:Label><br>    <asp:Label id="lblPrice" style="Z-INDEX: 103; LEFT: 256px; POSITION: absolute; TOP: 24px" runat="server">Price Range:</asp:Label><br>    <asp:DropDownList id="ddlPrice" style="Z-INDEX: 104; LEFT: 368px; POSITION: absolute; TOP: 16px" runat="server"<br>     AutoPostBack="True"><br>     <asp:ListItem Value="0" Selected="True">Any Price</asp:ListItem><br>     <asp:ListItem Value="1">Cheap</asp:ListItem><br>     <asp:ListItem Value="2">Moderate</asp:ListItem><br>     <asp:ListItem Value="3">Expensive</asp:ListItem><br>     <asp:ListItem Value="4">Absurdly Expensive</asp:ListItem><br>    </asp:DropDownList><br>    <asp:DataGrid id="dgProduct" style="Z-INDEX: 105; LEFT: 224px; POSITION: absolute; TOP: 96px"<br>     runat="server"><br>     <AlternatingItemStyle BackColor="#E8E6E6"></AlternatingItemStyle><br>     <ItemStyle BackColor="#F1F1F1"></ItemStyle><br>     <HeaderStyle BackColor="#C0C0FF"></HeaderStyle><br>    </asp:DataGrid></FONT><br>  </form><br> </body><br></HTML><br></p> <p>/*DataDridFilterForm.aspx.cs</p> <p>后台处理E序</p> <p>*/</p> <p>using System;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Data;<br>using System.Data.SqlClient;<br>using System.Drawing;<br>using System.Web;<br>using System.Web.SessionState;<br>using System.Web.UI;<br>using System.Web.UI.WebControls;<br>using System.Web.UI.HtmlControls;</p> <p>namespace DataDridFilterDemo<br>{<br> /// <summary><br> /// WebForm1 的摘要说明?br> /// </summary><br> public class DataDridFilterForm : System.Web.UI.Page<br> {<br>  protected System.Web.UI.WebControls.DropDownList ddlCategory;<br>  protected System.Web.UI.WebControls.Label lblCategory;<br>  protected System.Web.UI.WebControls.Label lblPrice;<br>  protected System.Web.UI.WebControls.DropDownList ddlPrice;<br>  protected System.Web.UI.WebControls.DataGrid dgProduct;<br>  public static string strCategory="CategoryID=1";<br>  public static string strPrice="UnitPrice>0";<br> <br>  private void Page_Load(object sender, System.EventArgs e)<br>  {<br>   // 在此处放|用户代码以初始化页?br>   if(!IsPostBack)<br>   {<br>    FillDropDownList();<br>    DataFiller();<br>   }<br>  }</p> <p>  #region Web H体设计器生成的代码<br>  override protected void OnInit(EventArgs e)<br>  {<br>   //<br>   // CODEGEN: 该调用是 ASP.NET Web H体设计器所必需的?br>   //<br>   InitializeComponent();<br>   base.OnInit(e);<br>  }<br>  <br>  /// <summary><br>  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary><br>  private void InitializeComponent()<br>  {    <br>   this.ddlCategory.SelectedIndexChanged += new System.EventHandler(this.FilterChange);<br>   this.ddlPrice.SelectedIndexChanged += new System.EventHandler(this.FilterChange);<br>   this.Load += new System.EventHandler(this.Page_Load);</p> <p>  }<br>  #endregion</p> <p>  private void FillDropDownList()<br>  {<br>   string strCon="server=JOSEN;database=NorthWind;integrated security=true";<br>   string strSqlCategory="select CategoryName,CategoryID from Categories";<br>   <br>   SqlConnection objCon=new SqlConnection(strCon);<br>   SqlDataAdapter objAdpt=new SqlDataAdapter(strSqlCategory,objCon);</p> <p>   DataSet ds=new DataSet();<br>   objAdpt.Fill(ds);</p> <p>   ddlCategory.DataSource=ds;<br>   ddlCategory.DataTextField="CategoryName";<br>   ddlCategory.DataValueField="CategoryID";<br>   ddlCategory.DataBind();<br>  }</p> <p>  private void DataFiller()<br>  {<br>   string strCon="server=JOSEN;database=NorthWind;integrated security=true";<br>   string strSqlProduct="select ProductID,ProductName,CategoryID,UnitPrice from Products";<br>   SqlConnection objCon=new SqlConnection(strCon);<br>   SqlDataAdapter objAdpt=new SqlDataAdapter(strSqlProduct,objCon);</p> <p>   DataSet objds=new DataSet();<br>   objAdpt.Fill(objds,"dtProduct");</p> <p>   DataView dvUK=new DataView(objds.Tables["dtProduct"]);<br>   dvUK.RowFilter=strCategory+" and "+strPrice;</p> <p>   this.dgProduct.DataSource=dvUK;<br>   dgProduct.DataBind();<br>  }</p> <p>  private void FilterChange(object sender, System.EventArgs e)<br>  {<br>   FilterByPrice(ddlPrice.SelectedItem.Text.ToString());<br>   FilterByCategory(ddlCategory.SelectedItem.Value.ToString());//注意q里Q用的是CategoryID而不是CategoryName<br>   DataFiller();<br>  }<br>  private void FilterByPrice(string strChoice)<br>  {<br>   switch(strChoice)<br>   {<br>    case "Any Price":<br>     strPrice="UnitPrice>0";<br>     break;<br>    case "Cheap":<br>     strPrice="UnitPrice<20";<br>     break;<br>    case "Moderate":<br>     strPrice="UnitPrice>19 and UnitPrice<50";<br>     break;<br>    case "Expensive":<br>     strPrice="UnitPrice>=50";<br>     break;<br>    case "Absurdly Expensive":<br>     strPrice="UnitPrice>100";<br>     break;<br>   }<br>  }</p>   private void FilterByCategory(string strChoice)<br>  {<br>   strCategory="CategoryID="+strChoice;<br>  }<br> }<br>}<img src="http://www.tkk7.com/kuxiaoku/aggbug/94809.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:16 <a href="http://www.tkk7.com/kuxiaoku/articles/94809.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div> <br>文章来源:<a href="http://www.tkk7.com/kuxiaoku/articles/94809.html">http://www.tkk7.com/kuxiaoku/articles/94809.html</a> <img src ="http://www.tkk7.com/kuxiaoku/aggbug/107845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:16 <a href="http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataGrid控g分页昄的示?/title><link>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107846.html</link><dc:creator>苦笑?/dc:creator><author>苦笑?/author><pubDate>Thu, 18 Jan 2007 16:16:00 GMT</pubDate><guid>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107846.html</guid><wfw:comment>http://www.tkk7.com/kuxiaoku/comments/107846.html</wfw:comment><comments>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kuxiaoku/comments/commentRss/107846.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kuxiaoku/services/trackbacks/107846.html</trackback:ping><description><![CDATA[<table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td class="artbody" valign="top"> <p>/*</p> <p>实现DataGrid控g分页昄的示?/p> <p>*/</p> <p>前台处理E序</p> <p>//DataGridPageDemo.aspx</p> <p><%@ Page language="c#" Codebehind="DataGridPageDemo.aspx.cs" AutoEventWireup="false" Inherits="DataGridPageDemo.DataGridPageDemo" %><br><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><br><HTML><br> <HEAD><br>  <title>WebForm1</title><br>  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"><br>  <meta name="CODE_LANGUAGE" Content="C#"><br>  <meta name="vs_defaultClientScript" content="JavaScript"><br>  <meta name="vs_targetSchema" content="<a ><br> </HEAD><br> <body MS_POSITIONING="GridLayout"><br>  <form id="Form1" method="post" runat="server"><br>   <FONT face="宋体"><br>    <asp:DataGrid id="dgDemo" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server"<br>     Width="264px" Height="240px" AllowPaging="True"><br>     <PagerStyle Mode="NumericPages"></PagerStyle><br>    </asp:DataGrid></FONT><br>  </form><br> </body><br></HTML><br></p> <p> </p> <p>//下面的是后台处理E序</p> <p>DataGridPageDemo.aspx.cs</p> <p>using System;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Data;<br>using System.Data.SqlClient;<br>using System.Drawing;<br>using System.Web;<br>using System.Web.SessionState;<br>using System.Web.UI;<br>using System.Web.UI.WebControls;<br>using System.Web.UI.HtmlControls;</p> <p>namespace DataGridPageDemo<br>{<br> /// <summary><br> /// WebForm1 的摘要说明?br> /// </summary><br> public class DataGridPageDemo : System.Web.UI.Page<br> {<br>  protected System.Web.UI.WebControls.DataGrid dgDemo;<br> <br>  private void Page_Load(object sender, System.EventArgs e)<br>  {<br>   // 在此处放|用户代码以初始化页?br>   if(!IsPostBack)<br>   {<br>    DataFiller();<br>   }<br>  }</p> <p>  #region Web H体设计器生成的代码<br>  override protected void OnInit(EventArgs e)<br>  {<br>   //<br>   // CODEGEN: 该调用是 ASP.NET Web H体设计器所必需的?br>   //<br>   InitializeComponent();<br>   base.OnInit(e);<br>  }<br>  <br>  /// <summary><br>  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary><br>  private void InitializeComponent()<br>  {    <br>   this.dgDemo.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.dgDemo_PageIndexChanged);<br>   this.Load += new System.EventHandler(this.Page_Load);</p> <p>  }<br>  #endregion</p> <p>  private void DataFiller()<br>  {<br>   string strConn="server=JOSEN;database=NorthWind;integrated security=true";<br>   string strSql="select * from orders";<br>   SqlConnection objCon=new SqlConnection(strConn);<br>   SqlDataAdapter objAdapter=new SqlDataAdapter(strSql,objCon);<br>   DataSet ds=new DataSet();<br>   objAdapter.Fill(ds,"dtorder");</p> <p>   dgDemo.DataSource=ds.Tables["dtorder"];<br>   dgDemo.DataBind();</p> <p>  }</p> <p>  private void dgDemo_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)<br>  {<br>   dgDemo.CurrentPageIndex=e.NewPageIndex;<br>   DataFiller();<br>  }<br> }<br>}<br></p> </td> </tr> <tr> <td valign="top"> </td> </tr> <tr> <td class="artfooter" align="right" valign="top"> <br> </td> </tr> </tbody> </table> <img src="http://www.tkk7.com/kuxiaoku/aggbug/94810.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:16 <a href="http://www.tkk7.com/kuxiaoku/articles/94810.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div> <br>文章来源:<a href="http://www.tkk7.com/kuxiaoku/articles/94810.html">http://www.tkk7.com/kuxiaoku/articles/94810.html</a> <img src ="http://www.tkk7.com/kuxiaoku/aggbug/107846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:16 <a href="http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用DataGrid控g更新删除数据CZhttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107847.html苦笑?/dc:creator>苦笑?/author>Thu, 18 Jan 2007 16:15:00 GMThttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107847.htmlhttp://www.tkk7.com/kuxiaoku/comments/107847.htmlhttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107847.html#Feedback0http://www.tkk7.com/kuxiaoku/comments/commentRss/107847.htmlhttp://www.tkk7.com/kuxiaoku/services/trackbacks/107847.html

/*UpdateDelForm.aspx

前台E序代码

*/

<%@ Page language="c#" Codebehind="UpdateDelForm.aspx.cs" AutoEventWireup="false" Inherits="UpdateDelDbDemo.UpdateDelForm" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
 <HEAD>
  <title>WebForm1</title>
  <meta name="vs_snapToGrid" content="False">
  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <meta name="vs_targetSchema" content=" </HEAD>
 <body MS_POSITIONING="GridLayout">
  <form id="Form1" method="post" runat="server">
   <FONT face="宋体">
    <asp:DataGrid id="dgDemo" runat="server" AutoGenerateColumns="False" GridLines="Horizontal">
     <Columns>
      <asp:BoundColumn DataField="ID" ReadOnly="True" HeaderText="UserID"></asp:BoundColumn>
      <asp:BoundColumn DataField="FirstName" HeaderText="FirstName"></asp:BoundColumn>
      <asp:BoundColumn DataField="LastName" HeaderText="LastName"></asp:BoundColumn>
      <asp:BoundColumn DataField="address" HeaderText="Address"></asp:BoundColumn>
      <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="~辑"></asp:EditCommandColumn>
      <asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
     </Columns>
    </asp:DataGrid></FONT>
  </form>
 </body>
</HTML>

/*UpdateDelForm.aspx.cs

后台E序代码

*/

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace UpdateDelDbDemo
{
 /// <summary>
 /// WebForm1 的摘要说明?br> /// </summary>
 public class UpdateDelForm : System.Web.UI.Page
 {
  protected System.Web.UI.WebControls.DataGrid dgDemo;
  private string strCon="server=JOSEN;database=testDb;integrated security=true";
  private string strSqlSelect="select * from UserInfo";
  private SqlConnection objCon;
 
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放|用户代码以初始化页?br>   if(!IsPostBack)
    LoadGrid();
  }

  #region Web H体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: 该调用是 ASP.NET Web H体设计器所必需的?br>   //
   InitializeComponent();
   base.OnInit(e);
  }
  
  /// <summary>
  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary>
  private void InitializeComponent()
  {   
   this.dgDemo.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgDemo_CancelCommand);
   this.dgDemo.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgDemo_EditCommand);
   this.dgDemo.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgDemo_UpdateCommand);
   this.dgDemo.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgDemo_DeleteCommand);
   this.Load += new System.EventHandler(this.Page_Load);

  }
  #endregion
  //d数据q帮定到QataQrid
  private void LoadGrid()
  {
   Connect();
   SqlDataAdapter objAdpt=new SqlDataAdapter(strSqlSelect,objCon);
   DataSet ds=new DataSet();
   objAdpt.Fill(ds,"dtUserInfo");

   dgDemo.DataSource=ds;
   dgDemo.DataBind();
  }
  //建立数据库的q接
  private void Connect()
  {
   if(objCon==null)
    objCon=new SqlConnection(strCon);
   if(objCon.State==ConnectionState.Closed)
    objCon.Open();
  
  }
  //断开数据库的q接
  private void Disconnect()
  {
   objCon.Close();
  }

  private void dgDemo_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
  {
   dgDemo.EditItemIndex=e.Item.ItemIndex;
   LoadGrid();
  }

  private void dgDemo_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
  {
   dgDemo.EditItemIndex=-1;
   LoadGrid();
  }

  private void dgDemo_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
  {
   string strUserID=e.Item.Cells[0].Text;
   //string strUserID=((TextBox)e.Item.Cells[0].Controls[0]).Text;
   string strFirstName=((TextBox)e.Item.Cells[1].Controls[0]).Text;
   string strLastName=((TextBox)e.Item.Cells[2].Controls[0]).Text;
   string strAddress=((TextBox)e.Item.Cells[3].Controls[0]).Text;

   dgDemo.EditItemIndex=-1;
   //此方法具体处理数据库的更?br>   UpdateRecord(strUserID,strFirstName,strLastName,strAddress);
   //调用此方法从数据库读取数?br>   LoadGrid();

  }

  private void UpdateRecord(string strUserID, string strFirstName, string strLastName, string strAddress)
  {
   Connect();
   SqlDataAdapter objAdpt=new SqlDataAdapter(strSqlSelect,objCon);
   DataSet ds=new DataSet();
   objAdpt.Fill(ds,"dtUserInfo");
   Disconnect();

   DataTable tbl=ds.Tables["dtUserInfo"];
   
   //讑֮表的主键
   DataColumn[] myKey=new DataColumn[1];
   myKey[0]=tbl.Columns["ID"];
   tbl.PrimaryKey=myKey;
   
   DataRow dr=tbl.Rows.Find(strUserID);
   //dr["ID"]=strUserID;
   dr["FirstName"]=strFirstName;
   dr["LastName"]=strLastName;
   dr["address"]=strAddress;

   SqlCommandBuilder cb=new SqlCommandBuilder(objAdpt);
   Connect();
   objAdpt.Update(ds,"dtUserInfo");
   Disconnect();
  }

  private void dgDemo_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
  {

   string strUserID=e.Item.Cells[0].Text;

   dgDemo.EditItemIndex=-1;
   DelRecord(strUserID);
   //调用此方法从数据库读取数?br>   LoadGrid();
  }
  private void DelRecord(string strUserID)
  {
   Connect();
   SqlDataAdapter objAdpt=new SqlDataAdapter(strSqlSelect,objCon);
   DataSet ds=new DataSet();
   objAdpt.Fill(ds,"dtUserInfo");
   Disconnect();

   DataTable tbl=ds.Tables["dtUserInfo"];
   
   //讑֮表的主键
   DataColumn[] myKey=new DataColumn[1];
   myKey[0]=tbl.Columns["ID"];
   tbl.PrimaryKey=myKey;
   
   DataRow dr=tbl.Rows.Find(strUserID);
   dr.Delete();

   SqlCommandBuilder cb=new SqlCommandBuilder(objAdpt);
   Connect();
   objAdpt.Update(ds,"dtUserInfo");
   Disconnect();
  }
 }
}



文章来源:http://www.tkk7.com/kuxiaoku/articles/94807.html

]]>
日历E序的用示?/title><link>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107848.html</link><dc:creator>苦笑?/dc:creator><author>苦笑?/author><pubDate>Thu, 18 Jan 2007 16:15:00 GMT</pubDate><guid>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107848.html</guid><wfw:comment>http://www.tkk7.com/kuxiaoku/comments/107848.html</wfw:comment><comments>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kuxiaoku/comments/commentRss/107848.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kuxiaoku/services/trackbacks/107848.html</trackback:ping><description><![CDATA[<p>/*CalendarForm2.aspx</p> <p>前台E序</p> <p>*/</p> <p><%@ Page language="c#" Codebehind="CalendarForm2.aspx.cs" AutoEventWireup="false" Inherits="CalendarDemo.CalendarForm2" %><br><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><br><HTML><br> <HEAD><br>  <title>CalendarForm2</title><br>  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"><br>  <meta name="CODE_LANGUAGE" Content="C#"><br>  <meta name="vs_defaultClientScript" content="JavaScript"><br>  <meta name="vs_targetSchema" content="<a ><br> </HEAD><br> <body MS_POSITIONING="GridLayout"><br>  <form id="Form1" method="post" runat="server"><br>   <FONT face="宋体"><br>    <asp:ListBox id="lbxEmployee" style="Z-INDEX: 101; LEFT: 224px; POSITION: absolute; TOP: 80px"<br>     runat="server" Width="144px" Height="264px" Rows="7" AutoPostBack="True"></asp:ListBox><br>    <asp:Calendar id="calHire" style="Z-INDEX: 102; LEFT: 232px; POSITION: absolute; TOP: 384px" runat="server"<br>     Width="312px" Height="160px"></asp:Calendar><br>    <asp:Label id="lblInfo" style="Z-INDEX: 103; LEFT: 232px; POSITION: absolute; TOP: 352px" runat="server"<br>     Width="152px" Height="24px">display Dates</asp:Label></FONT><br>  </form><br> </body><br></HTML><br></p> <p>/*CalendarForm2.aspx.cs</p> <p>日历控g使用后台E序</p> <p>*/</p> <p>using System;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Data;<br>using System.Data.SqlClient;<br>using System.Drawing;<br>using System.Web;<br>using System.Web.SessionState;<br>using System.Web.UI;<br>using System.Web.UI.WebControls;<br>using System.Web.UI.HtmlControls;</p> <p>namespace CalendarDemo<br>{<br> /// <summary><br> /// CalendarForm2 的摘要说明?br> /// </summary><br> public class CalendarForm2 : System.Web.UI.Page<br> {<br>  protected System.Web.UI.WebControls.ListBox lbxEmployee;<br>  protected System.Web.UI.WebControls.Calendar calHire;<br>  protected System.Web.UI.WebControls.Label lblInfo;<br> <br>  private void Page_Load(object sender, System.EventArgs e)<br>  {<br>   // 在此处放|用户代码以初始化页?br>   string strCon="server=JOSEN;database=NorthWind;integrated security=true";<br>   string strSql="select EmployeeID,LastName,FirstName,HireDate from Employees";</p> <p>   SqlConnection objCon=new SqlConnection(strCon);<br>   SqlDataAdapter objAdpt=new SqlDataAdapter(strSql,objCon);</p> <p>   DataSet ds=new DataSet();<br>   objAdpt.Fill(ds,"dtEmployee");</p> <p>   if(!IsPostBack)<br>   {<br>    this.lbxEmployee.DataSource=ds;<br>    lbxEmployee.DataTextField="LastName";<br>    lbxEmployee.DataBind();<br>   }<br>   else<br>   {<br>    DateTime datHireDate;<br>    datHireDate=Convert.ToDateTime(ds.Tables["dtEmployee"].Rows[lbxEmployee.SelectedIndex]["HireDate"]);</p> <p>    lblInfo.Text=ds.Tables["dtEmployee"].Rows[lbxEmployee.SelectedIndex]["LastName"].ToString();</p> <p>    this.calHire.VisibleDate=datHireDate;<br>    calHire.SelectedDate=datHireDate;<br>    lblInfo.Text+="hired on "+datHireDate;<br>   }<br>  }</p> <p>  #region Web H体设计器生成的代码<br>  override protected void OnInit(EventArgs e)<br>  {<br>   //<br>   // CODEGEN: 该调用是 ASP.NET Web H体设计器所必需的?br>   //<br>   InitializeComponent();<br>   base.OnInit(e);<br>  }<br>  <br>  /// <summary><br>  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary><br>  private void InitializeComponent()<br>  {    <br>   this.Load += new System.EventHandler(this.Page_Load);</p> <p>  }<br>  #endregion<br> }<br>}<br></p>   <br><img src="http://www.tkk7.com/kuxiaoku/aggbug/94808.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:15 <a href="http://www.tkk7.com/kuxiaoku/articles/94808.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div> <br>文章来源:<a href="http://www.tkk7.com/kuxiaoku/articles/94808.html">http://www.tkk7.com/kuxiaoku/articles/94808.html</a> <img src ="http://www.tkk7.com/kuxiaoku/aggbug/107848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:15 <a href="http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个魔术矩늚例子http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107849.html苦笑?/dc:creator>苦笑?/author>Thu, 18 Jan 2007 16:14:00 GMThttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107849.htmlhttp://www.tkk7.com/kuxiaoku/comments/107849.htmlhttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107849.html#Feedback0http://www.tkk7.com/kuxiaoku/comments/commentRss/107849.htmlhttp://www.tkk7.com/kuxiaoku/services/trackbacks/107849.html术矩阵是一个n*n的矩阵,其中N必须为奇敎ͼ然后?至n的^方的整数依照指定的规则放入矩阵,完成后矩늚各行各列以及对角U的元素值d均会相同?/p>

攄规则Q第一个整?一律被攄在第一行的中间位置Q第二个值得位置必须攄在第一个值得左上角,因此Q由1的位|往左一|再往上一|此时出数组的范_因此回到同一列的最下方?/p>

同样Q?必须攑֜2的左上角Q?攑֜3的左上角Q此时超出数l范围回到同一行的最双I格。同此规则,来到5的位|,当我们要填入6的时候,其位|? 已被数字1占据Q因此将其放|到5的下方,接下来的数字则依规则一一攄到合适的位置Q当填到15的时候,其左方与上方均没有位|,因此下一个数直接攄 ?5的下方,完成了填?6的|接下来的数目Q均可以依上q的规则填写完成?/p>

下面看看q个术矩阵的示例代码:

/*此类是主H口Q接受输入的奇数

MagicSquare.cs

*/

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace MagicSquare
{
 /// <summary>
 /// Form1 的摘要说明?br> /// </summary>
 public class MagicSquare : System.Windows.Forms.Form
 {
  /// <summary>
  /// 必需的设计器变量?br>  /// </summary>
  private System.ComponentModel.Container components = null;
  private System.Windows.Forms.Label lblNumber;
  private System.Windows.Forms.TextBox txbNumber;
  private System.Windows.Forms.Button btnOK;
  public int number=0;
  public MagicSquare()
  {
   //
   // Windows H体设计器支持所必需?br>   //
   InitializeComponent();

   //
   // TODO: ?InitializeComponent 调用后添加Q何构造函C?br>   //
  }

  /// <summary>
  /// 清理所有正在用的资源?br>  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows H体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary>
  private void InitializeComponent()
  {
   this.lblNumber = new System.Windows.Forms.Label();
   this.txbNumber = new System.Windows.Forms.TextBox();
   this.btnOK = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // lblNumber
   //
   this.lblNumber.Location = new System.Drawing.Point(48, 32);
   this.lblNumber.Name = "lblNumber";
   this.lblNumber.TabIndex = 0;
   this.lblNumber.Text = "误入奇敎ͼ";
   //
   // txbNumber
   //
   this.txbNumber.Location = new System.Drawing.Point(192, 32);
   this.txbNumber.Name = "txbNumber";
   this.txbNumber.TabIndex = 1;
   this.txbNumber.Text = "";
   //
   // btnOK
   //
   this.btnOK.Location = new System.Drawing.Point(144, 80);
   this.btnOK.Name = "btnOK";
   this.btnOK.TabIndex = 2;
   this.btnOK.Text = "OK";
   this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
   //
   // MagicSquare
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(432, 117);
   this.Controls.Add(this.btnOK);
   this.Controls.Add(this.txbNumber);
   this.Controls.Add(this.lblNumber);
   this.Name = "MagicSquare";
   this.Text = "MagicSquare";
   this.ResumeLayout(false);

  }
  #endregion

  /// <summary>
  /// 应用E序的主入口炏V?br>  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new MagicSquare());
  }

  private void btnOK_Click(object sender, System.EventArgs e)
  {
   number=Convert.ToInt32(txbNumber.Text.Trim());
   if(number%2==1)
   {
    this.Hide();
    ShowResult  result=new ShowResult(number);
    result.Show();
      
   }
   else
   {
    MessageBox.Show("您输入的不是奇数Q请重新输入奇数Q?,"输入错误");
   }
  }
 }
}

/*q个cȝ来处理魔术矩늚生成Q以及在H体上显C出?/p>

Show.cs

*/

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace MagicSquare
{
 /// <summary>
 /// Show 的摘要说明?br> /// </summary>
 public class ShowResult : System.Windows.Forms.Form
 {
  /// <summary>
  /// 必需的设计器变量?br>  /// </summary>
  private System.ComponentModel.Container components = null;
  private int n;
  private int[,] mm;
  public ShowResult ()
  {
   //
   // Windows H体设计器支持所必需?br>   //
   InitializeComponent();

   //
   // TODO: ?InitializeComponent 调用后添加Q何构造函C?br>   //
  }
  public ShowResult (int number)
  {
   n=number;
   mm=new int[n,n];
   AssignValue(n);   
  }
  /// <summary>
  /// 清理所有正在用的资源?br>  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if(components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
   Application.Exit();
  }

  #region Windows H体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方?- 不要使用代码~辑器修?br>  /// 此方法的内容?br>  /// </summary>
  private void InitializeComponent()
  {
   this.components = new System.ComponentModel.Container();
   this.Size = new System.Drawing.Size(300,300);
   this.Text = "ShowResult";
  }
  #endregion

  
  public void AssignValue(int n)
  {
   int assignValue=1;
   int p=n-1;
   int col=p/2;
   int row=0;
   //初始化数l?br>   for(int i=0;i<n;i++)
   {
    for(int j=0;j<n;j++)
    {
     mm[i,j]=0;
    }
   }
   mm[row,col]=assignValue;
   do
   {
    assignValue++;
    col--;
    row--;
    if(col<0&&row<0)
    {
     row+=2;
     col+=1;
    }
    else
    {
     if(col<0)
      col=p;
     if(row<0)
      row=p;
    }
    if(mm[row,col]!=0)
    {
     col+=1;
     row+=2;
    }
    mm[row,col]=assignValue;
   }while(assignValue<n*n);
  }

  protected override void OnPaint(PaintEventArgs e)
  {
   base.OnPaint (e);
   Graphics g=this.CreateGraphics();
   for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    {
     g.DrawString(mm[i,j].ToString(),new Font(FontFamily.GenericSansSerif.ToString(),15f),Brushes.YellowGreen,j*40+20,i*40+20);
    }
   g.Dispose();

  }

 }
}


文章来源:http://www.tkk7.com/kuxiaoku/articles/94805.html

]]>
Beginner with C#(来源csdn kamphkb ?Blog )http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107850.html苦笑?/dc:creator>苦笑?/author>Thu, 18 Jan 2007 16:14:00 GMThttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107850.htmlhttp://www.tkk7.com/kuxiaoku/comments/107850.htmlhttp://www.tkk7.com/kuxiaoku/archive/2007/01/19/107850.html#Feedback0http://www.tkk7.com/kuxiaoku/comments/commentRss/107850.htmlhttp://www.tkk7.com/kuxiaoku/services/trackbacks/107850.htmlc# 是一U简l,旉Q?Q,面向对象Qobject orientedQ,cd可靠Qtype-safeQ的
~程语言。它Q发韻IC sharpQ是从c/c++发展而来的(Q俺觉得更象是javaQ,和c/c++
是一个语pR所以,很容易被c/c++的程序员接受。c#的目标是l合Visual Basic的高产和
C++质朴的力量?

c#会是vs7的一分子。vs7q支持vb,vc和标记语a——VBScript和JScript。所有这些语a
都会在Next Generation Windows Services (NWGS) platform 中得到支持(c#需要一?
NWGS SDK包,可以在m$的网站上下蝲Q。有了这个东东(NWGSQ,c#׃需要自qcdQ?
而用vc或vbq样一些成熟的库。c#也确实没有自qcd?
废话完了?

1? 一个老土的例子(׃能换换吗Q)*/
/* idontlikeHelloworld.cs : such a out sample :( */
1: using System;
2: class idontlikeHelloworld
3: {
4: static void Main() {
5: Console.WriteLine("i dont like Hello world");
6: Console.ReadLine();
7: }
8: }
/* 如果Z的话Q会考虑换个好点的例子?^&^

先说说怎样q行。首先,你需要windows2000Q(是的Q就是它Q请各位不要随地丢果皮—?
整个香蕉丢给俺就可以了。)然后Q需要NWGS SDKQ(82.4mbQ不很大噢。嘿嘿,好在
它没有自qcd。)安装后,在你的程序所在的目录下键入:

csc idontlikeHelloworld.cs (加上一个回车键Q?

是不是有点复古的味道Q这个操作会在和你的*.cs相同目录下生一?
idontlikeHelloworld.exe文g。双dQ距可以看见Q?

i dont like Hello world

回R可以结束它Q非常简单。不q,也可以这P把它存成后缀?c的文件更?
Q即QidontlikeHelloworld.cQ。这样就可以用vc的IDEq行打字Q编辑。vc?
txt editor是最的噢(又要vcQNO!!!Q。然后:

csc idontlikeHelloworld.c (加上一个回车键Q?

最l效果是完全一L。好Q现在分析语法:Qc#在语法上完全没有新意 :-| Q?

1: using System;

using 其实是c++的关键字Q在c#中的含义也相仿(是说俺q不?00%肯定Q抱歉)。using
用在另一个关键字namespace之后。还是先看看namespace?
语法QsyntaxQ:Qfrom MSDNQ?

namespace [identifier] { namespace-body }

俺的理解Q?
identifierQ在q里是SystemQ请CQc#和c/c++一P是区分大写的!Q。System
            必须在用它的范围内是唯一的。即Q不能够有第二个SystemQ但可以有system?
            ?#8220;它的范围”Q俺不想详细解说Q只有在实践中才可能掌握。而且Q初学者根?
            不必知道Q俺也是q来才知道还有个namespace和using?Q)

在{ namespace-body }中的是真正有用的东东Q包括第五行?#8220;Console.WriteLine”的声明和
定义Q后面还会提刎ͼ。System是由NWGS定义的,׃只需用(usingQ它卛_。至于System?
什么文仉定义Q咱׃用管了!交给~译器(是刚才那个“csc.exe”Q去L。这׃?
了c/c++中的“Qi nclude”Q可以说是近了一步,避免大量烦h的细节。如果你没学qc/c++Q?
׃用理会。namespace 在后面还会谈到?

2: class idontlikeHelloworld

classQ是c语系中另一个关键字“c?#8221;。表CZpd的特性(官方说法Q属性)和行为方法,?
了它你的E序可?#8220;另类”Q创造与别不同的有你特色的东东噢Q在q里Q俺定义了
“idontlikeHelloworld”。注意:q也是c#强制的,对于每一个可执行的程序都必须有。你惛_
的事可以记录在紧跟着你定义的class后面的一对花括号。注意:“{”?#8220;}”一一对应的,
“(”?#8220;)”同样?

4: static void Main() {

Main()是本例子W一个动作(行ؓҎQ,q的W一件事。它是属于俺定义的idontlikeHelloworld
cȝҎ。ƈ且是c#强制的,是程序的真正开始!在紧跟在它后面的“{}”中的语句序Q就是程?
的运行顺序!本例中只有一行(W六行干嘛用Q你可以L再编译一ơ看看)Q输Z句话?

5: Console.WriteLine("i dont like Hello world");

非常奇怪,ConsoleQ再ơ提醒:注意大小写)不是俺定义的Q从何而来Q它其实是属于System
namespace 的一个class。WriteLine()是ConsolecM的一个方法,用来昄一句话Q字W串Q?
q里只是用了q个Ҏ?/18Qƈ且是最单之一Q其他的有机会再说。你也可以用
“Console.WriteLine”?#8220;NGWS SDK Documentaion”中搜?#8220;Console.WriteLine”Q记住复?
“仅搜索标?#8221;Q它会列?9V好啦,完了Q其实,q有“.”没说呢!呵呵...lei si la!!!!
Q箋前)
“.”被称为分隔符QseparatorQ,用来q接名字Q如上面?#8220;Console.WriteLine”Q就把类和它?
Ҏq接。通过q种方式Q咱们就可以使用现成Ҏ集合。这里再回顾一下俺的例子,看看namespace?
“.”是如何连用的Q还有ؓ什么要使用namespaceq个关键字。把例子E微改一下:*/
/* idontlikeHelloworld.cs */
1: //using System;
2: class idontlikeHelloworld
3: {
4: static void Main() {
5: System.Console.WriteLine("i dont like Hello world");
6: System.Console.ReadLine();
7: }
8: }

/* 看见了,当俺注销?#8220;using System;”后,在第五行和第六行加了“System”。程序的l果不会?
变。但是,很明昄q样比较|嗦Q所以引入了“namespace”。其实,class应该可以完成同样的功能?
不过Q设计者可能不惌一个关键字늛太多的功能。记得在c向c++发展的时候,引入?#8220;class”Q?
不是扩展“struct”关键字的功能Q又比如“=”只用于赋|“==”只用于判断相{。这是c/c++和c#
在语法上其中一个重要的特点。这栯计的好处很多。有Z再聊噢?
如果你没学过c/c++Q以下的内容可以跌。c#与c/c++在语法上q是有区别的Q比如:
1。c#Ҏ没有“::”Q?#8220;->”只在E序中很的片断中。在c#中应采用“.”?
2。c#无须先声明定义,再用。与java相同?
3。c#取消了用“Qi nclude”导入其他的程序文本文Ӟ而采用象征性的句柄引入他h的代码。这样一来,
   排除了~程语言间的障碍Q方便地使用其它语言~写的库。如“Console”cd以是c#或者是其他MU语a~写的?

1? 自动化的内存理QAutomatic memory managementQ?
手动理内存需要程序员自行分配和释攑ֆ存块。这要求E序员有清晰的头脑和Ҏ个运行过E有十分?
把握Q好难!Q。而c#把程序员从这难以承担的Q务中解放出来。在多数的情况下Q这U自动内存管理提
高代码的质量和程序员的生产力。ƈ且,不会对程序的意图和执行生幅面的影响Q?俺可不相信m$的鬼
话)。不q,估计比java的回收站好一点吧。因为c#出道q嘛Q尽胡扯Q。好了,来看看例子?/

using System;
public class Stack
{
  private Node first = null;
  public bool Empty {
    get {
          return (first == null);
        }
  }
  public object Pop() {
    if (first == null)
      throw new Exception("Can't Pop from an empty Stack.");
    else {
            object temp = first.Value;
            first = first.Next;
            return temp;
         }
  }
  public void Push(object o) {
    first = new Node(o, first);
  }
  class Node
  {
    public Node Next;
    public object Value;
    public Node(object value): this(value, null) {}
    public Node(object value, Node next) {
      Next = next;
      Value = value;
    }
  }
}

class Test
{
  static void Main() {
    Stack s = new Stack();
    for (int i = 0; i < 10; i++)
      s.Push(i);
    while (!s.Empty)
      Console.WriteLine(s.Pop());
  }
}
/*
stackcdC一pdNode的实例。大家可以看看stackcȝPushҎ。Node的实例就是在PushҎ中创建的?
是“first = new Node(o, first);”。请Cq个“new”噢。它是用来创徏cd例的。相关的语法?
多,遛到后面用一节详l讲。这里只是要了解自动内存理QAutomatic memory managementQ好处?Q?#8220;new”
是负责初始化cd例。而在c/c++中释放这些实例要用另一个关键字“delete”。但是在什么时候用delete呢,
q通常是很费神的活Q老手也会阴沟里翻舏V何冉|俺呢Q但在c#中有不用了。例子里没有用“delete”?
当Node的实例不需要时Q垃圾收集器Qgarbage collectorQ自动销毁它Q不用俺操心喽。这点到和java?
像的Q可能是抄的Q?

在一个testc里Q俺用了一个@环,对stackcȝ实例的PushҎ赋值十ơ。于是,Push创徏了Node的十个实
例(instanceQ。然后用Pop把它们显C出来。其序正好与创建的序相反?
q个例子相当的好Q是stack
的一个典型,也很好的表述了自动内存管理的机制。但也不好懂Q好在这一节不是写l毫无基的网友看的?
个都׃几分钟看明白Q各位大虾更是没问题?

其实Q当昄完了“10”以后Q就会有一个Node的实例符合被释放的条Ӟ但垃圾收集器q不一定会q样做?
也就是说Q它的行为ƈ不确定(q和java一P俺猜Q。有时候,q种行ؓ会带来一些负面媄响。v码是?
能降低。自动内存管理本w也是有问题的。因为它很难理一些特D情c有一些关于java的垃圾收集器?
文章也有提到。m$也不会好得了多少。所以,m$有个不安全代码的术语Qunsafe codeQ,用来为高U用h
务。即Q用户可以不采用垃圾攉器。但必须?#8220;unsafe”关键字显式声明之。这样就避免了用户不l意?
外用不安全代码。下面是一个例子:*/

using System;
class Test
{
  unsafe static void WriteLocations(byte[] arr) {
    fixed (byte *p_arr = arr) {
      byte *p_elem = p_arr;
      for (int i = 0; i < arr.Length; i++) {
        byte value = *p_elem;
        string addr = int.Format((int) p_elem, "X");
        Console.WriteLine("arr[{0}] at 0x{1} is {2}", i,  addr, value);
        p_elem++;
      }
    }
  }
  static void Main() {
    byte[] arr = new byte[] {1, 2, 3, 4, 5};
    WriteLocations(arr);
  }
}
/*
俺对q个例子不是很满意,也让俺有点迷惑,有机会再自己写一个。很单,只是可以用指针了Q万岁!
其实Q俺对这一节最没有把握了!有不地斚w不能自圆其说Q所以,请各位大虑֤力批评?/

1? cd 
c#支持两种基本的类型:一U是|value typesQ,一U是引用Qreference typesQ。值包括简单类?
Qchar、int、和floatQ,枚DQenumQ和l构QstructQ。引用包括类QclassQ,界面QinterfaceQ,
代表QdelegateQ和数组阵列QarrayQ。g引用不同之处在于Q值直接存储它的数据内容;而引用存储对?
的引用。是不是_费解?Q打个比方吧。你在某C了套别墅Q好噢Q。却从未去过Q只知道地址Q?
么办Q你可以坐出URQ司机看了地址q道怎样C用你操心。你手里的地址好像对象的名字Q你?
它写在程序中Q就好像把地址l了司机。司机就是你的编译器Q它知道该去哪。你豪华的房子就好比那个
NGWS SDK开发包Q?2mb噢,够豪华了Q俺的m?-pL喽)。房子里有你惌的东东,比如你想写一?
话(i dont like Hello worldQ,好像上面例子,要用?#8220;WriteLine”。于是,你就l出“WriteLine”
的地址Q比如:“Console.WriteLine”。明白?Q俺可篏了。zzz...  Q强打精)不知道你惛_没有Q?
值和引用的区别可以引Z个重要特性。值的变量和变量存储的数据是一一对应的,唯一性。而引用则?
然。引用中不同的变量可以引用同一个对象的实例。当其中一个变量改变实例的值时Q其他引用这个实例的
变量也会受到影响Q当Ӟ变量本nq没有改变,卻I地址没变Q。瞧Q变量只是说明存储对象的位置Q地
址Q,而不是对象本w。就好像你漂亮的房子被烧了,但你的地址q没有改变,但地址对应的房子就没了?
也许是别Z有这个地址Q他ȝ了你的房子!好了Q在l个例子Q?/

1: using System;
2: class CValue
3: {
4: public int Value = 0;
5: }
6: class Test
7: {
8: static void Main() {
9: int val1 = 0;
10: int val2 = val1;
11: val2 = 123;
12: CValue ref1 = new CValue();
13: CValue ref2 = ref1;
14: ref2.Value = 123;
15: Console.WriteLine("Values: {0}, {1}", val1, val2);
16: Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
17: }
18: }

/* 下面是输出的l果Q?
Values: 0, 123
Refs: 123, 123

啊哈Q应该粉清楚了吧。变量val1和变量val2互不影响,它们各自有自q存储I间。而ref2复制
了ref1Q所以,它们引用了同一个对象的实例。当改变它们其中一个的时候,׃影响到另一个的
倹{?
1? 数组cdQArray typesQ?

数组可以是一l的Q也可是多维的。数的成员可以是整齐的Q也可以是变长(jaggedQ的?

一l的数组是最普通,最单的。这里值给Z个例子,׃多解释了?/
using System;
class Test
{
 static void Main() {
  int[] arr = new int[5];
  for (int i = 0; i < arr.Length; i++)
   arr[i] = i * i;
  for (int i = 0; i < arr.Length; i++)
   Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
 }
}

/* l果如下Q?
arr[0] = 0
arr[1] = 1
arr[2] = 4
arr[3] = 9
arr[4] = 16

我们q可以比较的看看多维Q规则,变长的数l的定义和赋|*/
class Test
{
 static void Main() {
  int[] a1 = new int[] {1, 2, 3};                     //一l?
  int[,] a2 = new int[,] {{1, 2, 3}, {4, 5, 6}};      //二维
  int[,,] a3 = new int[10, 20, 30];                   //三维
  int[][] j2 = new int[3][];                          //变长
  j2[0] = new int[] {1, 2, 3};
  j2[1] = new int[] {1, 2, 3, 4, 5, 6};
  j2[2] = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
 }
}
/*
上面的例子给Z各种样式的数l。变量a1、a2和a3是规则数l。j2则是变长的数l?
规则数组很容易就可以计算出它们的长度。比如a3的长度是Q?0*20*30=6000。相反,变长
数组有点不同,它的每一个维度都必须单独定义。如j2的第一l度?Q第二个?Q第
三个?Q所以总长度是Q?*3+1*6+1*9=18?

上面Ҏl的赋值是严}的风|在某U情况下Q我们可以简化写法,但我总觉得这U简?
应用限制太多Q容易出错。在q里׃作介l了。这里再l一个例子说明函C的参数如?
赋?/
class Test
{
 static void F(long[] arr) {}
 static void Main() {
  F(new longt[] {1, 2, 3});
 }
}
赶出一~!h正! 
1? l一pȝcdQType system unificationQ?
c#独创了一U类型——统一pȝcdQؓ了这个篏刑,我头疼死了。谁有更好的名字Q请务必告诉
我)。MQ所有的其他cdQ包括值和引用Q都可以被当作统一pȝcd来对待。从概念上说Q?
所有的cd都从它派生。这P其他的类型就可以使用l一pȝcd的属性和Ҏ。包括一?#8220;
?#8221;cdQ如Qint。还是给个例子吧Q?/
using System;
class Test
{
  static void Main() {
    Console.WriteLine(3.ToString());
  }
}
/*“3.ToString()”调用了object?#8220;ToString()”Ҏ。相信学qc/c++的朋友都知道要输Z?
数字有多ȝQ现在就省事了。再看一个:*/
class Test
{
  static void Main() {
    int i = 123;
    object o = i;    // boxing
    int j = (int) o;  // unboxing
  }
}
/* q个像帽子戏法的例子中,?#8220;int”转换?#8220;object”Q又转换回来。这样一来,在值和引用
之间架起了一座桥梁。这h什么用呢。即兴D一个常见的例子...min把。在c/c++中:*/
// c/c++ code

void min(int i, int j)
{
  return ((i < j) ? i : j);
}

/* 如果比较的不是intQ或者说可能是intQ也可能是float、double呢?可以q样Q?/

template<class T>
T min (T i, T j)
{
  return ((i < j) ? i : j)
}

/* 用c#可以Q?/
void swap (object a, object b)
{
  return ((i < j) ? i : j);
}

/* 我想大家一定看出来W二个例子要比较一个int和一个float的话Q还需要一些{换,而第三个
例子可以比较所有的变量Q这个灵zd直太大了。所以,我私以ؓQ大家用时一定要心Q?
它在比较一个int和一个class的时候决不会报错的。呵呵,我发现我的翻译L跑远QL
扣不住原文。篡改甚多,敬请原谅Q?/span>
 
1? 语句QStatementsQ?

c#借用了c/c++大多数的语句ҎQ不q仍然有些值得注意的地斏V还有些地方是有所改动的?
在这里,我只提一些c#Ҏ的东东?

1??0 “foreach”语句
“foreach”语句列D一个集合内的所有元素,q对q些元素执行一pd的操作。还是看看例子吧Q?/

using System;
using System.Collections;
class Test
{
  static void WriteList(ArrayList list) {
    foreach (object o in list)
    {
      int i = (int) o;//如果是for语句Q这里一定会报错Q?
      Console.WriteLine(0);
      Console.WriteLine(++i);
    }
  }
  static void Main() {
    ArrayList list = new ArrayList();
    for (int i = 0; i < 10; i++)
      list.Add(i);
    WriteList(list);
  }
}
/*q个例子?#8220;foreach”扫描了整?#8220;list”Qƈ?#8220;list”中所有的元素打印出来。有时候还?
挺方便的?

1??5 安全查开养IThe checked and unchecked statementsQ?
“checked”?#8220;unchecked”语句用来控制数学q算和完整类型{换的查工作?#8220;checked”查它
作用的域中可能出现的q例Qƈ抛出一个异常;?#8220;unchecked”则阻止所有的查。D个例子:*/

using System;
class Test
{
   static int x = 1000000;
   static int y = 1000000;
   static int F() {
      checked {return (x * y);}     // 抛出 OverflowException
   }
   static int G() {
      unchecked {return (x * y);}   // q回 -727379968
   }
   static int H() {
      return x * y;              // ~省状态?
   }
   static void Main() {
     F();                        //可以注销掉此行试试?
     Console.WriteLine(G());
     Console.WriteLine(H());
   }
}

/*
在编译过E中不会有Q何错误出现。因?#8220;checked”?#8220;unchecked”只在q行时才起作用。值得一说的?
H()。它的缺省状态和~译器当前的~省溢出查的状态有兟뀂但q回的结果肯定和F()或G()中的M个相同?
再看一个例子:*/

using System;
class Test
{
   const int x = 1000000;
   const int y = 1000000;
   static int F() {
      checked {return (x * y);}    // ~译器警告(Compile warningQ:溢出QoverflowQ?
   }
   static int G() {
      unchecked {return (x * y);}  // q回 -727379968
   }
   static int H() {
      return x * y;                // ~译器警告(Compile warningQ:溢出QoverflowQ?
   }
   static void Main() {
     Console.WriteLine(F());       //可以注销掉此行试试?
     Console.WriteLine(G());
     Console.WriteLine(H());       //可以注销掉此行试试?
   }
}

/* 当F()和H()求值的时候,׃引v一个编译警告。而在G()中,因ؓ有了“unchecked”Q屏蔽了q个?
告。要注意的是“checked”?#8220;unchecked”都不能对函数的返回D行操作!比如Q?/
class Test
{
   static int Multiply(int x, int y) {
      return x * y;
   }
   static int F() {
      checked{ return Multiply(1000000, 1000000); } // ?return Multiply(1000000, 1000000);
   }                                                // 有相同的效果?
}
/* 其实大家E微想一下知道ؓ什么m$没有q么做!对这个内容的讨论出本文的范围和俺的能力之外哦?

在c#中,所有的十六q制数都是uint。如果用强制cd转换会引L译器报错。用“unchecked”则可?
跌q个机制Q把uint的十六进制数转化为int。如Q?/

class Test
{
   public const int AllBits = unchecked((int)0xFFFFFFFF);
   public const int HighBit = unchecked((int)0x80000000);
}

/* 上例所有的常数都是uintQ而且过了int的范_没有“unchecked”Q这U{换会引发一个编译器?
误。注意:上面用的?#8220;unchecked”操作W。不是语句。不q它们之间除了一个用“()”Q另一个用
“{}”以外Q几乎一栗BTWQ?#8220;checked”同样?

1??6 “lock”语句QThe lock statementQ?
“lock”获得一个相互排斥的对象锁定。(俺查q一些资料,但都没有清晰说明Q暂不介l)



文章来源:http://www.tkk7.com/kuxiaoku/articles/94806.html

]]>
C#实时甌技术(作者: crystal~译 出处Q?yeskyQ?/title><link>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107851.html</link><dc:creator>苦笑?/dc:creator><author>苦笑?/author><pubDate>Thu, 18 Jan 2007 16:13:00 GMT</pubDate><guid>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107851.html</guid><wfw:comment>http://www.tkk7.com/kuxiaoku/comments/107851.html</wfw:comment><comments>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kuxiaoku/comments/commentRss/107851.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kuxiaoku/services/trackbacks/107851.html</trackback:ping><description><![CDATA[ <a class="bluekey" target="_blank"> <font size="1">Real</font> </a> <font size="1"> time Application 实时甌技术在本文里是作ؓ一个实例来演示在用PTcpclientQ申请与服务器(TcpServerQ申请之间用Socketcȝ情况 。该目同样也演C在实时目中如何用listview控制以及如何传递XML格式信息?<br><br>  TcpServer.exe 文g昄了在单独的thread当中Q而不是在</font> <a class="bluekey" target="_blank"> <font size="1">GUI</font> </a> <font size="1"> U程之中QTCP socket的相互通讯?br><br>  TcpClient.exe文g同样也用一条单独的U程 从Socket中读取数据,然后对表单中的list </font> <a class="bluekey" target="_blank"> <font size="1">view</font> </a> <font size="1">控gq行更新?br><br>  步聚如下Q?br><br>  1QTcpServer 监听端口8002Qƈ且发线E等待客Lq结?br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td height="504"> <p> <font size="1">Hashtable socketHolder = new Hashtable(); <br><br>Hashtable threadHolder = new Hashtable();<br><br>public Form1() <br><br>{ <br><br> // Required for Windows Form Designer support <br><br> // <br><br> InitializeComponent(); <br><br> tcpLsn = new TcpListener(8002); <br><br> tcpLsn.Start(); <br><br> // tcpLsn.LocalEndpoint may have a bug, it only show 0.0.0.0:8002 <br><br> stpanel.Text = "Listen at: " + tcpLsn.LocalEndpoint.</font> <a class="bluekey" target="_blank"> <font size="1">ToString</font> </a> <font size="1">(); <br><br> Thread tcpThd = new Thread(new ThreadStart(WaitingForClient)); <br><br> threadHolder.</font> <a class="bluekey" target="_blank"> <font size="1">Add</font> </a> <font size="1">(connectId, tcpThd); <br><br> tcpThd.Start() ; <br><br>} </font> </p> <p> </p> <p> <font size="1"> 2. TcpClient与TcpSrvq接上后Q发送客L信息数据包至TcpServerQ然后发线E,该线E是用来接收通过Socket传来的数据?br><br></font> </p> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td> <font size="1">private void menuConn_Click(object sender, System.EventArgs e) <br><br>{ <br> ConnectDlg myDlg = new ConnectDlg(); <br><br> myDlg.ShowDialog(this); <br><br> if( myDlg.DialogResult==DialogResult.OK) <br><br> { <br><br>  s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp ); <br><br>  IPAddress hostadd = IPAddress.Parse(myDlg.IpAdd); <br><br>  int port=Int32.Parse(myDlg.PortNum); <br><br>  IPEndPoint EPhost = new IPEndPoint(hostadd, port); <br><br>  Try <br><br>  { <br><br>   s.Connect(EPhost); <br><br>   if (s.Connected) <br><br>   { <br><br>    Byte[] bBuf; <br><br>    string buf; <br><br>    buf = String.Format("{0}:{1}", myDlg.UserName,myDlg.PassWord); <br><br>    bBuf=ASCII.GetBytes(buf); <br><br>    s.Send(bBuf, 0 , bBuf.Length,0); <br><br>    t = new Thread(new ThreadStart(StartRecieve)); <br><br>    t.Start(); <br><br>    sbar.Text="Ready to recieve data"; <br><br>   } <br><br>  } <br><br>  catch (Exception e1) <br><br>  { <br><br>   MessageBox.Show(e1.ToString()); <br><br>  } <br><br> } <br><br>} <br><br>private void StartRecieve() <br><br>{ <br><br> miv = new MethodInvoker(this.UpdateListView); <br><br> int cnt=0; <br><br> string tmp=null; <br><br> Byte[] firstb= new Byte[1]; <br><br> while (true) <br><br> { <br><br>  try <br><br>  { <br><br>   Byte[] receive = new Byte[1]; <br><br>   int ret = s.Receive(receive, 1, 0); <br><br>   if (ret > 0) <br><br>   { <br><br>    switch(receive[0]) <br><br>    { <br><br>     case 11: //check start message <br><br>       cnt=0; <br><br>       break; <br><br>     case 10: // check end message <br><br>       cnt=0; <br><br>       if(firstb[0] == ':') <br><br>        HandleCommand(tmp); <br><br>       else if(firstb[0] == '<') <br><br>        HandleXml(tmp); <br><br>       else <br><br>        HandleText(tmp); <br><br>        tmp=null; <br><br>        break; <br><br>       default: <br><br>        if (cnt == 0) <br><br>         firstb[0] = receive[0]; <br><br>         tmp += System.Text.Encoding <br><br>         .ASCII.GetString(receive);<br><br>         cnt++; <br><br>         break; <br><br>        } <br><br>       } <br><br>    } <br><br>    catch (Exception e) <br><br>    { <br><br>     if( !s.Connected ) <br><br>      { <br><br>       break; <br><br>      } <br><br>     } <br><br>   } <br><br>   t.Abort(); <br><br>  } </font> </td> </tr> </tbody> </table> <p> </p> <p> </p> <p> <font size="1"> 3.TcpServer接收来自TcpClient的连接请求,q且socket 实例保存到Hash表中Q然后发线E以便控制socket的通讯Q同时将客户端信息在listview 控g中显C出来?br><br></font> </p> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td height="3552"> <p> <font size="1">public void WaitingForClient() <br><br>{ <br><br> while(true) <br><br> { <br><br>  // Accept will block until someone connects <br><br>  Socket sckt = tcpLsn.AcceptSocket(); <br><br>  if (connectId < 10000) <br><br>   Interlocked.Increment(ref connectId); <br><br>  Else <br><br>   connectId = 1; <br><br>   if (socketHolder.Count < MaxConnected ) <br> <br>   { <br><br>    while (socketHolder.Contains(connectId) ) <br><br>    { <br><br>     Interlocked.Increment(ref connectId); <br><br>    } <br><br>   Thread td = new Thread(new ThreadStart(ReadSocket)); <br><br>   lock(this) <br><br>   { <br><br>    // it is used to keep connected Sockets <br><br>    socketHolder.Add(connectId, sckt); <br><br>    // it is used to keep the active thread <br><br>    threadHolder.Add(connectId, td); <br><br>   } <br><br>   td.Start(); <br><br>  } <br><br> } <br><br>} <br><br>// follow function handle the communication from the clients and close the <br><br>// socket and the thread when the socket connection is down <br><br>public void ReadSocket() <br><br>{ <br><br> // the connectId is keeping changed with new connection added. it can't <br><br> // be used to keep the real connectId, the local variable realId will <br><br> // keep the value when the thread started. <br><br> long realId = connectId; <br><br> int ind=-1; <br><br> Socket s = (Socket)socketHolder[realId]; <br><br> while (true) <br><br> { <br><br>  if(s.Connected) <br><br>  { <br><br>   Byte[] receive = new Byte[37] ; <br><br>   Try <br><br>   { <br><br>    // Receive will block until data coming <br><br>    // ret is 0 or Exception happen when Socket connection<br><br>    // is broken <br><br>    int ret=s.Receive(receive,receive.Length,0); <br><br>    if (ret > 0) <br><br>    { <br><br>     string tmp = null; <br><br>     tmp=System.Text.Encoding.ASCII.GetString(receive);<br><br>     if(tmp.Length > 0) <br><br>     { <br><br>      DateTime now1=DateTime.Now; <br><br>      String strDate; <br><br>      strDate = now1.ToShortDateString() + " " + now1.ToLongTimeString(); <br><br>      ListViewItem newItem = new ListViewItem();<br><br>      string[] strArry=tmp.Split(':'); <br><br>      int code = checkUserInfo(strArry[0]); <br><br>      if(code==2) <br><br>      { <br><br>       userHolder.Add(realId, strArry[0]); <br><br>       newItem.SubItems.Add(strArry[0]); <br><br>       newItem.ImageIndex = 0; <br><br>       newItem.SubItems.Add(strDate); <br><br>       this.listView2.Items.Add(newItem); <br><br>       ind=this.listView2.Items.IndexOf(newItem);<br><br>      } <br><br>      else if( code==1) <br><br>     } <br><br>   } <br><br>   else <br><br>   { <br><br>    this.listView2.Items[ind].ImageIndex=1; <br><br>    keepUser=false; <br><br>    break; <br><br>   } <br><br>  } <br><br>  catch (Exception e) <br><br>  { <br><br>   if( !s.Connected ) <br><br>   { <br><br>    this.listView2.Items[ind].ImageIndex=1; <br><br>    keepUser=false; <br><br>    break; <br><br>   } <br><br>  } <br><br> } <br><br> } <br> <br> CloseTheThread(realId); <br><br>} <br><br>private void CloseTheThread(long realId) <br><br>{ <br><br> socketHolder.Remove(realId); <br><br> if(!keepUser) userHolder.Remove(realId); <br><br>  lock(this) <br><br>  { <br><br>   Thread thd = (Thread)threadHolder[realId]; <br><br>   threadHolder.Remove(realId); <br><br>  } <br><br>  thd.Abort(); <br><br> }</font> </p> <p> </p> <p> </p> <p> <font size="1">4. 点击Load Data菜单Q从文g中蝲入信息,然后把所有信息传送到每个与TcpServer相连接的客户端,客户端会自己更新它的listview。不是 TcpServer q是 TcpClient Q它们都从运作中的线E之中获取数据,再在ȝE中更新Listview control。下面则讲述的是通过MethodInvoker实现该功能?br><br></font> </p> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td> <font size="1">public void LoadThread() <br><br>{ <br><br>MethodInvoker mi = new MethodInvoker(this.UpdateListView); <br><br>string tmp = null; <br><br>StreamReader sr = File.OpenText("Issue.txt"); <br><br>while((tmp = sr.ReadLine()) !=null ) <br><br>{ <br><br>if (tmp =="") <br><br>break; <br><br><br><br>isu.symbol= Mid(tmp, 0, 4); <br><br>isu.bid = Mid(tmp, 4, 5); <br><br>isu.offer = Mid(tmp, 9, 5); <br><br>isu.volume = Mid(tmp, 16, tmp.Length-16); <br><br><br><br>sendMsg ="\v" + tmp + "\n"; //add send message's head and end char<br><br>SendDataToAllClient(tmp); <br><br>this.BeginInvoke(mi); <br><br><br><br>JobDone.WaitOne(); <br><br>} <br><br>sr.Close(); <br><br>fThd.Abort(); <br><br>} <br><br>private void SendDataToAllClient(string str) <br><br>{ <br><br>foreach (Socket s in socketHolder.Values) <br><br>{ <br><br>if(s.Connected) <br><br>{ <br><br>Byte[] byteDateLine=ASCII.GetBytes(str.ToCharArray()); <br><br>s.Send(byteDateLine, byteDateLine.Length, 0); <br><br>} <br><br>} <br><br>} </font> </td> </tr> </tbody> </table> <br> <font size="1">  以下代码 操纵XML文gQƈ且ؓ客户端生成XML文g?br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td> <font size="1">public void LoadXmlThread() <br><br>{ <br><br>MethodInvoker miv = new MethodInvoker(this.UpdateListView); <br><br>string tmp = null; <br><br>string xmlString = null; <br><br><br><br>int recordFlg = -1; <br><br>int textCount =0; <br><br>xmlString = "\v"+""; <br><br><br><br>XmlTextReader tr = new XmlTextReader("issue.xml"); <br><br>while(tr.Read()) <br><br>{ <br><br>switch (tr.NodeType) <br><br>{ <br><br>case XmlNodeType.Element: <br><br>if (tr.Name == "Issue") <br><br>{ <br><br>recordFlg++; <br><br>if(recordFlg > 0) <br><br>{ <br><br>textCount=0; <br><br>xmlString += CreateXmlElement(<br><br>tr.Name, 2); <br><br>xmlString += "\n"; <br><br>SendDataToAllClient(xmlString);<br><br>xmlString = "\v"+" <br>version='1.0'?>"; <br><br><br><br>this.BeginInvoke(miv); <br><br>JobDone.WaitOne(); <br><br>} <br><br>} <br><br>if (recordFlg >= 0) <br><br>{ <br><br>xmlString += CreateXmlElement( <br><br>tr.Name, 1);<br><br>tmp = tr.Name; <br><br>} <br><br><br><br>break; <br><br>case XmlNodeType.Text: <br><br>switch(++textCount) <br><br>{ <br><br>case 1: <br><br>isu.symbol=tr.Value; <br><br>break; <br><br>case 2: <br><br>isu.bid=tr.Value; <br><br>break; <br><br>case 3: <br><br>isu.offer=tr.Value; <br><br>break; <br><br>case 4: <br><br>isu.volume=tr.Value; <br><br>break; <br><br>} <br><br>xmlString += tr.Value; <br><br>xmlString += CreateXmlElement(tmp, 2); <br><br>break; <br><br>} <br><br>} <br><br>fThd.Abort(); <br><br>} <br><br>string CreateXmlElement(string elem, int ord) <br><br>{ <br><br>string tmp = null; <br><br>if (ord == 1) <br><br>tmp = String.Format("<{0}>", elem); <br><br>else <br><br>tmp = String.Format("", elem); <br><br><br><br>return tmp; <br><br>} <br><br><br>以下功能演示的是如何讄TcpClient中Listview控g?BackColor?Forecolor属??br>private void UpdateListView() <br><br>{ <br><br>int ind=-1; <br><br>for (int i=0; i < this.listView1.Items.Count;i++) <br><br>{ <br><br>if (this.listView1.Items[i].Text == isu.symbol.ToString()) <br><br>{ <br><br>ind=i; <br><br>break; <br><br>} <br><br>} <br><br>if (ind == -1) <br><br>{ <br><br>ListViewItem newItem new ListViewItem(isu.symbol.ToString()); <br><br>newItem.SubItems.Add(isu.bid); <br><br>newItem.SubItems.Add(isu.offer); <br><br>newItem.SubItems.Add(isu.volume); <br><br><br><br>this.listView1.Items.Add(newItem); <br><br>int i=this.listView1.Items.IndexOf(newItem); <br><br>setRowColor(i, System.Drawing.Color.FromA#ffffaf); <br><br>setColColorHL(i, 0, System.Drawing.Color.FromA#800000); <br><br>setColColorHL(i, 1, System.Drawing.Color.FromA#800000); <br><br>this.listView1.Update(); <br><br>Thread.Sleep(300); <br><br>setColColor(i, 0, System.Drawing.Color.FromA#ffffaf); <br><br>setColColor(i, 1, System.Drawing.Color.FromA#ffffaf); <br><br>} <br><br>else <br><br>{ <br><br>this.listView1.Items[ind].Text = isu.symbol.ToString(); <br><br>this.listView1.Items[ind].SubItems[1].Text = (isu.bid); <br><br>this.listView1.Items[ind].SubItems[2].Text = (isu.offer); <br><br>this.listView1.Items[ind].SubItems[3].Text = (isu.volume); <br><br>setColColorHL(ind, 0, System.Drawing.Color.FromA#800000); <br><br>setColColorHL(ind, 1, System.Drawing.Color.FromA#800000); <br><br>this.listView1.Update(); <br><br>Thread.Sleep(300); <br><br>setColColor(ind, 0, System.Drawing.Color.FromA#ffffaf); <br><br>setColColor(ind, 1, System.Drawing.Color.FromA#ffffaf); <br><br>} <br><br>JobDone.Set(); <br><br>} <br><br><br><br>private void setRowColor(int rowNum, Color colr ) <br><br>{ <br><br>for (int i=0; i < this.listView1.Items[rowNum].SubItems.Count;i++) <br><br>if (rowNum%2 !=0) <br><br>this.listView1.Items[rowNum].SubItems[i].BackColor = colr; <br><br>} <br><br><br><br>private void setColColor(int rowNum, int colNum, Color colr ) <br><br>{ <br><br>if (rowNum%2 !=0) <br><br>this.listView1.Items[rowNum].SubItems[colNum].BackColor=colr; <br><br>else <br><br>this.listView1.Items[rowNum].SubItems[colNum].BackColor = <br><br>System.Drawing.Color.FromA#f8f8f8; <br><br>if (colNum==0) <br><br>{ <br><br>this.listView1.Items[rowNum].SubItems[colNum].ForeColor = <br><br>System.Drawing.Color.FromA#800040; <br><br>this.listView1.Items[rowNum].SubItems[colNum].BackColor = <br><br>System.Drawing.Color.FromA#c5c5b6; <br><br>} <br><br>else <br><br>this.listView1.Items[rowNum].SubItems[colNum].ForeColor = <br><br>System.Drawing.Color.FromA#141414; <br><br>} <br><br><br><br>private void setColColorHL(int rowNum, int colNum, Color colr ) <br><br>{ <br><br>this.listView1.Items[rowNum].SubItems[colNum].BackColor = colr; <br><br>this.listView1.Items[rowNum].SubItems[colNum].ForeColor = <br><br>System.Drawing.Color.FromA#ffffff; <br><br>} </font> </td> </tr> </tbody> </table> <br> <font size="1">  q行该例子的步骤<br><br>  1. 在AZq行TcpServer.exe文g?br><br>  2. 在A机或BZq行一ơ或多次TcpClient.exe文g?br><br>  3. 在TcpClient端,点击菜单q接Q进入TcpServer正在q行中的服务器端。在~辑栏键入用户名及口令,点击认?br><br>  4. 当在TcpServer剙的istview上瞧见客L的提C时Q则在TcpServer,上点击Load Data菜单Q然后实时数据则会出现在TcpServer 和TcpClien上?br><br>  注意Q请认Data file, Issue.txt and Issue.xml{文件L处于同一根目录下Q正如TcpSvr.exe ?MaskedTextBox.dllQ?WTcpClient.exe.是处于同一目录下一栗?br><br>  Update at 10/20/2001. <br><br>  当添?删除目Ӟ请锁住Hash表,q样可以保U程的安全?br><br>  d功能Q以便生成和处理XML格式文g?br><br>  在发送讯息至客户端时Q请在服务器端添加发送讯息v始和l尾的字W?br><br>  上述Ҏ可以增加客户端的E_性?/font> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src="http://www.tkk7.com/kuxiaoku/aggbug/94803.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:13 <a href="http://www.tkk7.com/kuxiaoku/articles/94803.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div> <br>文章来源:<a href="http://www.tkk7.com/kuxiaoku/articles/94803.html">http://www.tkk7.com/kuxiaoku/articles/94803.html</a> <img src ="http://www.tkk7.com/kuxiaoku/aggbug/107851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:13 <a href="http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#Q消息队列应用程序〔作者: Carl Nolan 出处Q?microsoft?/title><link>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107852.html</link><dc:creator>苦笑?/dc:creator><author>苦笑?/author><pubDate>Thu, 18 Jan 2007 16:13:00 GMT</pubDate><guid>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107852.html</guid><wfw:comment>http://www.tkk7.com/kuxiaoku/comments/107852.html</wfw:comment><comments>http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kuxiaoku/comments/commentRss/107852.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kuxiaoku/services/trackbacks/107852.html</trackback:ping><description><![CDATA[ <span id="fxv7b3z" class="f14"> <font size="3"> <strong><font color="#ac0000">?/font></strong><br><br> Microsoft q期推出了一U用于生成集成应用程序的新^台——Microsoft .NET 框架?NET 框架允许开发h员用Q何编E语aq速生成和部v Web 服务和应用程序。Microsoft Intermediate Language (MSIL) 和实?(JIT) ~译器ɘq种不依赖语a的框架得以实现?<br><br>  ?.NET 框架同时面世的还有一U新的编E语a C#Q读?#8220;C sharp”Q。C# 是一U简单、新颖、面向对象和cd安全的编E语a。利?.NET 框架?C#Q除 Microsoft? Visual Basic? ?Managed C++ 之外Q,用户可以~写功能强大? Microsoft Windows? ?Web 应用E序及服务。本文提供了q样的一个解x案,它的重点?.NET 框架?C# 而不是编E语a。C# 语言的介l可以在“ C# 介和概述Q英文)”扑ֈ?br><br>  q期的文?#8220;MSMQQ可伸羃、高可用性的负蝲q? x案(英文Q?#8221;介绍了一U解x案,用于高可用性消息队?(MSMQ) 的可伸羃负蝲q解决Ҏ体系l构。此解决Ҏ中涉及了一U将 Windows 服务用作消息路由器的开发方案。这L解决Ҏ以前只有 Microsoft Visual C++? E序员才能实玎ͼ? .NET 框架的出现改变了q种情况。从下面的解x案中Q您可以看到q一炏V?br><br>  .NET 框架应用E序<br><br>  q里介绍 的解x案是一U用来处理若q消息队列的 Windows 服务Q其中每个队列都是由多个U程q行处理Q接收和处理消息Q。处理程序用@环法技术或应用E序特定|消息 AppSpecific 属性)从目的队列列表中路由消息Qƈ使用消息属性来调用lgҎ。(CZq程也属于这U情c)在后一U情况下Q组件的要求是它能够实现l定的接? IWebMessage。要处理错误Q应用程序需要将不能处理的消息发送到错误队列中?br><br>  消息应用E序的结构与以前的活动模板库 (ATL) 应用E序怼Q它们之间的主要不同在于用于理服务的代码的装?.NET 框架lg的用。要创徏 Windows 服务Q?NET 框架用户仅仅需要创Z个从 ServiceBaseQ来?System.ServiceControl E序集)l承的类。这毫不奇怪,因ؓ .NET 框架是面向对象的?/font> <br> <font size="3"> <strong><font color="#ac0000">应用E序l构</font></strong><br><br> 应用E序中主要的cL ServiceControlQ它是从 ServiceBase l承的。因而,它必d?OnStart ? OnStop ҎQ以及可选的 OnPause ?OnContinue Ҏ。事实上Q类是在静态方?Main 内构造的Q?br><br></font> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr bgcolor="#ffffff"> <td>using System;<br>using System.ServiceProcess;<br><br>public class ServiceControl: ServiceBase<br>{<br> // 创徏服务对象的主入口?br> public static void Main()<br> {<br>  ServiceBase.Run(new ServiceControl());<br> }<br><br> // 定义服务参数的构造对?br> public ServiceControl()<br> {<br>  CanPauseAndContinue = true;<br>  ServiceName = "MSDNMessageService";<br>  AutoLog = false;<br> }<br><br> protected override void OnStart(string[] args) {...}<br> protected override void OnStop() {...}<br> protected override void OnPause() {...}<br> protected override void OnContinue() {...}<br>}</td> </tr> </tbody> </table> <br> ServiceControl cdZpd CWorker 对象Q即Qؓ需要处理的每个消息队列创徏 CWorker cȝ一个实例。根据定义中处理队列所需的线E数目,CWorker cMơ创Z一pd?CWorkerThread 对象。CWorkerThread cd建的一个处理线E将执行实际的服务工作?br><br>  使用 CWorker ?CWorkerThread cȝ主要目的是确认服务控?Start、Stop、Pause ?Continue 命o。因些进E必L无阻塞的Q命令操作最l将在后台处理线E上执行?br><br> CWorkerThread 是一个抽象类Q被 CWorkerThreadAppSpecific 、CWorkerThreadRoundRobin ?CWorkerThreadAssembly l承。这些类以不同的方式处理消息。前两个c通过l另一队列发送消息来处理消息Q其不同之处在于定接收队列路径的方式)Q最后一个类则用消息属性来? 用组件方法?<br><br>  .NET 框架内部的错误处理是以基c?Exception 为基的。当pȝ引发或捕获错误时Q这些错误必L?Exception 中导出的cRCWorkerThreadException cd是这样一U实玎ͼ它通过附加额外属性(用于定义服务是否应l运行)来扩展基cR?br><br>  最后,应用E序包含两种l构。这些值类型定义了辅助q程或线E的q行时参敎ͼ以简?CWorker ?CWorkerThread 对象的结构。用值类型结构(而不是引用类型类Q能够确保这些运行时参数l护的是数|而不是引用)?br><font size="3"> <strong><font color="#ac0000">IWebMessage 接口</font></strong><br><br>  CWorkerThread 的实C一是一个调用组件方法的cR这个名?CWorkerThreadAssembly 的类使用 IWebMessage 接口来定义服务和lg之间的约定?br><br>  与当前版本的 Microsoft Visual Studio? 不同QC# 接口可以在Q何语a中显式定义,而不需要创建和~译 IDL 文g。C# IWebMessage 接口的定义如下:<br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>public interface IWebMessage<br>{<br> WebMessageReturn Process(string sMessageLabel, string sMessageBody, int iAppSpecific);<br> void Release();<br>}</td> </tr> </tbody> </table> <br>  ATL 代码中的 Process Ҏ是ؓ处理消息而指定的。Process Ҏ的返回代码定义ؓ枚Dcd WebMessageReturnQ?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>public enum WebMessageReturn <br>{<br> ReturnGood,<br> ReturnBad,<br> ReturnAbort<br>}</td> </tr> </tbody> </table> <br><br> 枚D的定义如下:Good 表示l箋处理QBad 表示消息写入错误队列,Abort 表示l止处理。Release Ҏ为服务提供了L清除cd例的途径。因Z在垃圑֛收的q程中才调用cd例的析构函数Q所以确保所有占用昂贵资源(例如数据库连接)的类都有一个能? 在析构之前被调用的方法,用来释放q些资源Q这是一U非常好的构思?br><br>  <strong><font color="#ac0000">名称I间</font></strong><br><br> 在这里先单介l一下名U空间。名U空间允许在内部和外部表CZ应用程序组l成为逻辑元素。服务内的所有代码都包含? MSDNMessageService.Service 名称I间内。尽服务代码包含在若干文g中,但是׃它们包含在同一名称I间中,因此用户不需要引用其他文件?br><br>  ׃ IWebMessage 接口包含?MSDNMessageService.Interface 名称I间中,因此使用此接口的U程cd有一个接口名U空间?br><br>  <strong><font color="#ac0000">服务c?/font></strong><br><br>  应用E序的目的是监视和处理消息队列,每一队列在收到消息时都执行不同的q程。应用程序是作ؓ Windows 服务来实现的?br><font size="3"><strong><font color="#ac0000"> ServiceBase c?br><br></font></strong> 如前所qͼ服务的基本结构是?ServiceBase l承的类。重要的Ҏ包括 OnStart、OnStop、OnPause ? OnContinueQ每一个替代方法都与一个服务控制操作直接对应。OnStart Ҏ的目的是创徏 CWorker 对象Q?CWorker cd创徏 CWorkerThread 对象Q然后在该对象中创徏执行服务工作的线E?br><br>  服务的运行时配置Q以?CWorker ?CWorkerThread 对象的属性)是在Z XML 的配|文件中l护的。它的名UC创徏?.exe 文g相同Q但带有一?.cfg 后缀。配|示例如下:<br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>Q?xml version="1.0"?Q?br>QconfigurationQ?br>QProcessListQ?br> QProcessDefinition<br>    ProcessName="Worker1"<br>    ProcessDesc="Message Worker with 2 Threads"<br>    ProcessType="AppSpecific"<br>    ProcessThreads="2"<br>    InputQueue=".\private$\test_load1"<br>    ErrorQueue=".\private$\test_error"Q?br>  QOutputListQ?br>   QOutputDefinition OutputName=".\private$\test_out11" /Q?br>   QOutputDefinition OutputName=".\private$\test_out12" /Q?br>  Q?OutputListQ?br> Q?ProcessDefinitionQ?br> QProcessDefinition<br>    ProcessName="Worker2"<br>    ProcessDesc="Assembly Worker with 1 Thread"<br>    ProcessType="Assembly"<br>    ProcessThreads="1"<br>    InputQueue=".\private$\test_load2"<br>    ErrorQueue=".\private$\test_error"Q?br>  QOutputListQ?br>   QOutputDefinition OutputName="C:\MSDNMessageService\MessageExample.dll" /Q?br>   QOutputDefinition OutputName="MSDNMessageService.MessageSample.ExampleClass"/Q?br>  Q?OutputListQ?br> Q?ProcessDefinitionQ?br>Q?ProcessListQ?br>Q?configurationQ?/td> </tr> </tbody> </table> <br> Ҏ信息的访问通过来自 System.Configuration E序集的 ConfigManager cL理。静?Get Ҏq回信息的集合,q些集合被枚D以获得单个属性。这些属性集的设|决定了辅助对象的运行时特征。除了这一配置文gQ您q应该创建定?XML 文gl构的图元文Ӟq在其中引用位于服务?machine.cfg 配置文g中的囑օ文gQ?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>Q?xml version ="1.0"?Q?br>QMetaData xmlns="x-schema:CatMeta.xms"Q?br> QDatabaseMeta InternalName="MessageService"Q?br> QServerWiring Interceptor="Core_XMLInterceptor"/Q?br> QCollection <br>   InternalName="Process" PublicName="ProcessList"<br>   PublicRowName="ProcessDefinition"<br>   SchemaGeneratorFlags="EMITXMLSCHEMA"Q?br>  QProperty InternalName="ProcessName" Type="String" MetaFlags="PRIMARYKEY" /Q?br>  QProperty InternalName="ProcessDesc" Type="String" /Q?br>  QProperty InternalName="ProcessType" Type="Int32" DefaultValue="RoundRobin" Q?br>   QEnum InternalName="RoundRobin" Value="0"/Q?br>   QEnum InternalName="AppSpecific" Value="1"/Q?br>   QEnum InternalName="Assembly" Value="2"/Q?br>  Q?PropertyQ?br>  QProperty InternalName="ProcessThreads" Type="Int32" DefaultValue="1" /Q?br>  QProperty InternalName="InputQueue" Type="String" /Q?br>  QProperty InternalName="ErrorQueue" Type="String" /Q?br>  QProperty InternalName="OutputName" Type="String" /Q?br>  QQueryMeta InternalName="All" MetaFlags="ALL" /Q?br>  QQueryMeta InternalName="QueryByFile" CellName="__FILE" Operator="EQUAL" /Q?br> Q?CollectionQ?br> QCollection <br>   InternalName="Output" PublicName="OutputList"<br>   PublicRowName="OutputDefinition"<br>   SchemaGeneratorFlags="EMITXMLSCHEMA"Q?br>  QProperty InternalName="ProcessName" Type="String" MetaFlags="PRIMARYKEY" /Q?br>  QProperty InternalName="OutputName" Type="String" MetaFlags="PRIMARYKEY" /Q?br>   QQueryMeta InternalName="All" MetaFlags="ALL" /Q?br>   QQueryMeta InternalName="QueryByFile" CellName="__FILE" Operator="EQUAL" /Q?br>  Q?CollectionQ?br> Q?DatabaseMetaQ?br> QRelationMeta <br>   PrimaryTable="Process" PrimaryColumns="ProcessName"<br>   ForeignTable="Output" ForeignColumns="ProcessName"<br>   MetaFlags="USECONTAINMENT"/Q?br>Q?MetaDataQ?/td> </tr> </tbody> </table> </span> <font size="3">׃ Service cdȝ护一个已创徏辅助对象的列表,因此使用?Hashtable 集合Q用于保持类型对象的名称/数值对列表。Hashtable 不仅支持枚DQ还允许通过关键字来查询倹{在应用E序中,XML q程名称是唯一的关键字Q?br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>private Hashtable htWorkers = new Hashtable();<br>IConfigCollection cWorkers = ConfigManager.Get("ProcessList", new AppDomainSelector());<br>foreach (IConfigItem ciWorker in cWorkers)<br>{<br> WorkerFormatter sfWorker = new WorkerFormatter();<br> sfWorker.ProcessName = (string)ciWorker["ProcessName"];<br> sfWorker.ProcessDesc = (string)ciWorker["ProcessDesc"];<br> sfWorker.NumberThreads = (int)ciWorker["ProcessThreads"];<br> sfWorker.InputQueue = (string)ciWorker["InputQueue"];<br> sfWorker.ErrorQueue = (string)ciWorker["ErrorQueue"];<br> // 计算q定义进E类?br> switch ((int)ciWorker["ProcessType"])<br> {<br>  case 0:<br>   sfWorker.ProcessType = WorkerFormatter.SFProcessType.ProcessRoundRobin;<br>   break;<br>  case 1:<br>   sfWorker.ProcessType = WorkerFormatter.SFProcessType.ProcessAppSpecific;<br>   break;<br>  case 2:<br>   sfWorker.ProcessType = WorkerFormatter.SFProcessType.ProcessAssembly;<br>   break;<br>  default:<br>  throw new Exception("Unknown Processing Type");<br> }<br> // 执行更多的工作以d输出信息<br> string sProcessName = (string)ciWorker["ProcessName"];<br> if (htWorkers.ContainsKey(sProcessName))<br>  throw new ArgumentException("Process Name Must be Unique: " + sProcessName);<br>  htWorkers.Add(sProcessName, new CWorker(sfWorker));<br>}</td> </tr> </tbody> </table> <br> <br>  在这D代码中没有包含的主要信息是输出数据的获取。每一个进E定义中都有一l相应的输出定义V该信息是通过如下的简单查询读取的Q?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>string sQuery = "SELECT * FROM OutputList WHERE ProcessName=" + <br>sfWorker.ProcessName + " AND Selector=appdomain://";<br>ConfigQuery qQuery = new ConfigQuery(sQuery);<br>IConfigCollection cOutputs = ConfigManager.Get("OutputList", qQuery);<br>int iSize = cOutputs.Count, iLoop = 0;<br>sfWorker.OutputName = new string[iSize];<br>foreach (IConfigItem ciOutput in cOutputs)<br>sfWorker.OutputName[iLoop++] = (string)ciOutput["OutputName"];</td> </tr> </tbody> </table> <br>  CWorkerThread ?Cworker c都有相应的服务控制ҎQ根据服务控制操作进行调用。由?Hashtable 中引用了每一?CWorker 对象Q因此需要枚?Hashtable 的内容,以调用适当的服务控制方法:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>foreach (CWorker cWorker in htWorkers.Values)<br> cWorker.Start();</td> </tr> </tbody> </table> <br>  cM圎ͼ实现?OnPause、OnContinue ?OnStop Ҏ是通过调用 CWorker 对象上的相应Ҏ来执行操作的?br><font size="3"> <strong><font color="#ac0000">CWorker c?/font></strong><br><br> CWorker cȝ主要功能是创建和理 CWorkerThread 对象。Start、Stop、Pause ?Continue Ҏ调用相应?CWorkerThread Ҏ。实际的 CWorkerThread 对象是在Start Ҏ中创建的。与使用 Hashtable 理辅助对象引用?Service cȝ|CWorker 使用 ArrayListQ简单的动态数l)来维护线E对象的列表?br><br>  在这个数l内部,CWorker cdZ CWorkerThread cȝ一个实现版本。CWorkerThread c(在下面讨论Q是一个必ȝ承的抽象cR导出类定义了消息的处理方式Q?br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>aThreads = new ArrayList();<br>for (int idx=0; idxQsfWorker.NumberThreads; idx++)<br>{<br> WorkerThreadFormatter wfThread = new WorkerThreadFormatter();<br> wfThread.ProcessName = sfWorker.ProcessName;<br> wfThread.ProcessDesc = sfWorker.ProcessDesc;<br> wfThread.ThreadNumber = idx;<br> wfThread.InputQueue = sfWorker.InputQueue;<br> wfThread.ErrorQueue = sfWorker.ErrorQueue;<br> wfThread.OutputName = sfWorker.OutputName;<br> // 定义辅助cdQƈ其插入辅助U程l构<br> CWorkerThread wtBase;<br> switch (sfWorker.ProcessType)<br> {<br>  case WorkerFormatter.SFProcessType.ProcessRoundRobin:<br>   wtBase = new CWorkerThreadRoundRobin(this, wfThread);<br>   break;<br>  case WorkerFormatter.SFProcessType.ProcessAppSpecific:<br>   wtBase = new CWorkerThreadAppSpecific(this, wfThread);<br>   break;<br>  case WorkerFormatter.SFProcessType.ProcessAssembly:<br>   wtBase = new CWorkerThreadAssembly(this, wfThread);<br>   break;<br>  default:<br>   throw new Exception("Unknown Processing Type");<br> }<br> // dҎl的调用<br> aThreads.Insert(idx, wtBase);<br>}</td> </tr> </tbody> </table> <br>  一旦所有的对象都已创徏Q就可以通过调用每个U程对象?Start Ҏ来启动它们:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>foreach(CWorkerThread cThread in aThreads)<br> cThread.Start();</td> </tr> </tbody> </table> <br>  Stop、Pause ?Continue Ҏ?foreach 循环里执行的操作cM。Stop Ҏh如下的垃圾收集操作:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>GC.SuppressFinalize(this);</td> </tr> </tbody> </table> <p><br>  在类析构函数中将调用 Stop ҎQ这P在没有显式调?Stop Ҏ的情况下也可以正地l止对象。如果调用了 Stop ҎQ将不需要析构函数。SuppressFinalize Ҏ能够防止调用对象?Finalize ҎQ析构函数的实际实现Q?/p> <p><font size="3"><strong><font color="#ac0000">CWorkerThread 抽象c?br><br></font></strong> CWorkerThread 是一个由 CWorkerThreadAppSpecifc、CWorkerThreadRoundRobin ? CWorkerThreadAssembly l承的抽象类。无论如何处理消息,队列的大部分处理是相同的Q所?CWorkerThread cL供了q一功能。这个类提供了抽象方法(必须被实际方法替代)以管理资源和处理消息?br><br>  cȝ工作再一ơ通过 Start、Stop、Pause ?Continue Ҏ来实现。在 Start Ҏ中引用了输入和错误队列。在 .NET 框架中,消息?System.Messaging 名称I间处理Q?br><br></font></p> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>// 试打开队列Qƈ讄默认的读写属?br>MessageQueue mqInput = new MessageQueue(sInputQueue);<br>mqInput.MessageReadPropertyFilter.Body = true;<br>mqInput.MessageReadPropertyFilter.AppSpecific = true;<br>MessageQueue mqError = new MessageQueue(sErrorQueue);<br>// 如果使用 MSMQ COMQ则格式化E序讄?ActiveX<br>mqInput.Formatter = new ActiveXMessageFormatter();<br>mqError.Formatter = new ActiveXMessageFormatter();</td> </tr> </tbody> </table> <br>  一旦定义了消息队列引用Q即会创Z个线E用于实际的处理函数Q称?ProcessMessagesQ。在 .NET 框架中,使用 System.Threading 名称I间很容易实现线E处理:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>procMessage = new Thread(new ThreadStart(ProcessMessages));<br>procMessage.Start();</td> </tr> </tbody> </table> <br>  ProcessMessages 函数是基?Boolean 值的处理循环。当数D?FalseQ处理@环将l止。因此,U程对象?Stop Ҏ只设|这一 Boolean |然后关闭打开的消息队列,q加入带有主U程的线E:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>// 加入服务U程和处理线E?br>bRun = false;<br>procMessage.Join();<br>// 关闭打开的消息队?br>mqInput.Close();<br>mqError.Close();</td> </tr> </tbody> </table> <br>  Pause Ҏ只设|一?Boolean |使处理线E休眠半U钟Q?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>if (bPause) <br> Thread.Sleep(500);</td> </tr> </tbody> </table> <br>  最后,每一?Start、Stop、Pause ?Continue Ҏ调用抽象的 OnStart、OnStop、OnPause ?OnContinue Ҏ。这些抽象方法ؓ实现的类提供了挂钩,以捕获和释放所需的资源?br><br>  ProcessMessages 循环h如下基本l构Q?br><br>   1、接?Message?br><br>   2、如?Message h成功?ReceiveQ则调用抽象 ProcessMessage Ҏ?br><br>   3、如?Receive ?ProcessMessage p|Q将 Message 发送至错误队列中?<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>Message mInput;<br>try<br>{<br> // 从队列中dQƈ{?1 U?br> mInput = mqInput.Receive(new TimeSpan(0,0,0,1));<br>}<br>catch (MessageQueueException mqe)<br>{<br> // 消息设|ؓ null<br> mInput = null;<br> // 查看错误代码Q了解是否超?br> if (mqe.ErrorCode != (-1072824293) ) //0xC00E001B<br> {<br>  // 如果未超Ӟ发出一个错误ƈ记录错误?br>  LogError("Error: " + mqe.Message);<br>  throw mqe;<br> }<br>}<br>if (mInput != null)<br>{<br> // 得到一个要处理的消息,调用处理消息抽象Ҏ<br> try<br> {<br>  ProcessMessage(mInput);<br> }<br> // 捕获已知异常状态的错误<br> catch (CWorkerThreadException ex)<br> {<br>  ProcessError(mInput, ex.Terminate);<br> }<br> // 捕获未知异常Qƈ调用 Terminate<br> catch<br> {<br>  ProcessError(mInput, true);<br> }<br>}</td> </tr> </tbody> </table> <br>  ProcessError Ҏ错误的消息发送至错误队列。另外,它也可能引发异常来终止线E。如果ProcessMessage Ҏ引发了终止错误或 CWorkerThreadException cdQ它执行此操作?br><font size="3"><strong><font color="#ac0000">CworkerThread 导出c?br><br></font></strong> M?CWorkerThread 中承的c都必须提供 OnStart、OnStop、OnPause、OnContinue ? ProcessMessage Ҏ。OnStart ?OnStop Ҏ获取q攑֤理资源。OnPause ?OnContinue Ҏ允许临时释放和重新获取这些资源。ProcessMessage Ҏ应该处理消息Qƈ在出现失败事件时引发 CWorkerThreadException 异常?br><br>  ׃ CWorkerThread 构造函数定义运行时参数Q导出类必须调用基类构造函敎ͼ<br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>public CWorkerThreadDerived(CWorker v_cParent, WorkerThreadFormatter v_wfThread)<br>: base (v_cParent, v_wfThread) {}</td> </tr> </tbody> </table> <br> 导出cL供了两种cd的处理:消息发送至另一队列Q或者调用组件方法。接收和发送消息的两种实现使用了@环技术或应用E序偏移Q保留在消息 AppSpecific 属性中Q,作ؓ使用哪一队列的决定因素。此Ҏ中的配置文g应该包括队列路径的列表。实现的 OnStart ? OnStop Ҏ应该打开和关闭对q些队列的引用:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>iQueues = wfThread.OutputName.Length;<br>mqOutput = new MessageQueue[iQueues];<br>for (int idx=0; idxQiQueues; idx++)<br>{<br> mqOutput[idx] = new MessageQueue(wfThread.OutputName[idx]);<br> mqOutput[idx].Formatter = new ActiveXMessageFormatter();<br>}</td> </tr> </tbody> </table> <br>  在这些方案中Q消息的处理很简单:消息发送必要的输出队列。在循环情况下,q个q程为:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>try<br>{<br> mqOutput[iNextQueue].Send(v_mInput);<br>}<br>catch (Exception ex)<br>{<br> // 如果错误强制l止异常<br> throw new CWorkerThreadException(ex.Message, true);<br>}<br>// 计算下一个队列号<br>iNextQueue++;<br>iNextQueue %= iQueues;</td> </tr> </tbody> </table> <br>  后一U调用带消息参数的组件的实现Ҏ比较有趣。ProcessMessage Ҏ使用 IWebMessage 接口调入一?.NET lg。OnStart ?OnStop Ҏ获取和释放此lg的引用?br><br>  此方案中的配|文件应该包含两个项目:完整的类名和cL在文件的位置。按?IWebMessage 接口中的定义Q在lg上调?Process Ҏ?br><br>  要获取对象引用,需要?Activator.CreateInstance Ҏ。此函数需要一个程序集cd。在q里Q它是从E序集文件\径和cd中导出的。一旦获取对象引用,它将被放入合适的接口Q?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>private IWebMessage iwmSample;<br>private string sFilePath, sTypeName;<br>// 保存E序集\径和cd名称<br>sFilePath = wfThread.OutputName[0];<br>sTypeName = wfThread.OutputName[1];<br>// 获取对必要对象的引用<br>Assembly asmSample = Assembly.LoadFrom(sFilePath);<br>Type typSample = asmSample.GetType(sTypeName);<br>object objSample = Activator.CreateInstance(typSample);<br>// 定义l对象的必要接口<br>iwmSample = (IWebMessage)objSample;<br><br>获取对象引用后,ProcessMessage Ҏ在 IWebMessage 接口上调?Process ҎQ?br><br>WebMessageReturn wbrSample;<br>try<br>{<br> // 定义Ҏ调用的参?br> string sLabel = v_mInput.Label;<br> string sBody = (string)v_mInput.Body;<br> int iAppSpecific = v_mInput.AppSpecific;<br> // 调用Ҏq捕捉返回代?br> wbrSample = iwmSample.Process(sLabel, sBody, iAppSpecific);<br>}<br>catch (InvalidCastException ex)<br>{<br> // 如果在消息内容中发生错误Q则强制发出一个非l止异常<br> throw new CWorkerThreadException(ex.Message, false);<br>}<br>catch (Exception ex)<br>{<br> // 如果错误调用E序集,则强制发出终止异?br> throw new CWorkerThreadException(ex.Message, true);<br>}<br>// 如果没有错误Q则查对象调用的q回状?br>switch (wbrSample)<br>{<br> case WebMessageReturn.ReturnBad:<br>  throw new CWorkerThreadException<br>   ("Unable to process message: Message marked bad", false);<br> case WebMessageReturn.ReturnAbort:<br>  throw new CWorkerThreadException<br>   ("Unable to process message: Process terminating", true);<br> default:<br>  break;<br>} </td> </tr> </tbody> </table> <br>  提供的示例组件将消息正文写入数据库表。如果捕获到严重数据库错误,您可能希望终止处理过E,但是在这里,仅仅消息标Cؓ错误的消息?br><br>  ׃此示例中创徏的类实例可能会获取ƈ保留昂贵的数据库资源Q所以用 OnPause ?OnContinue Ҏ释放和重新获取对象引用?br><font size="3"><strong><font color="#ac0000">CworkerThread 导出c?br><br></font></strong> M?CWorkerThread 中承的c都必须提供 OnStart、OnStop、OnPause、OnContinue ? ProcessMessage Ҏ。OnStart ?OnStop Ҏ获取q攑֤理资源。OnPause ?OnContinue Ҏ允许临时释放和重新获取这些资源。ProcessMessage Ҏ应该处理消息Qƈ在出现失败事件时引发 CWorkerThreadException 异常?br><br>  ׃ CWorkerThread 构造函数定义运行时参数Q导出类必须调用基类构造函敎ͼ<br><br></font> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>public CWorkerThreadDerived(CWorker v_cParent, WorkerThreadFormatter v_wfThread)<br>: base (v_cParent, v_wfThread) {}</td> </tr> </tbody> </table> <br> 导出cL供了两种cd的处理:消息发送至另一队列Q或者调用组件方法。接收和发送消息的两种实现使用了@环技术或应用E序偏移Q保留在消息 AppSpecific 属性中Q,作ؓ使用哪一队列的决定因素。此Ҏ中的配置文g应该包括队列路径的列表。实现的 OnStart ? OnStop Ҏ应该打开和关闭对q些队列的引用:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>iQueues = wfThread.OutputName.Length;<br>mqOutput = new MessageQueue[iQueues];<br>for (int idx=0; idxQiQueues; idx++)<br>{<br> mqOutput[idx] = new MessageQueue(wfThread.OutputName[idx]);<br> mqOutput[idx].Formatter = new ActiveXMessageFormatter();<br>}</td> </tr> </tbody> </table> <br>  在这些方案中Q消息的处理很简单:消息发送必要的输出队列。在循环情况下,q个q程为:<br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>try<br>{<br> mqOutput[iNextQueue].Send(v_mInput);<br>}<br>catch (Exception ex)<br>{<br> // 如果错误强制l止异常<br> throw new CWorkerThreadException(ex.Message, true);<br>}<br>// 计算下一个队列号<br>iNextQueue++;<br>iNextQueue %= iQueues;</td> </tr> </tbody> </table> <br>  后一U调用带消息参数的组件的实现Ҏ比较有趣。ProcessMessage Ҏ使用 IWebMessage 接口调入一?.NET lg。OnStart ?OnStop Ҏ获取和释放此lg的引用?br><br>  此方案中的配|文件应该包含两个项目:完整的类名和cL在文件的位置。按?IWebMessage 接口中的定义Q在lg上调?Process Ҏ?br><br>  要获取对象引用,需要?Activator.CreateInstance Ҏ。此函数需要一个程序集cd。在q里Q它是从E序集文件\径和cd中导出的。一旦获取对象引用,它将被放入合适的接口Q?br><br> <table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td>private IWebMessage iwmSample;<br>private string sFilePath, sTypeName;<br>// 保存E序集\径和cd名称<br>sFilePath = wfThread.OutputName[0];<br>sTypeName = wfThread.OutputName[1];<br>// 获取对必要对象的引用<br>Assembly asmSample = Assembly.LoadFrom(sFilePath);<br>Type typSample = asmSample.GetType(sTypeName);<br>object objSample = Activator.CreateInstance(typSample);<br>// 定义l对象的必要接口<br>iwmSample = (IWebMessage)objSample;<br><br>获取对象引用后,ProcessMessage Ҏ在 IWebMessage 接口上调?Process ҎQ?br><br>WebMessageReturn wbrSample;<br>try<br>{<br> // 定义Ҏ调用的参?br> string sLabel = v_mInput.Label;<br> string sBody = (string)v_mInput.Body;<br> int iAppSpecific = v_mInput.AppSpecific;<br> // 调用Ҏq捕捉返回代?br> wbrSample = iwmSample.Process(sLabel, sBody, iAppSpecific);<br>}<br>catch (InvalidCastException ex)<br>{<br> // 如果在消息内容中发生错误Q则强制发出一个非l止异常<br> throw new CWorkerThreadException(ex.Message, false);<br>}<br>catch (Exception ex)<br>{<br> // 如果错误调用E序集,则强制发出终止异?br> throw new CWorkerThreadException(ex.Message, true);<br>}<br>// 如果没有错误Q则查对象调用的q回状?br>switch (wbrSample)<br>{<br> case WebMessageReturn.ReturnBad:<br>  throw new CWorkerThreadException<br>   ("Unable to process message: Message marked bad", false);<br> case WebMessageReturn.ReturnAbort:<br>  throw new CWorkerThreadException<br>   ("Unable to process message: Process terminating", true);<br> default:<br>  break;<br>} </td> </tr> </tbody> </table> <br>  提供的示例组件将消息正文写入数据库表。如果捕获到严重数据库错误,您可能希望终止处理过E,但是在这里,仅仅消息标Cؓ错误的消息?br><br>  ׃此示例中创徏的类实例可能会获取ƈ保留昂贵的数据库资源Q所以用 OnPause ?OnContinue Ҏ释放和重新获取对象引用?img src="http://www.tkk7.com/kuxiaoku/aggbug/94804.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:13 <a href="http://www.tkk7.com/kuxiaoku/articles/94804.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div> <br>文章来源:<a href="http://www.tkk7.com/kuxiaoku/articles/94804.html">http://www.tkk7.com/kuxiaoku/articles/94804.html</a> <img src ="http://www.tkk7.com/kuxiaoku/aggbug/107852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kuxiaoku/" target="_blank">苦笑?/a> 2007-01-19 00:13 <a href="http://www.tkk7.com/kuxiaoku/archive/2007/01/19/107852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www50884.com" target="_blank">޾Ʒ͵Բ</a>| <a href="http://zdmaid.com" target="_blank">VƬ߲</a>| <a href="http://viviker.com" target="_blank">videos</a>| <a href="http://4husese.com" target="_blank">һ</a>| <a href="http://831055.com" target="_blank">þþƷAV</a>| <a href="http://tianmao920.com" target="_blank">þþƷƵ</a>| <a href="http://vcnxa.com" target="_blank">רVAV</a>| <a href="http://140699.com" target="_blank">AVרAVJULIA</a>| <a href="http://fenglengqi.com" target="_blank">aרav鶹</a>| <a href="http://maomi90.com" target="_blank">þþþޱٸ</a>| <a href="http://gyqcy.com" target="_blank">ҹ޾ƷС˵</a>| <a href="http://uiui6.com" target="_blank">ŷһ</a>| <a href="http://5222133.com" target="_blank">avƬ߹ۿ18Ů</a>| <a href="http://818812.com" target="_blank">޾Ʒþһ</a>| <a href="http://ynrygc.com" target="_blank">þ91޾ƷĻ</a>| <a href="http://zfjhw.com" target="_blank">Ƶѿ</a>| <a href="http://xiaojiejieav.com" target="_blank">Ƶ</a>| <a href="http://simupiao.com" target="_blank">պŷһ </a>| <a href="http://haha02.com" target="_blank">þþþþþƷͼƬ</a>| <a href="http://fsweicheng.com" target="_blank">99Ƶ</a>| <a href="http://zhuoyueyc.com" target="_blank">һëƬѹۿƵ</a>| <a href="http://pufenghotel.com" target="_blank">þҹӰԺѹۿ</a>| <a href="http://qq2071.com" target="_blank">91վѹۿ</a>| <a href="http://sjmthanks.com" target="_blank">ֻѸۿ</a>| <a href="http://catalna.com" target="_blank">ѹƷƵ</a>| <a href="http://bbby6.com" target="_blank">Ļ߹ۿ</a>| <a href="http://zhaofeiz.com" target="_blank">޾Ʒav</a>| <a href="http://44od.com" target="_blank">Ƶһ</a>| <a href="http://023npxyy.com" target="_blank">޸ëƬһ</a>| <a href="http://gs168sz.com" target="_blank">һƵѹۿ</a>| <a href="http://zaidongmaixi.com" target="_blank">ձ</a>| <a href="http://www22432.com" target="_blank">2020þþƷ</a>| <a href="http://79909d.com" target="_blank">ڵĤѿ</a>| <a href="http://www282pp.com" target="_blank">MM131޹Ůþ </a>| <a href="http://www-7607.com" target="_blank">ůůձ</a>| <a href="http://ynxxrh.com" target="_blank">߹ۿ</a>| <a href="http://hengzekang.com" target="_blank">޾ƷþþþþðĦ</a>| <a href="http://trio2003.com" target="_blank">޻ɫ߹ۿ</a>| <a href="http://dghxm168.com" target="_blank">..ŷһ</a>| <a href="http://fshomppa.com" target="_blank">һˮëƬѿ</a>| <a href="http://www62hth.com" target="_blank">98Ʒѹۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>