在DataGrid控件中如何产生响应鼠标双击控件中一行记录产生的事件?

lxhvc 2003-08-05 04:52:14
我希望单击一行记录后将该行记录传递到另外一个窗体并在窗体中编辑数据。
请教各位大虾如何是好》》!~~~~~~~~~
...全文
18 点赞 收藏 10
写回复
10 条回复
雪狼1234567 2003年08月24日
.7 How can I select the entire row when the user clicks on a cell in the row?

Call the DataGrid.Select method from within its mouseup event.

[C#]

private void dataGrid1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

System.Drawing.Point pt = new Point(e.X, e.Y);

DataGrid.HitTestInfo hti = dataGrid1.HitTest(pt);

if(hti.Type == DataGrid.HitTestType.Cell)

{

dataGrid1.CurrentCell = new DataGridCell(hti.Row, hti.Column);

dataGrid1.Select(hti.Row);

}

}

回复 点赞
雪狼1234567 2003年08月24日
双击事件用下面的代码:
选择一行就简单啦:
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();

}
}
}
回复 点赞
spiketang 2003年08月24日
Option Strict Off
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Windows.Forms

Namespace DataGridDoubleClick
Public Class Form1
Inherits Form
Private WithEvents dataGrid1 As DataGrid
Private WithEvents myDataSet As DataSet
Private gridMouseDownTime As DateTime
Private components As Container

Public Sub New()
MyBase.New()
InitializeComponent()
gridMouseDownTime = DateTime.Now
SetUp()

End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then
If (Not (components) Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)

End Sub
Private Sub SetUp()
MakeDataSet()
dataGrid1.SetDataBinding(myDataSet, "Customers")
AddCustomDataTableStyle()
End Sub
Private Sub MakeDataSet()
myDataSet = New DataSet("myDataSet")
Dim tCust As DataTable
tCust = New DataTable("Customers")
Dim cCustID As DataColumn
cCustID = New DataColumn("custID")
Dim cCustName As DataColumn
cCustName = New DataColumn("custName")
Dim cCurrent As DataColumn
cCurrent = New DataColumn("custCity")
tCust.Columns.Add(cCustID)
tCust.Columns.Add(cCustName)
tCust.Columns.Add(cCurrent)
myDataSet.Tables.Add(tCust)
Dim newRow1 As DataRow
Dim i As Integer
i = 1

Do While (i < 4)
newRow1 = tCust.NewRow
newRow1("custID") = i.ToString()
tCust.Rows.Add(newRow1)
i = (i + 1)
Loop
tCust.Rows(0)("custName") = "【孟宪会之精彩世界】"
tCust.Rows(1)("custName") = "net_lover"
tCust.Rows(2)("custName") = "http://xml.sz.luohuedu.net/"


tCust.Rows(0)("custCity") = "北京"
tCust.Rows(1)("custCity") = "上海"
tCust.Rows(2)("custCity") = "河南"

End Sub
Private Sub AddCustomDataTableStyle()

Dim ts1 As DataGridTableStyle
ts1 = New DataGridTableStyle()
ts1.MappingName = "Customers"
ts1.AlternatingBackColor = Color.LightGray

Dim TextCol As DataGridTextBoxColumn
TextCol = New DataGridTextBoxColumn()
TextCol.MappingName = "custID"
TextCol.HeaderText = "序号"
TextCol.Width = 100

AddHandler TextCol.TextBox.MouseDown, New MouseEventHandler(AddressOf TextBoxMouseDownHandler)
AddHandler TextCol.TextBox.DoubleClick, New EventHandler(AddressOf TextBoxDoubleClickHandler)
ts1.GridColumnStyles.Add(TextCol)
TextCol = New DataGridTextBoxColumn()
TextCol.MappingName = "custName"
TextCol.HeaderText = "姓名"
TextCol.Width = 100

