c# убрать - Как удалить фокус из TextBox в WinForms?




элемента на (16)

Я сделал это на моем пользовательском контроле, я сделал это onFocus ()

this.Parent.Focus();

Поэтому, если texbox сфокусирован - он мгновенно фокусирует текстовое поле родителя (форму или панель ...) Это хороший вариант, если вы хотите сделать это на настраиваемом элементе управления.

Мне нужно удалить фокус из нескольких текстовых полей. Я пробовал использовать:

textBox1.Focused = false;

Свойство свойства ReadOnly true .

Затем я попытался настроить фокус на форме, чтобы удалить ее из всех текстовых блоков, но это также не работает:

this.Focus();

и функция возвращает false при выборе текстового поля.

Итак, как удалить фокус из TextBox?


Простым решением было бы убить фокус, просто создайте свой собственный класс:

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);
    }
}

Сосредоточение внимания на ярлыке не сработало для меня, делая что-то вроде label1.Focus() правильно? текстовое поле все еще имеет фокус при загрузке формы, однако, пытаясь ответить Velociraptors , работал для меня, устанавливая активный элемент формы на ярлык следующим образом:

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

    //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();
                });
            }
        }
    }

Попробуйте установить TabStop в False для контроля вашего вида, который не фокусируется.

Например:

txtEmpID.TabStop = false;

Я нашел хорошую альтернативу! Он работает лучше всего для меня, не сосредотачиваясь на чем-то другом.

Попробуй это:

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

Способ, которым я обхожусь, это разместить все мои элементы управления winform. Я делаю все ярлыки и не выбираю элементы управления winform как порядок вкладок 0, затем мой первый элемент управления как порядок вкладок 2, а затем увеличиваю порядок каждого выбираемого элемента управления на 1, так что 3, 4, 5 и т. Д. ...

Таким образом, когда мои Winforms запускаются, первый TextBox не имеет фокуса!


Если все, что вам нужно, - это оптический эффект, при котором текстовое поле не имеет синего выделения по всему его содержимому, просто выберите текст:

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

После этого при добавлении содержимого с .Text += "..." синий цвет не будет показан.


Этот пост заставил меня сделать это:

ActiveControl = null;

Это позволяет мне захватывать все входные данные клавиатуры на верхнем уровне, без использования других элементов управления.


В конструкторе формы или UserControl, где выполняется запись TextBox

SetStyle(ControlStyles.Selectable, false);

После InitializeComponent (); Источник: https://.com/a/4811938/5750078

Пример:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }

Вы можете добавить следующий код:

this.ActiveControl = null;  //this = form

вы можете сделать это двумя способами

  • просто измените свойства «TabStop» желаемого текстового поля на false, теперь он не будет сфокусирован, даже если у вас есть одно текстовое поле
  • перетащить два текстовых поля

    1. сделать видимым, на котором вы не хотите foucus, который является textbox1
    2. сделать второй невидимым и перейти к свойствам этого текстового поля и выбрать

Значение tabindex до 0 текстового поля2

  1. и выберите tabindex вашего текстового поля 1 в 1, теперь он не будет фокусироваться на текстовом поле1

Кажется, что мне не нужно фокусировать внимание на каких-либо других элементах. В приложении Windows Phone 7 я использовал метод Focus, чтобы отключить фокус текстового поля.

Предоставление следующей команды приведет к тому, что фокус ничего не изменит:

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

Это сработало для меня, но я не знаю, почему это не сработало для вас: /


Попробуйте отключить и включить текстовое поле.


Для перемещения фокуса вам понадобится другой настраиваемый элемент управления.

Обратите внимание, что вы можете установить Focus на метку. Возможно, вам захочется рассмотреть, где вы хотите, чтобы клавиша [Tab] приняла его дальше.

Также обратите внимание, что вы не можете установить его в форму. Контейнерные элементы управления, такие как Form и Panel, передают Focus на свой первый дочерний элемент управления. Который может быть TextBox, в котором вы хотели, чтобы он ушел.


Извините, что разбудил мертвых, но я думал, что кто-то может найти это полезным для дальнейшего использования.

Вот как я справляюсь с этим. Он обрабатывает числа с плавающей запятой, но может быть легко изменен для целых чисел.

В основном вы можете только нажать 0 - 9 и .

У вас может быть только 0 до .

Все остальные символы игнорируются и позиция курсора сохраняется.

    private bool _myTextBoxChanging = false;

    private void myTextBox_TextChanged(object sender, EventArgs e)
    {
        validateText(myTextBox);
    }

    private void validateText(TextBox box)
    {
        // stop multiple changes;
        if (_myTextBoxChanging)
            return;
        _myTextBoxChanging = true;

        string text = box.Text;
        if (text == "")
            return;
        string validText = "";
        bool hasPeriod = false;
        int pos = box.SelectionStart;
        for (int i = 0; i < text.Length; i++ )
        {
            bool badChar = false;
            char s = text[i];
            if (s == '.')
            {
                if (hasPeriod)
                    badChar = true;
                else
                    hasPeriod = true;
            }
            else if (s < '0' || s > '9')
                badChar = true;

            if (!badChar)
                validText += s;
            else
            {
                if (i <= pos)
                    pos--;
            }
        }

        // trim starting 00s
        while (validText.Length >= 2 && validText[0] == '0')
        {
            if (validText[1] != '.')
            {
                validText = validText.Substring(1);
                if (pos < 2)
                    pos--;
            }
            else
                break;
        }

        if (pos > validText.Length)
            pos = validText.Length;
        box.Text = validText;
        box.SelectionStart = pos;
        _myTextBoxChanging = false;
    }

Вот быстро модифицированная версия int:

    private void validateText(TextBox box)
    {
        // stop multiple changes;
        if (_myTextBoxChanging)
            return;
        _myTextBoxChanging = true;

        string text = box.Text;
        if (text == "")
            return;
        string validText = "";
        int pos = box.SelectionStart;
        for (int i = 0; i < text.Length; i++ )
        {
            char s = text[i];
            if (s < '0' || s > '9')
            {
                if (i <= pos)
                    pos--;
            }
            else
                validText += s;
        }

        // trim starting 00s 
        while (validText.Length >= 2 && validText.StartsWith("00")) 
        { 
            validText = validText.Substring(1); 
            if (pos < 2) 
                pos--; 
        } 

        if (pos > validText.Length)
            pos = validText.Length;
        box.Text = validText;
        box.SelectionStart = pos;
        _myTextBoxChanging = false;
    }




c# .net winforms textbox focus