2009-02-04 35 views
12

Tôi đã đọc ở đâu đó ở đây để ghi lại "Enter" đột quỵ chính trong một hộp văn bản và sử dụng nó như thể nhấn một nút Tôi nên đặt thuộc tính KeyPreview của biểu mẫu thành true và kiểm tra giá trị của KeyDown.Làm thế nào để xác định điều khiển nào trên biểu mẫu đã tập trung?

Tôi muốn có thể sử dụng chức năng này trên một số điều khiển TextBox mà mỗi nút được liên kết với một Nút khác.

Câu hỏi của tôi là làm cách nào để biết kiểm soát nào đã gây ra sự kiện KeyPress? Người gửi được liệt kê dưới dạng biểu mẫu.

G

Trả lời

5

Tôi đã tìm thấy giải pháp có vẻ hoạt động.

private void DeviceForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13 && tstxtDeviceFilter.Focused) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Tôi không thể không nghĩ rằng phải có cách tốt hơn!

--edit - EDIT - EDIT - EDIT - EDIT--

Vâng, sau khi xem xét những gợi ý dưới đây (cảm ơn bạn) Tôi đã tìm thấy một cách 'tốt hơn' đối với tôi trong này hoàn cảnh.

this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown); 

    private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Rõ ràng bằng cách bẫy sự kiện trên hộp văn bản chứ không phải biểu mẫu tôi không cần phải lo lắng về tiêu điểm. Một lần nữa tôi cảm thấy câm vì không nghĩ về điều đó quá lâu!

4

Mỗi biểu mẫu có thuộc tính cho nút "Chấp nhận" & nút "Hủy", đây là các nút được "nhấp" khi người dùng nhấn enter và thoát tương ứng.

Bạn có thể thay đổi các nút mặc định vì mỗi kiểm soát được trọng tâm (bạn có thể có một đã tập trung hander sự kiện mỗi nút, và chia sẻ nó với một tập hợp các hộp văn bản)

Nếu bạn làm điều này thì apperance của các nút thay đổi cung cấp cho người dùng một gợi ý trực quan cho họ biết nút nào là mặc định.

Ngoài ra, nếu bạn không muốn làm điều đó, bạn có thể sử dụng thuộc tính "ActiveControl" và kiểm tra xem bộ hộp văn bản nào thuộc về.

Bạn đã tự hỏi mình, nút mặc định sẽ là gì nếu nó không phải là một trong các hộp văn bản thse?

+0

Cảm ơn BW, đây là thông tin hữu ích cần biết. Tôi nghĩ rằng tôi sẽ đi với câu trả lời của riêng tôi trong trường hợp này vì tôi chỉ quan tâm đến "Enter" nhấn phím trong hộp văn bản duy nhất và chỉ khi nó có trọng tâm. Cảm ơn tho! –

+0

Nhận xét của G-cl đã cho tôi biết tôi đã đi sai ở đâu, cảm ơn chi tiết hơn. Ứng dụng của tôi chủ yếu chỉ là một hộp thoại này, vì vậy nó thậm chí không có nút và không bao giờ đóng trừ khi bạn thoát. –

3

Bạn đã thử Form.ActiveControl chưa?

+2

Tôi đã xem xét điều này nhưng nơi tôi mong đợi để tìm tên của điều khiển với tiêu điểm "this.ActiveControl.Name" là một chuỗi rỗng. Tôi có thể làm điều gì đó rất rõ ràng là sai! –

0

Bạn có thể sử dụng mã này làm điểm bắt đầu để nắm bắt các sự kiện chính của biểu mẫu. ActiveControl là một trong đó có trọng tâm. Trong ví dụ này, thật linh hoạt khi thêm các tác vụ khác vào "Enter" khi bạn đang ở trong các TextBox khác nhau trên biểu mẫu. Đó là VB.NET, nhưng bạn sẽ có thể dễ dàng chuyển đổi sang C#.

Private Sub MyForm_KeyDown(ByVal sender As Object, _ 
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     If Me.ActiveControl.Name = Me.TextBox1.Name Then 
      ' This is the TextBox we want to be active to run filterByDeviceSN() 
      filterByDeviceSN() 
     ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then 
      foo() 
     End If 
    End If 
End Sub 
+0

ActiveControl.Tên trả về một chuỗi rỗng. ActiveControl.Text hoạt động như mong đợi bằng cách trả về cùng một chuỗi như hiện tại trong hộp văn bản. "this.ActiveControl.Equals (tstxtDeviceFilter)" trả về false. Hãy suy nghĩ tôi sẽ đi với câu trả lời của riêng tôi cho bây giờ. Trừ khi có ai biết cách lấy tên? –

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