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具有特殊功能。

这个方法快捷有效~我就是这么做的~。
但是如果工程已经成型,数据庞大,不推荐这么做>_<~


这可是原创!~我不喜欢转载呵呵。

原创粉丝点击