2017-03-27 43 views
1

enter image description hereDataGridView的導航單元上KEYUP裹着文本

我希望導航到到達最頂端,只有當其他細胞。 實際發生的是它在第四行(如果不是用於文本換行的話將會是第一行)點擊'向上'鍵來導航。

你知道這是'按設計'還是可以避免?

回答

2

處理鍵盤輸入是DataGridViewDataGridView本身內部的編輯控件(類實現IDataGridViewEditingControl)共享的責任。

如果您查看DataGridView中的源代碼,您將看到編輯控件需要決定在何處處理按鍵。基本上,DataGridView要求IDataGridViewEditingControl(在你的情況下,DataGridViewTextBoxEditingControl)「你想要處理它嗎?」通過調用 EditingControlWantsInputKey方法。

此方法包含一個錯誤,或更好的過度安慰。代碼的意圖似乎是「如果我已經在第一行,KeyUp意味着用戶想要移動到我之上的單元格」。不幸的是,在代碼中,「第一行」是第一個\r\n之前的任何內容,而不考慮自動換行。這是你正在觀察的。

幸運的是EditingControlWantsInputKey是公共虛擬的,所以你可以從DataGridViewTextBoxEditingControl派生出來,並根據你的需要調整行爲。

例如:

public class MyDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl { 
    public override bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) { 
     switch (keyData & Keys.KeyCode) 
     { 
      case Keys.Up: 
       return false; // never pass KeyUp to the DataGrid 
     ... 
     // call base.EditingControlWantsInputKey when 
     // you want to retain the standard behaviour 

這是過於簡單(它只是禁用「移動到上面的單元格」的行爲,你可能要採取不同的行動,也許測量文本lenght在「真實」裝修第一在細胞內線路通過Graphics.MeasureString,這是給你,你想獲得什麼。

然後,它是相對容易replace the standard controls for DataGridView cells with your own