Как я выделяю Text в Текстовом поле в программе C# Winforms?

У меня есть программа C# Winforms с несколькими текстовыми полями. Я использовал свойства для каждого поля для размещения текста в них, объясняя пользователю, какое значение входит в них. Я хочу, чтобы текст выделился каждый раз, когда пользователь выбирает то поле. Или переключением вкладок или щелчком мышью. Я не должен буду делать этого, если существует способ отобразить, какое значение входит в текстовое поле где-нибудь за пределами него.

Я попробовал метод Textbox.select, но он не имел никакого эффекта. То же с этим.

Вот Снимок экрана моей программы.

Мой код:

    private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        grapplingText1.SelectionStart = 0;
        grapplingText1.SelectionLength = grapplingText1.Text.Length;

Это сделает или более требуется?

7
задан Community 23 May 2017 в 12:18
поделиться

6 ответов

Как насчет того, чтобы назначить ToolTip на TextBox и поместить внутрь него все «поговорим, для чего это текстовое поле»?

Просто перетащите всплывающую подсказку внутри формы. И затем в каждом свойстве TextBox у вас должна быть дополнительная запись в разделе «Разное» ToolTip в toolTip1 (или как там оно будет, если вы его переименуете).

Затем, когда пользователь наводит курсор на TextBox (Только чтение / Отключено TextBox , похоже, не отображает всплывающие подсказки) и останавливается там на 1 секунду, всплывающая подсказка должна отображаться с правильной информацией.

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

Для работы с WaterMark, чтобы вам не пришлось долго настраивать события, заботиться о SelectAll и т. Д., Вы можете сделать это следующим образом. Создайте новый файл watermark.cs и замените его этим кодом. Убедитесь, что вы изменили пространство имен, чтобы оно соответствовало пространству имен вашей программы.

#region
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

#endregion

namespace Watermark {
    public static class TextBoxWatermarkExtensionMethod {
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
        public static void SetWatermark(this TextBox textBox, string watermarkText) {
            SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }
    }
}
   internal class WatermarkTextBox : TextBox {
    private const uint ECM_FIRST = 0x1500;
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
    private string watermarkText;
    public string WatermarkText {
        get { return watermarkText; }
        set {
            watermarkText = value;
            SetWatermark(watermarkText);
        }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText);
    }
}

В своей форме вы активируете его следующим образом:

textBoxYourWhatever.SetWatermark("Text that should display");

Он остается там, пока TextBox пуст. Когда пользователь попадает в TextBox , текст исчезает. Он появляется снова, когда TextBox очищается (пользователем или автоматически). Нет необходимости в каких-либо особых событиях и т. Д.

РЕДАКТИРОВАТЬ:

Я добавил также внутренний класс WaterMarkTextBox, который дает вам возможность просто использовать новый WaterMarkTexBox, который становится доступным в Designer.Затем перетащите его в свой дизайнер и используйте. Он ведет себя как обычное текстовое поле, просто дает вам дополнительное поле WaterMarkText.

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

8
ответ дан 6 December 2019 в 08:42
поделиться

Предположим, что имя вашего текстового поля 'MyTextBox'

Вы можете написать метод для обработки события Focus:

private void MyTextBox_GotFocus(object sender, EventArgs e)
{
    MyTextBox.SelectionStart = 0;
    MyTextBox.SelectionLength = MyTextBox.Text.Length;
    MyTextBox.Select();
}

Вы ´Также нужно добавить обработчик событий:

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);

Это должно сработать ...

РЕДАКТИРОВАТЬ

Вы можете использовать тот же метод для другого текстового поля, просто добавьте обработчик событий:

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
//...
2
ответ дан 6 December 2019 в 08:42
поделиться

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

Вы можете увидеть, как это реализовать, по следующей ссылке: Реализация всплывающей подсказки

0
ответ дан 6 December 2019 в 08:42
поделиться

Вам нужно использовать TextBox.Focus(), чтобы получить фокус на вашем элементе управления, и если это не работает автоматически, то просто вызовите метод SelectAll() на событии Enter().

private TextBox1_Enter(object sender, EventArgs e) {    
    TextBoxTextHighlight(sender, null);
}

private TextBox2_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

private TextBox3_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

// And so forth...

private void TextBoxTextHighlight(object sender, EventArgs e) {
    (sender as TextBox).SelectAll();
}

Этот метод позволит вам вызвать его из любого обработчика события TextBoxX_Enter().

В противном случае, вы даже можете создать новый UserControl, назвать его как угодно при создании, затем, после создания в вашем проекте, отредактировать код и заменить наследование класса UserControl на класс TextBox, затем определить в нем поведение по умолчанию, которое вы хотели бы иметь на событие Enter(), как этот вызов метода SelectAll(), и сделать его защищенным виртуальным, а в конструкторе, вы можете подписаться на обработчик события, как это:

public partial class CustomTextBox : TextBox {
    public CustomTextBox() 
        : base() {
        this.Enter += new EventHandler(Enter);
    }

    protected virtual Enter(object sender, EventArgs e) {
        this.SelectAll();
    }
}

Я написал это на лету, поэтому, возможно, потребуется несколько модификаций, но вы можете понять идею. Но я не советую вам делать это, если только это действительно не стоит делать для вашей конкретной ситуации. Чем проще, тем лучше, а самое простое - это создать обработчик событий для каждого TextBox'а вашей формы и затем вызвать метод TextBoxTextHighlight().

3
ответ дан 6 December 2019 в 08:42
поделиться

Я думаю, что .select будет работать, если вы знаете количество текста, которое хотите выделить.

Попробуйте .SelectAll(); Это должно сработать для вас

7
ответ дан 6 December 2019 в 08:42
поделиться

Обычно, если вы хотите объяснить пользователю, что находится в текстовом поле, вы помещаете элемент управления Label прямо над ним (или сбоку).

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

2
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: