2008-12-17 48 views
4

我在DataGridView中託管一個自定義編輯控件,其中記錄爲TextBoxButton,共同爲UserControl。我已經從DataGridViewColumn繼承了新列,並且DataGridViewTextBoxCell繼承了新單元格。在進入編輯模式時捕獲第一個字符 - 在DataGridView中自定義編輯控件

與正常DataGridViewTextBoxCell,如果按一個鍵時,細胞具有焦點,它將開始編輯模式您輸入的字符會出現在TextBoxEditingControl。但是,在我繼承的單元格中,按鍵上沒有任何值被傳遞。 (實際上,您必須手動傳遞InitializeEditingControl中的當前單元格值,否則根本不會顯示任何內容。)因此,鍵入的第一個字符(即開始編輯模式的那個字符)將丟失。

我試過OnKeyPress,OnKeyDownOnKeyUpDataGridViewCell但他們永遠不會被調用。然而,KeyEntersEditMode似乎確實被調用,並且只有當它正在檢查按下的按鍵時,所以這可能是一個開始的好地方。問題就變成了如何將KeyEventArgs轉換爲char。這對於字母和數字來說是微不足道的,但由於並非所有的鍵盤都是相同的,所以處理其他鍵最好是混亂和複雜的。如果有一個轉換器類會自動執行此操作,請賜教。

是否有其他人遇到此問題或找到了很好的解決方法?

注意:此問題適用於EditMode設置爲EditOnKeystroke的任何變體。設置爲EditOnEnter是我的項目的有效解決方法,但我想模擬TextBoxEditingControl的默認行爲。

回答

1

嘗試將用戶控件的KeyPreview設置爲true。然後檢查即使對於用戶控制,啓動編輯過程的鍵是否激活了keydown。如果是這樣,只要文本控件進入編輯模式,您就可以簡單地存儲和分配字符。

1

我的解決方案是覆蓋自定義UserControl上的OnKeyPress

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    _textBox.Text = e.KeyChar.ToString(); 
    _textBox.SelectionStart = 1; 
    _textBox.SelectionLength = 0; 
    base.OnKeyPress(e); 
} 
+0

UserControl是否從DataGridView中獲取傳遞給它的按鍵? – 2009-07-01 06:40:44

0

嗨 今天我有同樣的問題。我的解決方案是覆蓋CustomCell中的KeyEntersEditMode,並在那裏放置一些算法來轉換或確定一個字符是否有效傳遞給編輯控件。然後我將這個值作爲私有變量存儲。我重寫InitializeEditingControl方法並使用我的存儲值作爲控件的初始值。使用它之後,我將它設置爲空,以便以後沒有任何東西可以使用它。


private string startString; 
public override bool KeyEntersEditMode(KeyEventArgs e) 
{ 
    var result = base.KeyEntersEditMode(e); 
    if (e.KeyData == Keys.D1) 
    { 
     startString = "1"; 
    } 
    return result; 
} 

public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
{ 
    if(startString != null) 
    { 
     initialFormattedValue = startString; 
     startString = null; 
    } 
    base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); 
    var c = this.DataGridView.EditingControl as MyEditingControl; 
    string initialFormattedValueStr = initialFormattedValue as string; 
    if (initialFormattedValueStr == null) 
    { 
     c.Text = string.Empty; 
    } 
    else 
    { 
     c.Text = initialFormattedValueStr; 
     c.SelectionStart = initialFormattedValueStr.Length; 
    } 

} 
0

要得到第一個字符到您的TextBox做到這一點:添加映射

1)添加 「導入System.Runtime.InteropServices」 或使用,如果你喜歡C#

2)中的SendMessage user32.dll中

VB.Net example: 
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr 
End Function 

C# example: 
[DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

3)從用戶控件

重定向關鍵是你的文本框

4)有example on Microsoft page with the DataGridViewNumericUpDown here,請下載源碼。

5)完成。

相關問題