Как выделить текст в текстовом поле в программе C# Winforms?

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

я попробовал текстовое поле.выберите метод, но он не имел никакого эффекта. То же самое с этой.

здесь скриншот моей программы.

Мой Код:

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

будет ли это делать, или требуется больше?

7 ответов


как насчет назначить ToolTip to TextBox и поместите все "говорить, что текстовое поле для" внутри этого?

просто перетащите & Drop ToolTip внутри формы. А потом в каждом TextBox свойства у вас должна быть дополнительная запись в разделе Разное ToolTip on toolTip1 (или как бы это ни называлось, если вы переименуете его).

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

вы можете в конечном итоге или даже лучше было!--10--> рядом с TextBox говорить, что есть, но иметь ToolTip также хорошая идея объяснить больше информации пользователю через это.

для делать вещи с водяными знаками, поэтому вам не придется идти длинным путем, установив событий, заботясь о SelectAll и т. д. Вы могли бы сделать это вот так. Создайте новый водяной знак.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 очищается (пользователем или автоматически). Отсутствие потребности для всех специальных случаев etc.

EDIT:

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

я все-таки предпочитаю первый способ ты. Это не заставляет вас снова перестраивать gui.


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

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


вам нужно использовать текстовое поле.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();
    }
}

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


предположим, что ваше имя textboxs 'MyTextBox'

вы можете написать метод для обработки события фокуса:

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

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

редактировать

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

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);
//...

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

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


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

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


Я обнаружил, что в моем приложении прикрепление метода выделения к событию Focus -> Enter не работает хорошо с методом SelectAll (). Вместо этого я использовал Action - > Click (который, я считаю, работает только для мышей) и прикрепил туда свой метод подсветки. Теперь это работает как шарм.