Как добавлять номера строк в начало каждой строки в многострочном текстовом поле каждый раз при нажатии клавиши ENTER?

я прошел через это, но они не помогли мне в моей ситуации

в моем случае это не работает, потому что он содержит методы KeyData или KeyCode в ответах, которые показывают ошибку, когда я пытаюсь запустить. Как добавить номер в каждую новую строку в многострочном текстовом поле C#/ASP.net

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

этот просто добавляет несколько строк, таких как first, second , Third и т. д., что не помогает в моем случае. https://www.codeproject.com/Questions/320713/Adding-new-line-in-textbox-without-repalcing-exist

Я просмотрел 20 результатов поиска в Google, многие из них были нерелевантными, а другие бесполезными в моей ситуации.


person Dyary    schedule 11.06.2018    source источник
comment
Вы видели это: stackoverflow.com/questions/567404/   -  person Rufus L    schedule 12.06.2018
comment
Было бы здорово, если бы вы могли поделиться минимально воспроизводимым примером вашей ближайшей попытки.   -  person mjwills    schedule 12.06.2018
comment
вы нигде не получите точный код ... используя примеры, попробуйте то, чего вы хотите достичь, и поделитесь, если что-то не работает.   -  person Shivani Katukota    schedule 12.06.2018


Ответы (2)


Я попробовал ответ от computhoms, он не работал именно так, как я хотел.

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

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

какой-то текст

2

какой-то текст

3

какой-то текст

и так далее.

результат, который я хочу, я хочу, чтобы он был таким:

1-какой-то текст.

2-какой-то текст.

3-какой-то текст.

поэтому я изменил код, предоставленный Computhos, который дал мне правильные результаты. вот код, который я использовал:

После создания TextBox в xaml и создания события PreviewKeyDown, подобного этому

  <TextBox  PreviewKeyDown="LifeGoalsTextBox_PreviewKeyDown" x:Name="LifeGoalsTextBox" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />

Я пошел к коду позади и написал этот код:

private void LifeGoalsTextBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                string txt = LifeGoalsTextBox.Text;
                int lineNumber = txt.Split('\n').Length ;
                string lineNumberString = lineNumber.ToString();

                if (lineNumber == 0)
                {
                    LifeGoalsTextBox.Text = LifeGoalsTextBox.Text.Insert(0, "1") + '-';
                }
                else
                {
                    lineNumber++;
                    int lastLine = 1 + LifeGoalsTextBox.Text.LastIndexOf('\n');
                    LifeGoalsTextBox.Text = LifeGoalsTextBox.Text.Insert(lastLine, lineNumberString+ '-') ;

                    LifeGoalsTextBox.CaretIndex = LifeGoalsTextBox.Text.Length;
                }
            }
        }
person Dyary    schedule 13.06.2018

Если я хорошо понимаю вопрос, вы хотите добавить номер строки каждой новой строки внутри текстового поля. Чтобы сделать это, вам нужно добавить TextBox в свое представление с событием KeyDown.

<TextBox KeyDown="TextBox_KeyDown" x:Name="txtBox" />

Затем в коде представления вы можете проверить, является ли ключ клавишей «ввод», и добавить номер строки в текст.

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        string txt = txtBox.Text;
        int lineNumber = txt.Split('\n').Length + 1;
        txtBox.Text += '\n' + lineNumber.ToString();
        txtBox.CaretIndex = txtBox.Text.Length;
    }
}

Примечания

  • Строка txtBox.CaretIndex = txtBox.Text.Length; помещает курсор в конец текста после его редактирования. В противном случае, когда вы нажимаете ввод, курсор сбрасывается на начало текста.
  • Вам нужно будет добавить номер первой строки, когда текстовое поле пусто.
  • Вам, вероятно, потребуется выполнить редактирование, т.е. чтобы пользователь не мог, например, удалить номера строк.

Изменить

При использовании свойства AcceptsReturn элемента TextBox событие KeyDown напрямую обрабатывается TextBox, и примечание передается родителям. В этом случае необходимо использовать событие PreviewKeyDown, см. Стратегии маршрутизации MSDN

person computoms    schedule 12.06.2018
comment
Спасибо за ответ. по какой-то причине событие KeyDown для клавиши Enter не работает. Я пробовал KeyUp, но это дает мне неправильный результат. он создаст пустую строку, а затем номер строки. Например, когда я сначала нажимаю ввод без текста в текстовом поле, он дает 3, затем при следующем вводе создается пробел, затем число 5 и так далее. - person Dyary; 13.06.2018
comment
Я отредактировал ответ, включив в него объяснение поведения, с которым вы столкнулись. Вот почему у вас были дополнительные строки при использовании других событий с AcceptsReturn=true, потому что я явно обрабатывал новую строку в событии KeyDown, поскольку она не обрабатывалась TextBox. - person computoms; 13.06.2018