首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForm TextBox 按 Enter 移動焦點:消除系統提示音的標準做法

     編輯:程式設計綜合問答

問題現象


private void textBox_inputStartNO_KeyPress(object sender, KeyPressEventArgs e) {
    if (e.KeyChar == (char)Keys.Enter) {
        textBox_inputCrurrEndNO.Focus();  // 焦點跳轉成功
    }
}
// 副作用:每次按 Enter 系統發出「丁」提示音

提示音成因

KeyPress 事件中,Enter 字元被視為「對話方塊預設按鈕觸發」,系統播放預設提示音。若未標記事件已處理,聲音會響起。

三種標準解決方案

1. 標記事件已處理(最簡單)


private void textBox_KeyPress(object sender, KeyPressEventArgs e) {
    if (e.KeyChar == (char)Keys.Enter) {
        e.Handled = true;  // 告訴系統:此鍵已處理,不再傳遞、不播放聲音
        textBoxNext.Focus();
    }
}

2. 使用 `KeyDown` + `SuppressKeyPress`


private void textBox_KeyDown(object sender, KeyEventArgs e) {
    if (e.KeyCode == Keys.Enter) {
        e.SuppressKeyPress = true;  // 抑制後續 KeyPress
        textBoxNext.Focus();
    }
}

3. 統一處理:`TabIndex` + `SendKeys.Send("{TAB}")`


private void textBox_KeyPress(object sender, KeyPressEventArgs e) {
    if (e.KeyChar == (char)Keys.Enter) {
        e.Handled = true;
        SendKeys.Send("{TAB}");  // 依 TabIndex 自動跳下一個控制項
    }
}
  • 設計時按 TabIndex 設定焦點順序(0, 1, 2...)。
  • 無需硬編碼目標控制項名稱,維護性佳。

原答案參考

「設置好控件的 TabIndex,然後使用 SendKeys.Send("{tab}");」

進階:表單級統一處理


protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.Enter) {
        // 找到當前焦點控制項,送出 TAB
        SendKeys.Send("{TAB}");
        return true;  // 已處理
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved