在CurrentCellChanged事件裡觸發DoubleClick事件

解决方案 »

  1.   

    刚好也遇到了这个问题,我是按http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp里提到的一个方法解决的。目的是在信息显示用的DataGrid中,用户单击某个cell则选定整行,并响应用户鼠标双击某一行事件以弹出详细信息窗体。
    首先继承DataGridTextBoxColumn类:
    public class DataGridNoActiveCellColumn : DataGridTextBoxColumn 
    {
    public DataGridNoActiveCellColumn()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } private int SelectedRow = -1; 
     
    protected override void Edit(System.Windows.Forms.CurrencyManager source, 
    int rowNum, System.Drawing.Rectangle bounds, bool readOnly,string nstantText,bool cellIsVisible) 
      { 
      //make sure previous selection is valid 
      if(SelectedRow > -1 && SelectedRow < source.List.Count + 1) 
     
    this.DataGridTableStyle.DataGrid.UnSelect(SelectedRow); 
     
    SelectedRow = rowNum; 
     
    this.DataGridTableStyle.DataGrid.Select(SelectedRow); 
      } 
    }将此类代替DataGridTextBoxColumn类,加入到DataGridTableStyle中,就可以了。
      

  2.   

    这是一个完整的例子:
    namespace DataGridDoubleClick
    {
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data; /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private System.Windows.Forms.DataGrid dataGrid1;
    private DataSet myDataSet;
    DateTime gridMouseDownTime;
    private System.Windows.Forms.Button button1;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null; public Form1()
    {
    //
    // Required for Windows Form Designer support
    //
    InitializeComponent(); gridMouseDownTime = DateTime.Now;
    // Call SetUp to bind the controls.

    } private void MakeDataSet()
    {
    // Create a DataSet.
    myDataSet = new DataSet("myDataSet");
          
    // Create two DataTables.
    DataTable tCust = new DataTable("Customers");

    // Create two columns, and add them to the first table.
    DataColumn cCustID = new DataColumn("custID");
    DataColumn cCustName = new DataColumn("custName");
    DataColumn cCurrent = new DataColumn("custCity");
    tCust.Columns.Add(cCustID);
    tCust.Columns.Add(cCustName);
    tCust.Columns.Add(cCurrent); // Add the tables to the DataSet.
    myDataSet.Tables.Add(tCust);

       
    /* Populates the tables. For each customer and order, 
    creates two DataRow variables. */
    DataRow newRow1;

    // Create three customers in the Customers Table.
    for(int i = 1; i < 4; i++)
    {
    newRow1 = tCust.NewRow();
    newRow1["custID"] = (100*i).ToString();
    tCust.Rows.Add(newRow1);
    }
    // Give each customer a distinct name.
    tCust.Rows[0]["custName"] = "John Summers";
    tCust.Rows[1]["custName"] = "Phil Seagram";
    tCust.Rows[2]["custName"] = "Sam Robinson"; // And address
    tCust.Rows[0]["custCity"] = "Chicago";
    tCust.Rows[1]["custCity"] = "Los Angeles";
    tCust.Rows[2]["custCity"] = "Washington";
    } private void AddCustomDataTableStyle()
    {
    DataGridTableStyle ts1 = new DataGridTableStyle();
    ts1.MappingName = "Customers";
    // Set other properties.
    ts1.AlternatingBackColor = Color.LightGray;
    //
    // Add textbox column style so we can catch textbox mouse clicks
    DataGridTextBoxColumn TextCol = new DataGridTextBoxColumn();
    TextCol.MappingName = "custID";
    TextCol.HeaderText = "CustomerID";
    TextCol.Width = 100;
    //add handler
    TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
    TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
    ts1.GridColumnStyles.Add(TextCol); TextCol = new DataGridTextBoxColumn();
    TextCol.MappingName = "custName";
    TextCol.HeaderText = "Customer Name";
    TextCol.Width = 100;
    //add handler
    TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
    TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
    ts1.GridColumnStyles.Add(TextCol); TextCol = new DataGridTextBoxColumn();
    TextCol.MappingName = "custCity";
    TextCol.HeaderText = "Customer Address";
    TextCol.Width = 100;
    //add handler
    TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
    TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
    ts1.GridColumnStyles.Add(TextCol);

    dataGrid1.TableStyles.Add(ts1);

    } /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
    this.dataGrid1 = new System.Windows.Forms.DataGrid();
    this.button1 = new System.Windows.Forms.Button();
    ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
    this.SuspendLayout();
    // 
    // dataGrid1
    // 
    this.dataGrid1.DataMember = "";
    this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
    this.dataGrid1.Location = new System.Drawing.Point(41, 28);
    this.dataGrid1.Name = "dataGrid1";
    this.dataGrid1.ReadOnly = true;
    this.dataGrid1.Size = new System.Drawing.Size(471, 166);
    this.dataGrid1.TabIndex = 0;
    this.dataGrid1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dataGrid1_MouseDown);
    // 
    // button1
    // 
    this.button1.Location = new System.Drawing.Point(300, 5);
    this.button1.Name = "button1";
    this.button1.TabIndex = 1;
    this.button1.Text = "button1";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(542, 218);
    this.Controls.AddRange(new System.Windows.Forms.Control[] {
      this.button1,
      this.dataGrid1});
    this.Name = "Form1";
    this.Text = "Form1";
    ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
    this.ResumeLayout(false); }
    #endregion /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    } private void TextBoxDoubleClickHandler(object sender, EventArgs e)
    {
    MessageBox.Show("TrueDoubleClick");
    } private void TextBoxMouseDownHandler(object sender, MouseEventArgs e)
    {
    if(DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime))
    {
    MessageBox.Show("GridDoubleClick");
    }
    Console.WriteLine("TextBoxMouseDownHandler  " );
    } private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    gridMouseDownTime = DateTime.Now;
    Console.WriteLine("dataGrid1_MouseDown  " );
    } private void button1_Click(object sender, System.EventArgs e)
    {


    // Create a DataSet with two tables and one relation.
    MakeDataSet();
    /* Bind the DataGrid to the DataSet. The dataMember
    specifies that the Customers table should be displayed.*/
    dataGrid1.SetDataBinding(myDataSet, "Customers"); //create and add a custom table style so we can
    //easily get at the behavior of a cell...
    AddCustomDataTableStyle();

    }
    }
    }