DataGridView按回車換列怎樣搞!

  大家知道,在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中好像也實現不了,我是試過,基本搞不定,試了幾次沒結果。就這樣吧!哈哈!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章