Вставка символа между слов в TextBox колонкой

125
03 января 2021, 16:50

Вот код кнопки

private void Processing_Click(object sender, RoutedEventArgs e)
    {    
        string before = textboxBeforeProcessing.Text;//Сохранение текста в переменной
        string[] words = before.Split(new char[] { ' ' });//Разбор текста на слова                       
        for (int i = 0;  i < words.Length; i++)//Добавление одинарных кавычек
        {              
            textboxPostProcessing.Text += "'" + words[i] + "'";               
        }           
    }

Объявление TextBox -ов

 <TextBox Name="textboxBeforeProcessing" Grid.Row="0" Grid.Column="0" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" AcceptsReturn="True">
    </TextBox>
    <TextBox Name="textboxPostProcessing"  Grid.Row="0" Grid.Column="1" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" AcceptsReturn="True" >
    </TextBox>

Как сделать так, чтобы кавычки текста колонкой проставлялись так же, как и у построчного текста?

Answer 1

Проблема

Проблема не в TextBox-ах и вообще не в WPF, по крайней мере не только в них. Проблема в обработке строк, ее можно воспроизвести в консольном приложении:

var before = "hello world\nnext line";
Console.WriteLine("Before: ");
Console.WriteLine(before);
var after = "";
string[] words = before.Split(new char[] { ' ' });//Разбор текста на слова        
for (int i = 0;  i < words.Length; i++)//Добавление одинарных кавычек
{              
     after += "'" + words[i] + "'";               
}   
Console.WriteLine("After: ");
Console.WriteLine(after);

Выводит:

Before: 
hello world
next line
After: 
'hello''world
next''line'

Как видите, код не обернул перенос строки в кавычки. Это происходит потому что Вы разбиваете строку по пробелу, а перенос строки им не является.

Решение

Для того чтобы разбить строку не только по пробелам используйте вызов String.Split(), который согласно документации разбивает строку по любым пробельным символам:

If the separator argument is null or contains no characters, the method treats white-space characters as the delimiters.

Если в примере выше использовать:

string[] words = before.Split()

, то вывод уже будет:

Before: 
hello world
next line
After: 
'hello''world''next''line'

Кавычки проставились нормально, но строки слепились в одну. Если это устраивает, то ОК. Если нет, то придется изменить обработку и самому отслеживать где в строке есть переносы строк и заменить их на сочетание «кавычка + перенос строки». Это можно сделать циклом, можно заменой по строке. В качестве альтернативы можно обрабатывать строки входного TextBox-а по одной через какой-нибудь GetLineText.

Для соединения строк опять-таки вместо цикла можете использовать String.Join передавая разделитель "''" или даже "','". Нужно будет добавить разделителей спереди и сзади, но это мелочи.

Сверхзадача

А вообще большинство нормальных текстовых редакторов поддерживают поиск и замену по регулярному выражению. С их помощью такого рода задачи (обернуть слова в кавычки с разделителем) решаются довольно легко.

Для примера если мы в Notepad++ имеем такой текст:

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

можно обернуть все слова (последовательности без пробелов) в кавычки:

В общем, учите регулярные выражения и возможности Вашего редактора/среды, так сэкономите время на написание кода. Если еще какой-нибудь скриптовый язык выучите то Вас вообще никто не остановит :)

READ ALSO
Для чего нужны делегаты в C#?

Для чего нужны делегаты в C#?

Разбираюсь в c# в частности с делегатами, возник вопрос зачем нужны делегаты если можно создать экземпляр класса и вызвать метод

129
Ошибка Failed to open the referenced table

Ошибка Failed to open the referenced table

Не получается настроить references в MySQL, не понимаю что делаю не правильно

244
relation does not exist

relation does not exist

3-й день мучаюсь с данной проблемойНа heroku имеется БД MySQL

147