2009-07-06 34 views
15

Tôi có một vài TextBox trên WinForm. Tôi muốn trọng tâm di chuyển đến điều khiển tiếp theo khi nhấn phím Enter? Bất cứ khi nào một hộp văn bản giành quyền kiểm soát, nó cũng sẽ chọn văn bản, để bất kỳ chỉnh sửa nào sẽ thay thế văn bản hiện tại.Nhấn Enter để chuyển sang điều khiển kế tiếp

Cách tốt nhất để làm điều này là gì?

Trả lời

27

Tab là Enter: tạo điều khiển người dùng kế thừa hộp văn bản, ghi đè phương thức KeyPress. Nếu người dùng nhấn enter, bạn có thể gọi SendKeys.Send("{TAB}") hoặc System.Windows.Forms.Control.SelectNextControl(). Lưu ý rằng bạn có thể đạt được điều tương tự bằng cách sử dụng sự kiện KeyPress.

Tập trung Toàn bộ văn bản: Một lần nữa, qua ghi đè hoặc sự kiện, nhắm mục tiêu sự kiện GotFocus và sau đó gọi phương thức TextBox.Select.

+2

Gửi nét chính không phải là giải pháp tốt nhất khi một phương thức được cung cấp để hoàn thành nhiệm vụ. [SelectNextControl] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol.aspx) có thể thực hiện chức năng tương tự như gửi nút tab mà không có sự lộn xộn của việc gửi các khóa. – Fr33dan

2

Bạn có thể đặt trình xử lý KeyPress trên Hộp văn bản của mình và xem khóa nào đã được sử dụng.

Để xử lý lựa chọn văn bản, hãy đặt trình xử lý vào sự kiện GotFocus.

Bạn cũng có thể xem xét cách (hoặc nếu bạn cần) xử lý Hộp văn bản nhiều dòng.

10

Trong một sự kiện KeyPress, nếu người dùng nhấn Enter, gọi

SendKeys.Send("{TAB}") 

cách Nicest để thực hiện tự động lựa chọn các văn bản về việc tiếp nhận tập trung là để tạo ra một lớp con của TextBox trong dự án của bạn với ghi đè sau:

Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs) 
    SelectionStart = 0 
    SelectionLength = Text.Length 
    MyBase.OnGotFocus(e) 
End Sub 

Sau đó, sử dụng Hộp văn bản tùy chỉnh này thay cho Hộp văn bản chuẩn WinForms trên tất cả Biểu mẫu của bạn.

2

này có thể giúp:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    // 
    // Detect the KeyEventArg's key enumerated constant. 
    // 
    if (e.KeyCode == Keys.Enter) 
    { 
     MessageBox.Show("You pressed enter! Good job!"); 
    } 
} 
+0

Đây chỉ là một phần của câu trả lời ... –

20

Một vài ví dụ mã trong C# sử dụng SelectNextControl.

Chuyển động đầu tiên sang điều khiển tiếp theo khi nhấn ENTER.

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return)) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

Thứ hai sử dụng UPXUỐNG mũi tên để di chuyển qua các điều khiển.

private void Control_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Up) 
     { 
      this.SelectNextControl((Control)sender, false, true, true, true); 
     } 
     else if(e.KeyCode == Keys.Down) 
     { 
      this.SelectNextControl((Control)sender, true, true, true, true); 
     } 
    } 

Xem MSDN SelectNextControl Method

+0

Câu trả lời yêu thích của tôi. Điều này giả định rằng nhà phát triển đã thiết lập chính xác các thuộc tính TabStop & TabIndex cho các điều khiển mà chúng luôn luôn thực hiện. – user3902302

+0

Nếu bạn muốn áp dụng điều này trên tất cả các điều khiển của biểu mẫu hiện tại, bạn có thể đặt thuộc tính biểu mẫu KeyPreview thành True, đăng ký sự kiện KeyUp của biểu mẫu và thay thế "Người kiểm soát" bằng "ActiveControl" trong mã ở trên. –

0

Bạn cũng có thể viết kiểm soát của riêng bạn cho điều này, trong trường hợp bạn muốn sử dụng này thường xuyên hơn. Giả sử bạn có nhiều textbox trong một lưới điện, nó sẽ giống như thế này:

public class AdvanceOnEnterTextBox : UserControl 
{ 

    TextBox _TextBox; 
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null); 
    public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null); 


    public AdvanceOnEnterTextBox() 
    { 
     _TextBox = new TextBox(); 
     _TextBox.KeyDown += customKeyDown; 
     Content = _TextBox; 

    } 


    /// <summary> 
    /// Text for the TextBox 
    /// </summary> 
    public String Text 
    { 
     get { return _TextBox.Text; } 
     set { _TextBox.Text = value; } 
    } 


    /// <summary> 
    /// Inputscope for the Custom Textbox 
    /// </summary> 
    public InputScope InputScope 
    { 
     get { return _TextBox.InputScope; } 
     set { _TextBox.InputScope = value; } 
    } 


    void customKeyDown(object sender, KeyEventArgs e) 
    { 
     if (!e.Key.Equals(Key.Enter)) return; 

     var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox; 
     if (element != null) 
     { 
      int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element); 
      try 
      { 
       // Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween). 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus(); 
      } 
      catch (Exception) 
      { 
       // Close Keypad if this was the last AdvanceOnEnterTextBox 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false; 
       ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true; 
      } 
     } 
    } 
} 
+0

Bạn có thể làm điều này, tuy nhiên, có một phương pháp đơn lẻ trên biểu mẫu dễ dàng hơn nhiều so với viết lại tất cả các điều khiển mà bạn sẽ sử dụng, điều này sẽ dẫn đến việc có một khối mã lớn và gỡ lỗi chúng sau này. – AaA

0

Cố gắng sử dụng:

SendKeys.Send("{TAB}") 
1
private void txt_invoice_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_date.Focus(); 
    } 

    private void txt_date_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
      txt_patientname.Focus(); 
    } 

}

Các vấn đề liên quan