我希望導航到到達最頂端,只有當其他細胞。 實際發生的是它在第四行(如果不是用於文本換行的話將會是第一行)點擊'向上'鍵來導航。
你知道這是'按設計'還是可以避免?
我希望導航到到達最頂端,只有當其他細胞。 實際發生的是它在第四行(如果不是用於文本換行的話將會是第一行)點擊'向上'鍵來導航。
你知道這是'按設計'還是可以避免?
處理鍵盤輸入是DataGridView
和DataGridView
本身內部的編輯控件(類實現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。