Làm cách nào để xóa tiêu điểm khỏi TextBox trong WinForms?


110

Tôi cần xóa tiêu điểm khỏi một số TextBox. Tôi đã thử sử dụng:

textBox1.Focused = false;

ReadOnlyGiá trị tài sản của nó là true.

Sau đó, tôi đã thử đặt tiêu điểm trên biểu mẫu, để xóa nó khỏi tất cả các TextBox, nhưng điều này cũng không hoạt động:

this.Focus();

và hàm trả về falsekhi hộp văn bản được chọn.

Vì vậy, làm cách nào để xóa tiêu điểm khỏi TextBox?

Câu trả lời:


113

Bạn cần một số điều khiển có thể lấy nét khác để di chuyển tiêu điểm đến.

Lưu ý rằng bạn có thể đặt Tiêu điểm thành Nhãn. Bạn có thể muốn xem xét vị trí bạn muốn phím [Tab] sử dụng tiếp theo.

Cũng lưu ý rằng bạn không thể đặt nó thành Biểu mẫu. Các điều khiển vùng chứa như Biểu mẫu và Bảng điều khiển sẽ chuyển Tiêu điểm cho điều khiển con đầu tiên của chúng. Đó có thể là TextBox mà bạn muốn nó di chuyển khỏi đó.


Cảm ơn; Tôi vừa thử tập trung vào một nhãn và bây giờ hộp văn bản trở nên không tập trung. Có vẻ như bạn không thể tập trung vào một biểu mẫu vì lý do nào đó.
Callum Rogers

7
Kiểm soát vùng chứa (Biểu mẫu, Bảng điều khiển) sẽ chuyển Tiêu điểm cho kiểm soát con đầu tiên của họ.
Henk Holterman,

Gợi ý tuyệt vời. Điều này đã giải quyết vấn đề của tôi. Tôi đang sử dụng KeyPress chống lại chính biểu mẫu và có một số nút, v.v. Vấn đề là ứng dụng đang lấy đầu vào từ trình đọc thẻ, vì vậy nếu tiêu điểm biến mất khỏi chính biểu mẫu thì mọi thứ sẽ tan vỡ. Tập trung vào một nhãn sau khi nhấp vào nút đã giải quyết được vấn đề của tôi. Cám ơn rất nhiều!
joelc

62

Tập trung vào nhãn không có tác dụng với tôi, tôi phải làm gì đó label1.Focus()đúng không? hộp văn bản vẫn có tiêu điểm khi tải biểu mẫu, tuy nhiên thử câu trả lời của Velociraptors , đã hiệu quả với tôi, đặt điều khiển Hoạt động của Biểu mẫu thành nhãn như sau:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

7
tôi ước tôi có thể cung cấp cho bạn hàng triệu mũi tên lên. tôi đã thử MỌI THỨ khác mà mọi người đề xuất, đây là cách duy nhất hoạt động. đối với một số lý do, textbox LUÔN lấy trộm trọng tâm từ tất cả mọi thứ ...
eladyanai

3
Điều này cũng hoạt động đối với các điều khiển vùng chứa như bảng điều khiển. Tôi chỉ muốn xóa tiêu điểm hoàn toàn và nó đã hoạt động:this.ActiveControl = panelOnMyForm;
Tim Schmelter, 09/04

52

Bạn có thể thêm mã sau:

this.ActiveControl = null;  //this = form

7
Tôi tin rằng đây là câu trả lời tốt nhất. Rất nhiều phương pháp khác như "Focus" nếu bạn đọc MSDN, được liệt kê là các phương pháp cấp thấp cho các nhà thiết kế điều khiển. Nếu bạn muốn mọi thứ khác "không được chọn" thì đây có vẻ là cách tiếp cận dễ dàng nhất vì nó chỉ là một dòng nhỏ.
Rostov

1
Đây có thể là một nửa lý do Microsoft thêm thuộc tính này ngay từ đầu.
Panzercrisis

Đây có vẻ là giải pháp thanh lịch nhất, nó hoạt động hoàn hảo trong trường hợp của tôi.
NetWave

Tôi thực sự muốn câu trả lời này hoạt động vì nó có vẻ đúng như vậy, nhưng trong trường hợp của tôi, nó không hoạt động vì trong khi nó kích hoạt sự kiện Rời khỏi, nó không kích hoạt các sự kiện Xác thực / Đã xác thực.
Rhys Jones

32

Thử tắt và bật hộp văn bản.


5
Điều này hoạt động khá trơn tru vì nó tự động chọn điều khiển tiếp theo trong danh sách tab trong thời gian chờ đợi.
Nick

3
Tôi đang phát triển trong Silverlight bằng cách sử dụng MVVM và triển khai điều này bằng cách sử dụng hành vi nhắm mục tiêu TextBox. Vì tôi không có một UIElement nào khác tiện dụng để đặt tiêu điểm cho giải pháp Tắt / Bật đã làm việc kỳ diệu. Cảm ơn!
Albert Oldfield

Làm cách nào để vô hiệu hóa nó?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;sẽ vô hiệu hóa hộp văn bản của bạn. và đặt nó thành truesẽ kích hoạt lại nó.
Raktim Biswas

