DataGridView按回车换列-同行下一单元格
来源:互联网 发布:大数据平台 sap 编辑:程序博客网 时间:2024/05/17 08:55
DataGridView按回车换列怎样搞!
http://www.cnblogs.com/liruiba/archive/2009/05/07/1451249.html
大家知道,在WinForm开发的系统中,有Header-Detail的结构不少,比如订单、发货单、凭证等等,基本都是
Header-Detail结构,而在C#中要开发这样的程序还真有点麻烦,可能是新东西刚出来,要解决这样问题,还真
有点烦!同时一般比较好的系统中,你不用Mouse,用键盘就可以操作整个系统。为此,本人专门花了点时间来研
究这个问题的解决方案,以和大家共享!
1、首先是换行问题!
DataGridView中,你输入数据,按回车,不会跳到下一列去,而是跳到下一行,如果你想通过
KeyPress,KeyDown,KeyUp事件达到目的,好像没什么反应。于是我想肯定有其他的方法可以解决。就到微软的网
站上去查,果然有相关情况的介绍,但还是达不到我要的,于是改造一下,就OK了。
基本解决方法如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public class CustomDataGridView : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
{
return this.ProcessRightKey(keyData);
}
return base.ProcessDialogKey(keyData);
}
public new bool ProcessRightKey(Keys keyData)
{
Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
{
//第一种情况:只有一行,且当光标移到最后一列时
if ((base.CurrentCell.ColumnIndex == (base.ColumnCount - 1)) && (base.RowCount ==
1))
{
base.CurrentCell = base.Rows[base.RowCount - 1].Cells[0];
return true;
}
//第二种情况:有多行,且当光标移到最后一列时,移到下一行第一个单元
if ((base.CurrentCell.ColumnIndex == (base.ColumnCount - 1)) &&
(base.CurrentCell.RowIndex < (base.RowCount - 1)))
{
base.CurrentCell = base.Rows[base.CurrentCell.RowIndex + 1].Cells[0];
return true;
}
return base.ProcessRightKey(keyData);
}
return base.ProcessRightKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
return this.ProcessRightKey(e.KeyData);
}
//if (e.KeyCode == Keys.F4)
//{
// return this.ProcessRightKey(e.KeyData);
//}
return base.ProcessDataGridViewKey(e);
}
}
}
这样,你输入回车,不会再跳到下一行,而是跳到下一列,只有当你到最后一列时,才会换行。本人试过,基本
没有什么Bug,可以拿来做现成的用,大家在写程序时就不需要再写代码了,这个就OK。
那是不是说所有问题都解决了?不是,因为我们在使用的过程中,可能会在DataGridView中使用其他的快捷键,
比如微软的标准,按下F4,会弹出下拉列表(如:大家习惯的ComboBox控件就是很好的示例,将光标定位到
ComboBox,按下F4,肯定会下拉的,除非自已写来替换掉)。解决这个问题的方法类似!
2、实现快捷功能(键盘实现)。
其实这种方法还蛮简单的,你只需要在protected override bool ProcessDialogKey(Keys keyData)此方法
中更改,加一些相关的语句就OK了。如我测试用的:
protected override bool ProcessDialogKey(Keys keyData)
{
Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
{
return this.ProcessRightKey(keyData);
}
if (key == Keys.F4)
{
if (base.CurrentCell.ColumnIndex == 0)
{
Form1 frm = new Form1();
frm.Show();
}
}
return base.ProcessDialogKey(keyData);
}
大家可以看看,是不是很简单?
看起来比较简单,但大家在使用中还是需要注意:首先,你在这已经实现了,你就不要在KeyPress,KeyDown,
KeyUp中画蛇添足了。否则,你一定会碰到麻烦问题,然后一直调程序,蛮难找到的。另外,如果你不在这实现,
在KeyPress,KeyDown,KeyUp中好像也实现不了,我是试过,基本搞不定,试了几次没结果。就这样吧!哈哈!!
!
在DataGridView中按下回车跳到同行下一单元格的完美解决方案
http://www.szitr.com/bbs/thread-80-1-1.html
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Reflection;
namespace MasterSoft.WinUI
{
/// <summary>
/// 输入回车光标跳到同行下一单元格的DataGridView
/// Tony Wu
/// www.mastercn.net
/// </summary>
public class MDataGridView : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
//如果按键是回车键的话,则按Tab键来处理
if ((keyData & Keys.KeyCode) == Keys.Enter)
{
return this.ProcessTabKey(keyData);
}
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
//如果按键是回车键的话,则按Tab键来处理
if (e.KeyCode == Keys.Enter)
{
return this.ProcessTabKey(e.KeyCode);
}
return base.ProcessDataGridViewKey(e);
}
}
}
------------------
http://www.syncfusion.com/faq/windowsforms/Search/902.aspx
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
System.Windows.Forms.SendKeys.Send("{tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
用上面这个改写datagridview控件,或按键事件中写。总之,解决的方法就是把回车事件改成其他事件
Public Class MyDataGrid
Inherits DataGrid
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message,
keyData As System.Windows.Forms.Keys) As Boolean
If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
SendKeys.Send("{Tab}")
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function 'ProcessCmdKey
http://zhidao.baidu.com/question/46081562.html
我尝试了,有两种方法。
1.键盘事件handled法;拦截按键
在你的DataGridView_KeyDown 事件中加入
If e.KeyCode = Keys.Enter Then
e.Handled = True'意思是接管了这个按键信息
'这里加入你想要的事件比如
'dim frm as new form1
'frm.showdialog
End If
这种方法只能每个控件都写一次,好控制,但是有点麻烦。
2.单位类继承法。
在vs菜单里单击项目,添加类。然后确定。
在类中输入。
Public Class DataGridViewX
Inherits DataGridView
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal
keyData As System.Windows.Forms.Keys) As Boolean
If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
'这里是你想做的事情。
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
然后保存工程,生成。一定要生成。
然后回到form(可视化编辑模式,也就是你的主程序窗口,)
就好像你拖拽一个button一样,在工具箱里找到刚刚的
DataGridViewX
控件,然后拖拽,OK了,这个DataGridView具有特殊功能。
这个方法快捷有效~我就是这么做的~。
但是如果工程已经成型,数据庞大,不推荐这么做>_<~
这可是原创!~我不喜欢转载呵呵。
- DataGridView按回车换列-同行下一单元格
- DataGridView按回车换列
- DataGridView按回车换列怎样搞!
- 回车移到同行下一单元格,上下左右键也可用
- C# datagridview 实现单元格内容进行回车换行而不是换另一行数据
- 删除dataGridView中单元格数据(某列) 方法一
- DataGridView 选中行、列、单元格
- dataGridView 回车后移到右边单元格
- DataGridView 多层列头、合并单元格
- DataGridView 某一列单元格内容居中显示
- datagridview同列不同行动态嵌套不同类型控件
- 自动根据excel的某一列单元格的值计算,并将计算的结果给同行的下一列单元格赋值
- C# WinForm下DataGridView单元按钮列(一)
- dataGridView列和单元格,列号的排列
- dataGridView回车下一列的最佳方法
- 取得DataGridView中被选择的列、行、单元格,列、行、单元格选择设定
- 取得DataGridView中被选择的列、行、单元格,列、行、单元格选择设定
- ASP.NET中应用UltraWebGrid控件时在Cell中按一下回车后不能自动转到下一单元格的问题及解决办法
- c#(asp.net) updatepanel 局部刷新实例收藏
- ORACLE 11g&10g EM乱码问题解决
- Tween类 的缓动效果
- ASP.NET自定义控件属性的特性大全
- 分布计算环境笔记10——SOA、网格计算、云计算与P2P技术
- DataGridView按回车换列-同行下一单元格
- Basic Graphics Programming With The Xlib Library
- SAP概述
- CSS和Javascript中的style.display与style.visibility
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录
- 钱小样经典语录
- 软件开发规则——DO-178B/ED-12B学习笔记之四
- Ubuntu 安装 心得
- 做人的基本原则(看完终身受益)