Ограничить количество строк в текстовом поле .net - PullRequest
13 голосов
/ 26 июня 2009

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

Как мне этого добиться?

Ответы [ 7 ]

13 голосов
/ 26 июня 2009

Вам нужно проверить на

txtbox.Lines.Length

Вам необходимо обработать это для 2 сценариев: 1. Пользователь печатает в текстовом поле 2. Пользователь вставил текст в текстовое поле

Пользователь, набравший текстовое поле

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

private const int MAX_LINES = 10;

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (this.textBox1.Lines.Length >= MAX_LINES && e.KeyChar == '\r')
    {
        e.Handled = true;
    }
}

Я проверил приведенный выше код. Работает как надо.

Пользователь вставляет некоторый текст в текстовое поле

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

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (this.textBox1.Lines.Length > MAX_LINES)
    {
        this.textBox1.Undo();
        this.textBox1.ClearUndo();
        MessageBox.Show("Only " + MAX_LINES + " lines are allowed.");
    }
}
1 голос
/ 05 апреля 2012

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

Чтобы разрешить то же самое, вам нужно использовать API SendMessage для подсчета количества строк, которые вы видите на экране. Вот код.

Private Declare Function SendMessageINT Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const EM_GETLINECOUNT = &HBA

Private Sub txtText1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtText1.KeyPress

    Const MAX_LINES = 13
    Dim lngCount As Long

    lngCount = SendMessageINT(txtText1.Handle, EM_GETLINECOUNT, 0, 0)

    If lngCount = MAX_LINES And Asc(e.KeyChar) <> Keys.Back And Asc(e.KeyChar) <> Keys.Delete Then
        e.Handled = True
    End If
End Sub

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

Объявите это вместе с декларацией API

Private Const EM_LINEFROMCHAR = & HC9

Ниже код должен быть помещен в события MouseDown, MouseUp, KeyDown и KeyUp текстового поля.

intLineNo = SendMessageINT (txtText1.Handle, EM_LINEFROMCHAR, -1, 0 &) + 1

После обнаружения LineNo вы можете выполнить оценку в событии KeyPress TextBox.

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

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

Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Me.TextChanged
     If Not Me.Multiline OrElse String.IsNullOrEmpty(Me.Text) OrElse _InTextChanged Then Exit Sub
     _InTextChanged = True

     Try
        Dim posLast As Point = Me.GetPositionFromCharIndex(Me.Text.Length - 1)
        Dim posFirst As Point = Me.GetPositionFromCharIndex(0)

        Dim sizeLast As SizeF
        Dim sizeFirst As SizeF

        Using g As Graphics = Graphics.FromHwnd(Me.Handle)
           sizeLast = g.MeasureString(Me.Text(Me.Text.Length - 1).ToString(), Me.Font)
           sizeFirst = g.MeasureString(Me.Text(0).ToString(), Me.Font)
        End Using

        If posLast.Y + sizeLast.Height > Me.ClientSize.Height OrElse posFirst.Y < 0 OrElse posFirst.Y + sizeFirst.Height > Me.ClientSize.Height Then

           Me.Text = _PreviousText

           If _PreviousSelectionStart > Me.Text.Length Then
              Me.SelectionStart = Me.Text.Length
           Else
              Me.SelectionStart = _PreviousSelectionStart
           End If


        End If
     Catch ex As Exception

     End Try

     _InTextChanged = False


  End Sub

  Private Sub Textbox_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
     _PreviousSelectionStart = Me.SelectionStart
     _PreviousText = Me.Text
  End Sub
0 голосов
/ 06 февраля 2013
private void txttrccertificateto_TextChanged(object sender, EventArgs e)
{
  if (txttrccertificateto.Text.Length > MAX_Char)
  {
    txttrccertificateto.Text = txttrccertificateto.Text.Remove(MAX_Char, 1);
  }
  if (txttrccertificateto.Lines.Length > MAX_LINES)
  {
    string[] temp = new string[MAX_LINES];
    for (int i = 0; i < MAX_LINES; i++)
    {
      temp[i] = txttrccertificateto.Lines[i];
    }

    txttrccertificateto.Lines = temp;
  }
}

private void txttrccertificateto_KeyDown(object sender, KeyEventArgs e)
{
  if (txttrccertificateto.Lines.Length >= MAX_LINES && e.KeyValue == '\r')
    e.Handled = true;
  if (txttrccertificateto.Text.Length >= MAX_Char && e.KeyValue == '\r')
    e.Handled = true;
}

private void txttrccertificateto_KeyUp(object sender, KeyEventArgs e)
{
  if (txttrccertificateto.Lines.Length >= MAX_LINES && e.KeyValue == '\r')
    e.Handled = true;
  if (txttrccertificateto.Text.Length >= MAX_Char && e.KeyValue == '\r')
    e.Handled = true;
}
0 голосов
/ 11 марта 2010

Ограничение MAX_LINES с усечением для копирования / вставки.

    private void textBox1_KeyDown( object sender, KeyEventArgs e )
    {
        if ( textBox1.Lines.Length >= MAX_LINES && e.KeyValue == '\r' )
            e.Handled = true;
    }

    private void textBox1_TextChanged( object sender, EventArgs e )
    {
        if ( textBox1.Lines.Length > MAX_LINES )
        {
            string[] temp = new string[MAX_LINES];
            for ( int i = 0; i < MAX_LINES; i++ )
            {
                temp[i] = textBox1.Lines[i];
            }

            textBox1.Lines = temp;
        }
    }
0 голосов
/ 26 июня 2009

В зависимости от того, чего вы пытаетесь достичь, есть также свойство MaxLength, чтобы установить количество символов, которое вы можете ввести в текстовое поле (поскольку строка может иметь переменную длину).

0 голосов
/ 26 июня 2009

OK. Как насчет определения переменной экземпляра "lastKnownGoodText" и выполнения чего-то подобного:

private void textBox_TextChanged (object sender, EventArgs e) {
    if (textBox.Lines.Length > 10)
        textBox.Text = lastKnownGoodText;
    else
        lastKnownGoodText = textBox.Text;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...