Как выделить текст в текстовом поле в программе C # Winforms? - PullRequest
6 голосов
/ 10 марта 2010

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

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

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

Мой код:

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

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

Ответы [ 7 ]

8 голосов
/ 10 марта 2010

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

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

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

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

Для того, чтобы делать что-то с 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 очищается (пользователем или автоматически). Нет необходимости в каких-либо специальных мероприятиях и т. Д.

EDIT:

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

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

7 голосов
/ 10 марта 2010

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

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

3 голосов
/ 10 марта 2010

Вам необходимо использовать 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();
    }
}

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

2 голосов
/ 10 марта 2010

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

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

2 голосов
/ 10 марта 2010

Предположим, что имя вашего текстового поля '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);

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

EDIT

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

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);
//...
0 голосов
/ 29 октября 2014

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

0 голосов
/ 10 марта 2010

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

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

...