如何在DataGrid控件中获得按键事件,谢谢!

wzgtly 2003-08-21 01:12:46
我在(用键盘的上,下键)选定了DataGrid控件的某一行后,需要按回车选定并退出DataGrid。
我的按键字符可以在单元格中显示,却无法用KeyDown事件捕捉到。
为什么?
请解答,谢谢!
...全文
59 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhgary 2003-08-21
  • 打赏
  • 举报
回复
你在DataGrid里面按键,当然捕捉不到,我不知道你要干什么,但是当你选中DataGrid的某行后(甚至是某格后),DataGrid是能够知道的,具体用法参考msdn中DataGrid的内部类HitTest和HitTestInfo
spiketang 2003-08-21
  • 打赏
  • 举报
回复
vb.net版本的可以这样:
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
spiketang 2003-08-21
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGrid1;
private DataSet myDataSet;
DateTime gridMouseDownTime;
private System.Windows.Forms.Label label1;

private System.ComponentModel.Container components = null;

public Form1()
{
InitializeComponent();
gridMouseDownTime = DateTime.Now;
SetUp();
}

private void SetUp()
{
// 用2个Table和1和Relation创建DataSet
MakeDataSet();
// 数据绑定
dataGrid1.SetDataBinding(myDataSet, "Customers");

//添加样式
AddCustomDataTableStyle();
}

private void MakeDataSet()
{
// 创建DataSet.
myDataSet = new DataSet("myDataSet");

// 创建2个DataTables.
DataTable tCust = new DataTable("Customers");

// 创建两个列,并添加到第一个表
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);

// 把tables添加到DataSet.
myDataSet.Tables.Add(tCust);


/* 计算tables.对每个客户,创建DataRow变量 */
DataRow newRow1;

// 添加记录到 Customers Table.
for(int i = 1; i < 4; i++)
{
newRow1 = tCust.NewRow();
newRow1["custID"] = (100*i).ToString();
tCust.Rows.Add(newRow1);
}

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"] = "河南";
}

private void AddCustomDataTableStyle()
{
DataGridTableStyle ts1 = new DataGridTableStyle();
ts1.MappingName = "Customers";
// 设置属性
ts1.AlternatingBackColor = Color.LightGray;

// 添加Textbox列样式,以便我们捕捉鼠标事件
DataGridTextBoxColumn TextCol = new DataGridTextBoxColumn();
TextCol.MappingName = "custID";
TextCol.HeaderText = "序号";
TextCol.Width = 100;

//添加事件处理器
TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
ts1.GridColumnStyles.Add(TextCol);

TextCol = new DataGridTextBoxColumn();
TextCol.MappingName = "custName";
TextCol.HeaderText = "姓名";
TextCol.Width = 100;
//添加事件处理器
TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
ts1.GridColumnStyles.Add(TextCol);

TextCol = new DataGridTextBoxColumn();
TextCol.MappingName = "custCity";
TextCol.HeaderText = "地址";
TextCol.Width = 100;
//添加事件处理器
TextCol.TextBox.MouseDown += new MouseEventHandler(TextBoxMouseDownHandler);
TextCol.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
ts1.GridColumnStyles.Add(TextCol);

dataGrid1.TableStyles.Add(ts1);

}

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
private void InitializeComponent()
{
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.label1 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
this.SuspendLayout();
//
// dataGrid1
//
this.dataGrid1.CaptionBackColor = System.Drawing.SystemColors.Info;
this.dataGrid1.CaptionForeColor = System.Drawing.SystemColors.WindowText;
this.dataGrid1.CaptionVisible = false;
this.dataGrid1.DataMember = "";
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(11, 9);
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(368, 144);
this.dataGrid1.TabIndex = 0;
this.dataGrid1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dataGrid1_MouseDown);
//
// label1
//
this.label1.Location = new System.Drawing.Point(4, 166);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(383, 23);
this.label1.TabIndex = 1;
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label1.Click += new System.EventHandler(this.Form1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(387, 201);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.label1,
this.dataGrid1});
this.Name = "Form1";
this.Text = "鼠标双击事件的例子";
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
this.ResumeLayout(false);

}
#endregion

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void TextBoxDoubleClickHandler(object sender, EventArgs e)
{
MessageBox.Show("双击事件发生。鼠标双击到的值:"+((TextBox)sender).Text.ToString());
}

private void TextBoxMouseDownHandler(object sender, MouseEventArgs e)
{
if(DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime))
{
MessageBox.Show("双击事件发生。鼠标双击到的值:"+((TextBox)sender).Text.ToString());
}
label1.Text = "TextBox 鼠标按下了。 ";
}

private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
gridMouseDownTime = DateTime.Now;
label1.Text = "DataGrid1 鼠标按下了。 ";
}

private void Form1_Click(object sender, System.EventArgs e)
{
label1.Text="";
}
private void label1_Click(object sender, System.EventArgs e)
{
label1.Text="";
}
}
wzgtly 2003-08-21
  • 打赏
  • 举报
回复
我用的是c#,.net环境,具体该怎么操作呢?
lovered 2003-08-21
  • 打赏
  • 举报
回复
做个记号
xiaoqi333 2003-08-21
  • 打赏
  • 举报
回复
up
tflantian 2003-08-21
  • 打赏
  • 举报
回复
在DataGrid中添加一列隐藏的模板列,模板列上放个Button(快捷键设为你需要的键)

在DataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)事件中
if(e.Item.AccessKey=='你的快捷键')
{
....
}

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