在 Windows Forms 應用程式中,使用者習慣按下 Enter 鍵來移動到下一個輸入欄位,而非預設的換行行為。早期常見的做法是為每個 TextBox 的 KeyPress 事件撰寫程式碼,但這樣不僅重複冗餘,維護起來也相當麻煩。
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
SendKeys.Send("{TAB}");
}
這種方式需要逐一掛載事件,且依賴 SendKeys 容易受焦點影響而產生不可預期的行為。
利用 Form.KeyPreview 屬性,讓表單優先接收所有按鍵事件,再在表單的 KeyPress 事件中統一判斷並呼叫 SelectNextControl 方法,即可實現全域的 Enter 鍵導航。
KeyPreview 設為 true(可在設計器屬性視窗或建構函式中設定)。KeyPress 事件中加入以下程式碼:private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
// 將焦點移至下一個控制項
this.SelectNextControl(this.ActiveControl, true, true, true, true);
e.Handled = true; // 標記已處理,避免發出聲音或後續處理
}
}
SelectNextControl(Control ctl, bool forward, bool tabStopOnly, bool nested, bool wrap)
ctl:起始控制項,通常為 ActiveControl。forward:true 向前尋找,false 向後。tabStopOnly:true 僅停駐於 TabStop=true 的控制項。nested:true 會進入容器控制項(如 GroupBox、Panel)內部尋找。wrap:true 到達最後一個控制項時回到第一個。SendKeys,行為更穩定可靠。這項技巧適用於所有 .NET Framework / .NET Core / .NET 5+ 的 Windows Forms 專案,是處理表單鍵盤導航的標準最佳實務。