AddHandler TextCol.TextBox.MouseDown, New MouseEventHandler(AddressOf TextBoxMouseDownHandler)
AddHandler TextCol.TextBox.DoubleClick, New EventHandler(AddressOf TextBoxDoubleClickHandler)
ts1.GridColumnStyles.Add(TextCol)
TextCol = New DataGridTextBoxColumn()
TextCol.MappingName = "custCity"
TextCol.HeaderText = "地址"
TextCol.Width = 100

AddHandler TextCol.TextBox.MouseDown, New MouseEventHandler(AddressOf TextBoxMouseDownHandler)
AddHandler TextCol.TextBox.DoubleClick, New EventHandler(AddressOf TextBoxDoubleClickHandler)
ts1.GridColumnStyles.Add(TextCol)
dataGrid1.TableStyles.Add(ts1)

End Sub
Friend WithEvents Label1 As System.Windows.Forms.Label
Private Sub InitializeComponent()
Me.dataGrid1 = New System.Windows.Forms.DataGrid()
Me.Label1 = New System.Windows.Forms.Label()
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'dataGrid1
'
Me.dataGrid1.CaptionVisible = False
Me.dataGrid1.DataMember = ""
Me.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.dataGrid1.Location = New System.Drawing.Point(12, 8)
Me.dataGrid1.Name = "dataGrid1"
Me.dataGrid1.Size = New System.Drawing.Size(368, 128)
Me.dataGrid1.TabIndex = 0
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(10, 149)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(370, 23)
Me.Label1.TabIndex = 1
Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(388, 189)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Label1, Me.dataGrid1})
Me.Name = "Form1"
Me.Text = "鼠标双击事件的例子"
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)

End Sub
<STAThread()> _
Public Shared Sub Main()

Application.Run(New Form1())

End Sub
Private Sub TextBoxDoubleClickHandler(ByVal sender As Object, ByVal e As EventArgs)

MessageBox.Show("TrueDoubleClick")

End Sub
Private Sub TextBoxMouseDownHandler(ByVal sender As Object, ByVal e As MouseEventArgs)

If (DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime)) Then
MessageBox.Show("GridDoubleClick:" + CType(sender, TextBox).Text)
End If
Label1.Text = "TextBoxMouseDownHandler "

End Sub
Private Sub dataGrid1_MouseDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles dataGrid1.MouseDown

gridMouseDownTime = DateTime.Now
Label1.Text = "dataGrid1_MouseDown "

End Sub

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Label1.Click
Label1.Text = ""
End Sub

Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Click
Label1.Text = ""
End Sub
End Class
End Namespace

回复 点赞
老大刘 2003年08月24日
刚好也遇到了这个问题,我是按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中,就可以了。
回复 点赞
SZHHP 2003年08月24日
to: net_lover(孟子E章)
我似乎明白你的想法,在单元格的TEXTBOX中处理双击事件,但这似乎太麻烦了,如果是动态显示数据,事先不知道列的设置,恐怕还得另想办法。:(
回复 点赞
孟子E章 2003年08月05日
捕捉DataGrid的双击事件(C#版本)

http://xml.sz.luohuedu.net/xml/ShowDetail.asp?id=C83C3A4B-8571-4CE6-FBAC-35DC28D14389
回复 点赞
ccchenyu 2003年08月05日
自己写个事件暴露出去,双击时触发
回复 点赞
Gabriel_tosh 2003年08月05日
private void dataGrid_DoubleClick(object sender,System.Windows.Forms.MouseEventArgs e)
{
this.dataGrid.Select( this.dataGrid.CurrentRowIndex );
EditForm newEditForm = new EditForm();
....
把当前行的信息传递给编辑的窗体
....
newEditForm.showdialog();
....
编辑完,再传回来修改表格
....
}

呕是菜菜菜鸟~,不知道说的对不对,不要笑话~
回复 点赞
popmonkey 2003年08月05日
去看看,可能就是你想要的
[url]http://xml.sz.luohuedu.net/xml/ShowDetail.asp?id=C83C3A4B-8571-4CE6-FBAC-35DC28D14389[url]
回复 点赞
aiwenzx 2003年08月05日
for winform?
for webform?
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告