24

Bạn cũng có thể thiết lập các hình thức activecontrolsở hữu để nullnhư

ActiveControl = null;

7
Tôi hy vọng mọi người di chuyển xuống tất cả các cách này và không chỉ cần sử dụng workaround đánh dấu là câu trả lời
makoshichi

Vẫn là câu trả lời hay nhất cho đến ngày nay, anh bạn, hãy ủng hộ tôi.
xoxel

8

Focusđặt tiêu điểm đầu vào, vì vậy việc đặt nó thành biểu mẫu sẽ không hoạt động vì biểu mẫu không chấp nhận đầu vào. Hãy thử đặt thuộc tính của biểu mẫu thành ActiveControlmột điều khiển khác. Bạn cũng có thể sử dụng Selectđể chọn một điều khiển cụ thể hoặc SelectNextControlđể chọn điều khiển tiếp theo theo thứ tự tab.


1
Đã thử mọi thứ khác ở đây và Select()làm việc cho tôi.
Derek W

8

Hãy thử cái này:

Đầu tiên thiết lập thứ tự tab.

Sau đó, trong sự kiện tải biểu mẫu, chúng ta có thể gửi một phím tab theo chương trình đến ứng dụng. Vì vậy, ứng dụng đó sẽ tập trung vào contol đầu tiên theo thứ tự tab.

trong tải biểu mẫu thậm chí viết dòng này.

SendKeys.Send("{TAB}");

Điều này đã làm việc cho tôi.


4

Bài đăng này dẫn tôi đến việc này:

ActiveControl = null;

Điều này cho phép tôi nắm bắt tất cả các đầu vào bàn phím ở cấp cao nhất mà không cần các điều khiển khác.


3

Tôi đã tìm thấy một giải pháp thay thế tốt! Nó hoạt động tốt nhất đối với tôi, mà không cần tập trung vào thứ khác.

Hãy thử điều đó:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

3

Tôi đã thực hiện điều này trên điều khiển tùy chỉnh của mình, tôi đã thực hiện điều này onFocus ()

this.Parent.Focus();

Vì vậy, nếu texbox tập trung - nó ngay lập tức tập trung văn bản cha (biểu mẫu hoặc bảng điều khiển ...) Đây là tùy chọn tốt nếu bạn muốn thực hiện điều này trên điều khiển tùy chỉnh.


2

Có vẻ như tôi không phải đặt tiêu điểm cho bất kỳ yếu tố nào khác. Trên ứng dụng Windows Phone 7, tôi đã sử dụng phương pháp Focus để bỏ đặt Tiêu điểm của hộp văn bản.

Đưa ra lệnh sau sẽ không đặt tiêu điểm:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

Nó hoạt động với tôi, nhưng tôi không biết tại sao nó không hoạt động với bạn: /


2

Một giải pháp đơn giản sẽ là loại bỏ tiêu điểm, chỉ cần tạo lớp của riêng bạn:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

Chính xác là loại giải pháp tôi đang tìm kiếm. Cảm ơn!
LeftyCoder

1
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

0

Cách tôi vượt qua nó là đặt tất cả các điều khiển winform của tôi. Tôi tạo tất cả các nhãn và điều khiển không chọn winform dưới dạng thứ tự tab 0, sau đó điều khiển đầu tiên của tôi dưới dạng thứ tự tab 2 và sau đó tăng thứ tự của mỗi điều khiển có thể chọn lên 1, vì vậy 3, 4, 5, v.v.

Bằng cách này, khi Winforms của tôi khởi động, TextBox đầu tiên không có tiêu điểm!


0

bạn có thể làm điều này bằng hai phương pháp

  • chỉ cần đặt thuộc tính "TabStop" của hộp văn bản mong muốn thành false bây giờ nó sẽ không tập trung ngay cả khi bạn có một trường văn bản
  • kéo hai hộp văn bản

    1. hiển thị một cái mà bạn không muốn có foucus là hộp văn bản1
    2. làm cho cái thứ hai ẩn đi và chuyển đến thuộc tính của trường văn bản đó và chọn

tabindex giá trị thành 0 của textbox2

  1. và chọn tabindex của textbox1 đến 1 của bạn bây giờ nó sẽ không tập trung vào textbox1

0

Nếu tất cả những gì bạn muốn là hiệu ứng quang học mà hộp văn bản không có lựa chọn màu xanh lam trên toàn bộ nội dung của nó, chỉ cần chọn không có văn bản:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

Sau đó, khi thêm nội dung với .Text += "...", sẽ không có lựa chọn màu xanh lam nào được hiển thị.


0

Vui lòng thử đặt TabStopthànhFalse kiểm soát tầm nhìn của bạn mà không được tập trung.

Ví dụ:

txtEmpID.TabStop = false;

-1

Trong hàm tạo của Biểu mẫu hoặc UserControl, hãy ghi TextBox

SetStyle(ControlStyles.Selectable, false);

Sau khi InitializeComponent (); Nguồn: https://stackoverflow.com/a/4811938/5750078

Thí dụ:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.