Data.cs
上传用户:lxycoco
上传日期:2022-07-21
资源大小:38457k
文件大小:10k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. using System.Windows.Forms;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Reflection;
  6. /// <summary>
  7. /// Attribute used to name the context menu option
  8. /// </summary>
  9. [AttributeUsage(AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
  10. public class ContextMenuAttribute : System.Attribute
  11. {
  12.   /// <summary>
  13.   /// Construct the attribute
  14.   /// </summary>
  15.   /// <param name="caption">The caption to be shown on the menu</param>
  16.   public ContextMenuAttribute ( string caption )
  17.   {
  18.     Caption = caption ;
  19.     Default = false ;
  20.   }
  21.   /// <summary>
  22.   /// Caption shown on the menu
  23.   /// </summary>
  24.   public readonly string Caption ;
  25.   /// <summary>
  26.   /// Describes the default menu option
  27.   /// </summary>
  28.   public bool Default ;
  29. }
  30. /// <summary>
  31. /// Callback class used by the popup menu
  32. /// </summary>
  33. public class MenuCommand
  34. {
  35.   /// <summary>
  36.   /// Construct a menu command, which wraps the receiver and method
  37.   /// </summary>
  38.   /// <param name="receiver">The receiver of the method</param>
  39.   /// <param name="method">The method to be invoked</param>
  40.   public MenuCommand ( object receiver , MethodInfo method )
  41.   {
  42.     Receiver = receiver ;
  43.     Method = method ;
  44.   }
  45.   /// <summary>
  46.   /// The real delegate called by the menu code
  47.   /// </summary>
  48.   /// <param name="sender">The sender of the event</param>
  49.   /// <param name="e">Any arguments passed through</param>
  50.   public void Execute ( object sender , EventArgs e )
  51.   {
  52.     // Execute the method on the object
  53.     Method.Invoke ( Receiver , new object[] { } ) ;
  54.   }
  55.   public readonly object      Receiver ;
  56.   public readonly MethodInfo  Method ;
  57. }
  58. /// <summary>
  59. /// The base class for all rows which have a context menu
  60. /// </summary>
  61. /// <remarks>
  62. /// Derive from this class each DataRow class that requires a context
  63. /// menu.  The code will automatically select all methods which conform
  64. /// to the signature 'void <name> ( )', and display these on the popup
  65. /// menu.
  66. /// </remarks>
  67. public class ContextDataRow : DataRow
  68. {
  69.   /// <summary>
  70.   /// DataRows are never created directly - you always need a constructor
  71.   /// which takes a DataRowBuilder, and passes this on to the base classes
  72.   /// constructor.
  73.   /// </summary>
  74.   /// <param name="builder">The DataRowBuilder</param>
  75.   public ContextDataRow ( DataRowBuilder builder )
  76.     : base ( builder )
  77.   {
  78.   }
  79.   /// <summary>
  80.   /// Display the popup menu for this row
  81.   /// </summary>
  82.   /// <param name="parent">The parent control</param>
  83.   /// <param name="x">X coordinate of menu</param>
  84.   /// <param name="y">Y coordinate of menu</param>
  85.   public void PopupMenu ( System.Windows.Forms.Control parent , int x , int y )
  86.   {
  87.     // Use reflection to get the list of popup menu commands
  88.     MemberInfo[]  members = this.GetType().FindMembers ( MemberTypes.Method ,
  89.       BindingFlags.Public | BindingFlags.Instance ,
  90.       new System.Reflection.MemberFilter ( Filter ) ,
  91.       null ) ;
  92.     if ( members.Length > 0 )
  93.     {
  94.       // Create a context menu
  95.       ContextMenu   menu = new ContextMenu ( ) ;
  96.       // Now loop through those members and generate the popup menu
  97.       // Note the cast to MethodInfo in the foreach
  98.       foreach ( MethodInfo meth in members )
  99.       {
  100.         // Get the caption for the operation from the ContextMenuAttribute
  101.         ContextMenuAttribute[]  ctx = (ContextMenuAttribute[]) meth.GetCustomAttributes ( typeof ( ContextMenuAttribute ) , true ) ;
  102.         MenuCommand  callback = new MenuCommand ( this , meth ) ;
  103.         MenuItem      item = new MenuItem ( ctx[0].Caption , new EventHandler ( callback.Execute ) ) ;
  104.         item.DefaultItem = ctx[0].Default ;
  105.         menu.MenuItems.Add ( item ) ;
  106.       }
  107.       System.Drawing.Point  pt = new System.Drawing.Point ( x , y ) ;
  108.       menu.Show ( parent , pt ) ;
  109.     }
  110.   }
  111.   /// <summary>
  112.   /// Implementation of MemberFilter delegate
  113.   /// </summary>
  114.   /// <remarks>
  115.   /// This method is called for each method on the object.  Here I test if it's a method
  116.   /// that returns void and takes no parameters.  If those criteria are satisfied, it
  117.   /// is a match and can be called from a context menu.
  118.   /// </remarks>
  119.   /// <param name="member">MemberInfo for the current method</param>
  120.   /// <param name="criteria">Any criteria passed as the last parameter to FindMembers</param>
  121.   private bool Filter ( MemberInfo member , object criteria )
  122.   {
  123.     bool  bInclude = false ;
  124.     // Cast MemberInfo to MethodInfo
  125.     MethodInfo  meth = member as MethodInfo ;
  126.     if ( meth != null )
  127.       if ( meth.ReturnType == typeof ( void ) )
  128.       {
  129.         ParameterInfo[] parms = meth.GetParameters ( ) ;
  130.         if ( parms.Length == 0 )
  131.         {
  132.           // Lastly check if there is a ContextMenuAttribute on the method...
  133.           object[]  atts = meth.GetCustomAttributes(typeof(ContextMenuAttribute), true);
  134.           bInclude = ( atts.Length == 1 ) ;
  135.         }
  136.       }
  137.     return bInclude ;
  138.   }
  139. }
  140. /// <summary>
  141. /// Class which wraps access to the customers table
  142. /// </summary>
  143. public class CustomerTable : DataTable
  144. {
  145.   public CustomerTable ( )
  146.     : base ( "Customers" )
  147.   {
  148.     this.Columns.Add ( "CustomerID" , typeof ( string ) ) ;
  149.     this.Columns.Add ( "CompanyName" , typeof ( string ) ) ;
  150.     this.Columns.Add ( "ContactName" , typeof ( string ) ) ;
  151.   }
  152.   /// <summary>
  153.   /// Return the typeof each row
  154.   /// </summary>
  155.   protected override System.Type GetRowType ( )
  156.   {
  157.     return typeof ( CustomerRow ) ;
  158.   }
  159.   /// <summary>
  160.   /// Create a new row
  161.   /// </summary>
  162.   /// <param name="builder">A DataRowBuilder</param>
  163.   protected override DataRow NewRowFromBuilder ( DataRowBuilder builder )
  164.   {
  165.     return ( DataRow ) new CustomerRow ( builder ) ;
  166.   }
  167. }
  168. /// <summary>
  169. /// Wrap a row in the Customers table
  170. /// </summary>
  171. public class CustomerRow : ContextDataRow
  172. {
  173.   public CustomerRow ( DataRowBuilder builder )
  174.     : base ( builder )
  175.   {
  176.   }
  177.   /// <summary>
  178.   /// Get/Set the CustomerID
  179.   /// </summary>
  180.   public string CustomerID
  181.   {
  182.     get { return ( string ) this["CustomerID"] ; }
  183.     set { this["CustomerID"] = value ; }
  184.   }
  185.   /// <summary>
  186.   /// Get/Set the CompanyName
  187.   /// </summary>
  188.   public string CompanyName
  189.   {
  190.     get { return ( string ) this["CompanyName"] ; }
  191.     set { this["CompanyName"] = value ; }
  192.   }
  193.   /// <summary>
  194.   /// Get/Set the ContactName
  195.   /// </summary>
  196.   public string ContactName
  197.   {
  198.     get { return ( string ) this["ContactName"] ; }
  199.     set { this["ContactName"] = value ; }
  200.   }
  201.   /// <summary>
  202.   /// First menu option - blacklist a customer
  203.   /// </summary>
  204.   [ContextMenu("Blacklist Customer")]
  205.   public void Blacklist ( )
  206.   {
  207.     DialogResult  r = MessageBox.Show ( String.Format ( "Are you sure you wish to blacklist customer {0}" , CustomerID ) , "BlackList" , MessageBoxButtons.YesNo ) ;
  208.     if ( r == DialogResult.Yes )
  209.     {
  210.       // Do something...
  211.     }
  212.   }
  213.   /// <summary>
  214.   /// Menu option to display contact details for a customer
  215.   /// </summary>
  216.   [ContextMenu("Get Contact",Default=true)]
  217.   public void GetContact ( )
  218.   {
  219.     MessageBox.Show ( String.Format ( "Customer {0} contact is {1}" , CompanyName , ContactName ) ) ;
  220.   }
  221. }
  222. /// <summary>
  223. /// Wrap the Northwind orders table
  224. /// </summary>
  225. public class OrderTable : DataTable
  226. {
  227.   /// <summary>
  228.   /// Construct the order table by adding in all columns
  229.   /// </summary>
  230.   public OrderTable ( )
  231.     : base ( "Orders" )
  232.   {
  233.     this.Columns.Add ( "OrderID" , typeof ( int ) ) ;
  234.     this.Columns.Add ( "CustomerID" , typeof ( string ) ) ;
  235.     this.Columns.Add ( "EmployeeID" , typeof ( int ) ) ;
  236.     this.Columns.Add ( "ShippedDate" , typeof ( DateTime ) ) ;
  237.   }
  238.   /// <summary>
  239.   /// Return the typeof each row
  240.   /// </summary>
  241.   protected override System.Type GetRowType ( )
  242.   {
  243.     return typeof ( OrderRow ) ;
  244.   }
  245.   /// <summary>
  246.   /// Create a new row
  247.   /// </summary>
  248.   /// <param name="builder">A DataRowBuilder</param>
  249.   protected override DataRow NewRowFromBuilder ( DataRowBuilder builder )
  250.   {
  251.     return ( DataRow ) new OrderRow ( builder ) ;
  252.   }
  253. }
  254. /// <summary>
  255. /// Wrap a row in the orders table
  256. /// </summary>
  257. public class OrderRow : ContextDataRow
  258. {
  259.   public OrderRow ( DataRowBuilder builder )
  260.     : base ( builder )
  261.   {
  262.   }
  263.   /// <summary>
  264.   /// Get/Set the OrderID
  265.   /// </summary>
  266.   public int OrderID
  267.   {
  268.     get { return ( int ) this["OrderID"] ; }
  269.     set { this["OrderID"] = value ; }
  270.   }
  271.   /// <summary>
  272.   /// Get/Set the CustomerID
  273.   /// </summary>
  274.   public string CustomerID
  275.   {
  276.     get { return ( string ) this["CustomerID"] ; }
  277.     set { this["CustomerID"] = value ; }
  278.   }
  279.   /// <summary>
  280.   /// Get/Set the EmployeeID
  281.   /// </summary>
  282.   public int EmployeeID
  283.   {
  284.     get { return ( int ) this["EmployeeID"] ; }
  285.     set { this["EmployeeID"] = value ; }
  286.   }
  287.   /// <summary>
  288.   /// Get/Set the ShippedDate
  289.   /// </summary>
  290.   public DateTime ShippedDate
  291.   {
  292.     get { return ( DateTime ) this["ShippedDate"] ; }
  293.     set { this["ShippedDate"] = value ; }
  294.   }
  295.   /// <summary>
  296.   /// First menu option - cancel (i.e. delete) the order
  297.   /// </summary>
  298.   [ContextMenu("Cancel Order")]
  299.   public void CancelOrder ( )
  300.   {
  301.     DialogResult  r = MessageBox.Show ( String.Format ( "Are you sure you wish to cancel order {0}" , OrderID ) , "Cancel Order" , MessageBoxButtons.YesNo ) ;
  302.     if ( r == DialogResult.Yes )
  303.       // Delete this row...
  304.       this.Delete();
  305.   }
  306.   /// <summary>
  307.   /// Menu option to ship an order
  308.   /// </summary>
  309.   [ContextMenu("Ship It",Default=true)]
  310.   public void Ship ( )
  311.   {
  312.     // Set the ship date to now
  313.     this.ShippedDate = DateTime.Now ;
  314.   }
  315. }