Как установить текстовое поле WinForms в режим перезаписи - PullRequest
5 голосов
/ 15 сентября 2009

Можно ли заставить текстовое поле в приложении Windows Form работать в "режиме перезаписи", т. Е. Заменять символы при вводе пользователем вместо добавления?
Иначе, есть ли стандартный способ получить такое поведение?

Ответы [ 6 ]

11 голосов
/ 15 сентября 2009

Попробуйте использовать MaskedTextBox и установите для InsertKeyMode значение InsertKeyMode.Overwrite.

MaskedTextBox box = ...;
box.InsertKeyMode = InsertKeyMode.Overwrite;
2 голосов
/ 31 июля 2013

Если вы не хотите использовать Маскированное текстовое поле, вы можете сделать это при обработке события KeyPress.

    private void Box_KeyPress(object sender, KeyPressEventArgs e)
    {
        TextBox Box = (sender as TextBox);
        if (Box.SelectionStart < Box.TextLength && !Char.IsControl(e.KeyChar))
        {
            int CacheSelectionStart = Box.SelectionStart; //Cache SelectionStart as its reset when the Text property of the TextBox is set.
            StringBuilder sb = new StringBuilder(Box.Text); //Create a StringBuilder as Strings are immutable
            sb[Box.SelectionStart] = e.KeyChar; //Add the pressed key at the right position
            Box.Text = sb.ToString(); //SelectionStart is reset after setting the text, so restore it
            Box.SelectionStart = CacheSelectionStart + 1; //Advance to the next char
        }
    }
2 голосов
/ 15 сентября 2009

Стандартным способом было бы выбрать существующий текст, когда вы попадете в текстовое поле, тогда, когда пользователь вводит текст, он автоматически заменит существующий текст

1 голос
/ 31 июля 2013

Кажется, в этом коде ошибка. Я обнаружил, что вам нужно установить e.Handled в событии Keypress, в противном случае символ вставляется дважды. Вот мой код (в VB) на основе выше: -

Private Sub txtScreen_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtScreen.KeyPress
    If txtScreen.SelectionStart < txtScreen.TextLength AndAlso Not [Char].IsControl(e.KeyChar) Then
        Dim SaveSelectionStart As Integer = txtScreen.SelectionStart
        Dim sb As New StringBuilder(txtScreen.Text)
        sb(txtScreen.SelectionStart) = e.KeyChar
        'Add the pressed key at the right position
        txtScreen.Text = sb.ToString()
        'SelectionStart is reset after setting the text, so restore it
        'Advance to the next char
        txtScreen.SelectionStart = SaveSelectionStart + 1
        e.Handled = True
    End If
End Sub
0 голосов
/ 17 мая 2017

Вы можете использовать RichTextBox вместо TextBox.

Источник: https://social.msdn.microsoft.com/Forums/en-US/966c3af9-6674-4f48-b487-7afbef05f0cb/overwrite-mode-in-a-textbox

0 голосов
/ 04 мая 2014

Не уверен, что при использовании события KeyPress портится обычный процесс переопределения или что-то конкретное проверяется в KeyPress, но это не совсем так, как должно вести себя обычное текстовое поле Windows, в том случае, когда вы начинаете печатать элемент управления с выделенным текстом, выбор должен быть удален, позволяя вам печатать в этом пустом пространстве. Однажды, увидев утверждение If, я понял, что искомое поведение было достигнуто следующим образом:

    If tb.SelectionStart < tb.TextLength AndAlso Not [Char].IsControl(e.KeyChar) Then
        tb.SelectedText = ""
    End If

не уверен, почему вы хотите сохранить выделение, но предыдущий код идеален, если это то, что вам нужно

Sal

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