2010-12-13 32 views
6

Tôi có một ứng dụng biểu mẫu C# windows với một vài hộp văn bản và một nút. Tôi muốn tìm ra các hộp văn bản đã tập trung và làm điều gì đó với nó. Tôi đã viết mã sau nhưng tất nhiên nó sẽ không hoạt động vì nút sẽ được lấy nét ngay khi nó được nhấn.Tìm điều khiển với tiêu điểm cuối cùng

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    foreach (Control t in this.Controls) 
    { 
     if (t is TextBox) 
     { 
      if (t.Focused) 
      { 
       MessageBox.Show(t.Name); 
      } 
     } 
    } 
} 
+1

Nút cũng có thể lấy nét thông qua nhấn Tab. – 26071986

Trả lời

15

Không có thuộc tính hoặc chức năng được tích hợp để theo dõi kiểm soát tập trung trước đó. Như bạn đã đề cập, bất cứ khi nào nút được nhấp, nó sẽ lấy nét. Nếu bạn muốn theo dõi các hộp văn bản đã được tập trung trước đó, bạn sẽ phải làm điều đó cho mình.

Một cách để đi về việc này sẽ có thêm một biến lớp học cấp mẫu của bạn chứa một tham chiếu đến điều khiển textbox hiện tập trung:

private Control _focusedControl; 

Và sau đó trong trường hợp GotFocus cho mỗi bạn điều khiển hộp, bạn sẽ chỉ cập nhật các biến _focusedControl với textbox rằng:

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    _focusedControl = (Control)sender; 
} 

Bây giờ, bất cứ khi nào một nút được nhấp (lý do tại sao bạn đang sử dụng các sự kiện MouseDown như trong câu hỏi của bạn thay vì các butto ? Sự kiện Click n của), bạn có thể sử dụng tài liệu tham khảo để điều khiển textbox trước đó tập trung được lưu trong biến lớp cấp tuy nhiên bạn thích:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (_focusedControl != null) 
    { 
     //Change the color of the previously-focused textbox 
     _focusedControl.BackColor = Color.Red; 
    } 
} 
3

Bạn có thể có thể đăng ký vào các sự kiện GotFocus của textbox của bạn, lưu trữ các textbox (bạn sẽ nhận được với các tham số người gửi) trong một lĩnh vực, và sử dụng lĩnh vực này khi bạn nhấn nút của bạn?

2

Tôi sẽ sử dụng sự kiện button1_MouseHover. Khi sự kiện này được kích hoạt, ActiveControl là cho đến khi trỏ đến điều khiển trước đó, mà bạn có thể lưu trữ dưới dạng _focusedControl.

Tất nhiên, thao tác này sẽ không hoạt động nếu người dùng nhấp vào nút.

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