как убрать фокус из textbox в winforms?

<p>мне нужно убрать фокус с нескольких текстовых полей. я пытался с помощью:</p><pre><code>textbox1.focused = false; </code></pre><p>его значение свойства <code>readonly</code> равно <code>true</code>.</p><p>затем я попытался установить фокус на форме, чтобы удалить ее из всех текстовых полей, но это также не работает:</p><pre><code>this.focus(); </code></pre><p>и функция возвращает <code>false</code>, когда текстовое поле выбрано.</p><p>итак, как мне удалить фокус из textbox?</p>

<p>вам нужно другое фокусируемое управление, чтобы переместить фокус на.</p><p>обратите внимание, что вы можете установить фокус на метку. возможно, вы захотите подумать, где вы хотите, чтобы клавиша [tab] взяла его дальше.</p><p>также обратите внимание, что вы не можете установить его в форму. контейнерные элементы управления, такие как form и panel, передадут focus своему первому дочернему элементу управления. которым может быть textbox, от которого вы хотели бы отказаться.</p>

<p>сосредоточиться на лейбле у меня не получилось, сделать что-то вроде <code>label1.focus()</code> верно? текстовое поле все еще имеет фокус при загрузке формы, однако попытка <a href="https://stackoverflow.com/users/122215/velociraptors">velociraptors</a> answer сработала для меня, установив элемент управления active формы в метку следующим образом:</p><pre class="lang-cs prettyprint-override"><code>private void form1\_load(object sender, eventargs e) { this.activecontrol = label1; } </code></pre>

<p>вы можете добавить следующий код:</p><pre><code>this.activecontrol = null; //this = form </code></pre>

<p>попробуйте отключить и включить текстовое поле.</p>

<p>вы также можете установить свойство <code>activecontrol</code> для <code>null</code> как</p><pre><code>activecontrol = null; </code></pre>

<p><code>focus</code> устанавливает фокус ввода, поэтому установка его на форму не будет работать, потому что формы не принимают ввод. попробуйте установить свойство формы <code>activecontrol</code> для другого элемента управления. вы также можете использовать <code>select</code> для выбора определенного элемента управления или <code>selectnextcontrol</code> для выбора следующего элемента управления в порядке вкладок.</p>

<p>попробуй это:</p><p>сначала настройте порядок вкладок.</p><p>затем в событии загрузки формы мы можем программно отправить нажатие клавиши табуляции в приложение. так что приложение будет фокусироваться на первом контроле в порядке табуляции.</p><p>в форме загрузки даже написать эту строку.</p><pre><code>sendkeys.send("{tab}"); </code></pre><p>это сработало для меня.</p>

<p>этот пост побудил меня сделать это:</p><pre><code>activecontrol = null; </code></pre><p>это позволяет мне захватить весь ввод с клавиатуры на верхнем уровне без других сумасшедших элементов управления.</p>

<p>я нашел хорошую альтернативу! это работает лучше всего для меня, не сосредотачиваясь на чем-то другом.</p><p>попробуй это:</p><pre><code>private void richtextbox\_keydown(object sender, keyeventargs e) { e.suppresskeypress = true; } </code></pre>

<p>кажется, мне не нужно фокусироваться на других элементах. в приложении для windows phone 7 я использовал метод focus, чтобы отменить фокус текстового поля.</p><p>задание следующей команды не установит фокус:</p><pre><code>void searchbox\_keydown(object sender, system.windows.input.keyeventargs e) { if (e.key == key.enter) { focus(); } } </code></pre><p> <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx">http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx</a> </p><p>это сработало для меня, но я не знаю, почему это не сработало для вас: /</p>

<p>простым решением было бы убить фокус, просто создайте свой собственный класс:</p><pre><code>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); } } </code></pre>

<p>я сделал это на моем пользовательском элементе управления, я сделал это onfocus ()</p><pre><code>this.parent.focus(); </code></pre><p>так что, если texbox сфокусирован - он сразу фокусирует родительское поле textbox (форму или панель ...). это хороший вариант, если вы хотите сделать это на пользовательском элементе управления.</p>

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

<p>если все, что вам нужно, это оптический эффект, при котором текстовое поле не выделяется синим цветом по всему содержимому, просто выберите текст:</p><pre><code>textbox\_log.selectionstart = 0; textbox\_log.selectionlength = 0; textbox\_log.select(); </code></pre><p>после этого при добавлении контента с помощью <code>.text += "..."</code> выделение синим цветом не будет отображаться.</p>

<p>способ, которым я обхожу это, должен поместить все мои элементы управления winform. я делаю все метки и не выбирая элементы управления winform как порядок табуляции 0, затем мой первый элемент управления как порядок табуляции 2, а затем увеличиваю порядок каждого выбираемого элемента управления на 1, так что 3, 4, 5 и т.д.</p><p>таким образом, когда мои winforms запускаются, первый textbox не имеет фокуса!</p>

<p>пожалуйста, попробуйте установить <code>tabstop</code> в <code>false</code> для вашего контроля просмотра, который не сфокусирован.</p><p>например:</p><pre><code>txtempid.tabstop = false; </code></pre>

<p>вы можете сделать это двумя способами</p><ul> <li>просто установите для свойства tabstop нужного текстового поля значение false, теперь оно не будет фокусироваться, даже если у вас есть одно текстовое поле</li> <li> <p>перетащите два текстовых поля</p> <ol> <li>сделать один видимый, на котором вы не хотите foucus, который является textbox1</li> <li>сделайте второй невидимым и перейдите к свойствам этого текстового поля и выберите</li> </ol> </li> </ul><blockquote> <p>значение tabindex до 0 из textbox2</p> </blockquote><ol start="3"> <li>и выберите tabindex вашего textbox1 к 1, теперь он не будет фокусироваться на textbox1</li> </ol>