Как сделать текстовое поле невыбираемым с помощью C # - PullRequest
9 голосов
/ 10 мая 2010

Я использую C # / .NET для приложения Windows Forms. У меня есть текстовое поле. Как сделать текстовое поле недоступным для выбора?

Я не хочу отключать полное текстовое поле.

Ответы [ 10 ]

11 голосов
/ 06 июля 2010

В событии «Ввод» текстового поля установите ActiveControl на другое значение:

    private void txtMyTextbox_Enter(object sender, EventArgs e)
    {
        ActiveControl = objMyOtherControl;
    }
4 голосов
/ 04 сентября 2013

IsHitTestVisible="False" не позволяет текстовому полю отображать ограничивающую рамку при наведении курсора или щелчке мышью. В моем случае этого было достаточно, чтобы воспользоваться функцией textwrapping текстового поля, делая его нечувствительным к действиям пользователя

3 голосов
/ 02 июля 2012

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

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

В программе построения форм (как бы она ни называлась) есть свойство для TextBox, называемое TabStop. Я установил значение false и текстовое поле только для чтения никогда не будет выделено. Проблема решена.

3 голосов
/ 10 мая 2010

У вас есть несколько вариантов:

  1. Используйте взамен Label.
  2. Установите textBox.Enabled = false для предотвращения выбора (см. здесь ).
2 голосов
/ 15 июля 2015

Сообщения, вызывающие текст, могут быть перехвачены и заблокированы.Я бы подумал, что EM_SETSEL будет все, что требуется.Тем не менее, даже когда мышь щелкает и перетаскивает, сообщение EM_SETEL отсутствует, но текст по-прежнему выделяется.Возможно, одно из сообщений имеет указатель на структуру, содержащую информацию.

Примечание: я не уверен, что это мешает всем способам выделения текста.

public class TextBox2 : TextBox {

    private const int EM_SETSEL = 0x00B1;
    private const int WM_LBUTTONDBLCLK = 0x203;
    private const int WM_MOUSEMOVE = 0x200;
    private const int WM_KEYDOWN = 0x100;
    private const int VK_CONTROL = 0x11;
    private const int VK_SHIFT = 0x10;

    public TextBox2() {
        this.ShortcutsEnabled = false; // disabled right click menu
        this.Cursor = Cursors.Default;

    }

    protected override void OnGotFocus(EventArgs e) {
        base.OnGotFocus(e);
        HideCaret(this.Handle); // doesn't work from OnHandleCreated
    }

    [DllImport("user32.dll")]
    public static extern bool HideCaret(IntPtr hWnd);

    public override bool PreProcessMessage(ref Message msg) {
        // prevents the user from using the SHIFT or CTRL + arrow keys to select text
        if (msg.Msg == WM_KEYDOWN)
            return true;

        return base.PreProcessMessage(ref msg);
    }

    protected override void WndProc(ref Message m) {
        if (m.Msg == EM_SETSEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDBLCLK)
            return;

        base.WndProc(ref m);
    }
}
1 голос
/ 10 мая 2010

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

0 голосов
/ 22 ноября 2015
private void textBox1_Click(object sender, EventArgs e)
        {
            this.textBox1.SelectionStart = this.textBox1.Text.Length;
        }

И не забывайте, что: только чтение = true

0 голосов
/ 24 февраля 2012

Это сработало очень хорошо для меня:

textBox.ReadOnly = true
0 голосов
/ 07 июля 2010

@ Mystere Man: Вам может понадобиться текстовое поле, которое нельзя использовать постоянно. Например, я разрешаю пользователю создавать текстовые поля на холсте и перетаскивать их. Чтобы запретить им выделять и перемещать текст при перетаскивании, мне нужно запретить ввод данных пользователем, и выбор текста также должен быть отключен, поскольку это вызывает задержку, которая портит мою функцию перетаскивания. В моем приложении пользователь может редактировать текстовое поле только после того, как он дважды щелкнул по нему, а затем должен щелкнуть за пределами текстового поля, чтобы иметь возможность снова его переместить.

У меня в основном есть этот код (где t это TextBox):

// Prevent text entry
t.IsReadOnly = true;

// Prevent text selection
t.Focusable = false;

Это поведение предпочтительнее, чем отключение всего элемента управления (t.Enabled = false), так как это также остановит события mousedown и doubleclick, что приведет к прекращению перетаскивания и перехода из режима редактирования в режим перетаскивания. Не говоря уже о том, что текстовое поле станет серым.

0 голосов
/ 10 мая 2010

Попробуйте использовать CanFocus свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...