C# Как сделать перенос строки после определенного количества символов в строке?
Есть текст нужно чтобы через каждые 300 символов искал запятую, точку, пробел и т.д (Искал не после 300 символов а именно в этом отрезке 0 — 300 или например 300 — 600) и после этого символа (запятой, точки, пробела и т.д.) делал перенос строки и так далее.
Я хочу вывести это через Label, я знаю что есть вариант с Textbox но он мне не подходит.
- Вопрос задан более трёх лет назад
- 15770 просмотров
3 комментария
Простой 3 комментария
Вопрос про WPF или WinForms?
Почему не подходит TextBox?

Михаил @TheMaxai Автор вопроса
lam0x86, WinForms, текстбокс не подходит из-за видимых и не красивых границ. Использую MetroFramework

а чем не устроило изменение свойства BorderStyle у TextBox? например на None
Решения вопроса 1

C# программист
Попробуйте так (для примера взял текст вашего вопроса и размер строки в 50, а не 300)
string sourceString = "Есть текст нужно чтобы. через каждые 300 символов искал запятую, точку, пробел и т.д (Искал не после 300 символов а именно в этом отрезке 0 - 300 или например 300 - 600) и после этого символа(запятой, точки, пробела и т.д.) делал перенос строки и так далее. Я хочу вывести это через Label, я знаю что есть вариант с Textbox но он мне не подходит."; int length = 50; char[] charsForEOL = < '.', ',', ' ' >; string resultString = ""; label1.Text = sourceString; do < for (int i = length; i >= 1; i--) < if (charsForEOL.Contains(sourceString[i])) < resultString += sourceString.Substring(0, i) + "\n"; sourceString = sourceString.Substring(i + 1); break; >if(i == 1) < resultString += sourceString.Substring(0, length) + "\n"; sourceString = sourceString.Substring(length + 1); >> > while (sourceString.Length > length); resultString += sourceString; label2.Text = resultString;
C#: Экранирующие последовательности
Мы хотим показать диалог Матери Драконов со своим ребёнком:
- Are you hungry? - Aaaarrrgh!
Если вывести на экран строку с таким текстом:
Console.WriteLine("- Are you hungry?- Aaaarrrgh!");
то получится так:
- Are you hungry?- Aaaarrrgh!
Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: \n .
Console.WriteLine("- Are you hungry?\n- Aaaarrrgh!");
- Are you hungry? - Aaaarrrgh!
\n — это специальный символ. В литературе его часто обозначают как LF (Line Feed). Возможно вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа \ и n , но это не так. С точки зрения компьютера — это один невидимый символ перевода строки. Доказательство:
// Мы это не изучали, но вы должны знать правду // Ниже код, который возвращает длину строки "a".Length; // 1 "\n".Length; // 1 . "\n\n".Length; // 2 .
Почему так сделано? \n — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый. Именно поэтому и возникла такая задача. Нужно было как-то представить его на клавиатуре. А поскольку количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений.
Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter. Во многих редакторах есть опция, позволяющая включить отображение невидимых символов — с ее помощью можно понять, где они находятся (хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые):
- Привет!¶ - О, привет!¶ - Как дела?
Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.
\n — это пример экранирующей последовательности (escape sequence). Их ещё называют управляющими конструкциями. Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки, к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать перевод строки \n для правильного форматирования текста.
Console.WriteLine("Gregor Clegane\nDunsen\nPolliver\nChiswyck");
На экран выведется:
Gregor Clegane Dunsen Polliver Chiswyck
Обратите внимание на следующие моменты:
- Не имеет значения, что стоит перед или после \n : символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.
- Помните, что строка может содержать один символ или вообще ноль символов. А еще строка может содержать только \n . Проанализируйте следующий пример:
Console.WriteLine("\n"); Console.WriteLine("Dunsen");
Здесь мы сначала выводим строку «перевод строки», а потом делаем вывод обыкновенной строки. Программа выведет на экран:
Dunsen
Почему перед строкой Dunsen появилось две пустые строки, а не одна? Дело в том, что Console.WriteLine() при выводе значения автоматически добавляет в конец символ перевода строки. Таким образом, один перевод строки мы указали явно, передав этот символ экранирующей последовательности аргументом в функцию, а второй перевод строки добавлен самой функцией автоматически. Ещё пример кода:
Console.WriteLine("Polliver"); Console.WriteLine("Gregor Clegane"); Console.WriteLine(); Console.WriteLine("Chiswyck"); Console.WriteLine("\n"); Console.WriteLine("Dunsen");
Вывод будет таким:
Polliver Gregor Clegane
Chiswyck
Dunsen
Console.WriteLine("Joffrey loves using \\n");
на экран выйдет:
Joffrey loves using \n
Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n (это связано с историческими причинами). Такая комбинация хорошо работает только в Windows, но создаёт проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине, в среде разработчиков принято всегда использовать \n без \r , так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n .
Задание
Напишите программу, которая выводит на экран:
- Did Joffrey agree? - He did. He also said "I love using \n".
При этом программа использует только один Console.WriteLine() , но результат на экране должен выглядеть в точности как показано выше.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- Экранирующая последовательность — специальная комбинация символов в тексте. Например, \n — это перевод строки.
Как сделать перенос строки в с
Label представляет обычную текстовую метку, которая выводит информацию с помощью свойства Text. Label удобен для создания заголоков и меток к элементам ввода. Основные свойства Label:
- CharacterSpacing : расстояние между символами в тексте в виде значения типа double
- FontAttributes : определяет стиль текста
- FontAutoScalingEnabled : значение типа bool, устанавливает, будет ли к тексту применяться системное масштабирование
- FontFamily : семейство шрифтов в виде строки
- FontSize : размер шрифта (значение типа double)
- FormattedText : представляет отформатированный текст в виде объекта FormattedString
- LineBreakMode : значение типа LineBreakMode, которое определяет, как будет производиться перенос строки, если текст не вмещается
- LineHeight : высота строки (значение типа double)
- MaxLines : максимальное допустимое количество строк
- Padding : внутренний отступ
- Text : текст метки
- TextColor : цвет текста
- TextDecorations : декорации текста (его подчеркивание или вчеркивание) (значение типа TextDecorations)
- TextTransform : объект типа TextTransform, который определяет преобразование текста
- TextType : значение типа TextType, которое определяет тип текста — обычный текст или html
- HorizontalTextAlignment : значение TextAlignment, которое определяет выравнивание текста по горизонтали
- VerticalTextAlignment : значение типа TextAlignment, которое определяет выравнивание текста по вертикали
Пример простейшей метки
namespace HelloApp < class StartPage : ContentPage < public StartPage() < Grid grid = new Grid(); Label label = new Label < Text = "Hello METANIT.COM!", TextDecorations = TextDecorations.Underline, CharacterSpacing = 2, FontAttributes = FontAttributes.Bold, FontFamily = "Helvetica", FontSize = 22, VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center >; grid.Children.Add(label); Content = grid; > > >

Аналогичный пример в XAML:
Форматирование текста
Свойство Text элемента Label позволяет устанавливать простой текст, который мы можем стилизовать с помощью ранее рассмотренных свойств. Однако текст с каким-то более сложным форматированием так не задать. И для этого в элементе Label определено вспомогательное свойство FormattedText , которое допускает сложное форматирование.
Свойство FormattedText хранит не просто строку текста, а объект типа FormattedString , который инкапсулирует объекты типа Span . Каждый объект Span как раз и представляет кусок некоторым образом стилизованного текста. Для стилизации объекта Span применются все те же свойства:
- Text
- FontFamily
- FontSize
- FontAttributes
- TextColor
- BackgroundColor
Например,создадим текст со сложным форматированием в коде:
namespace HelloApp < class StartPage : ContentPage < public StartPage() < Grid grid = new Grid(); Label header = new Label(); FormattedString formattedString = new FormattedString(); formattedString.Spans.Add(new Span < Text = "Сегодня ", FontSize = 22 >); formattedString.Spans.Add(new Span < Text = "хорошая", TextColor = Colors.DarkRed, BackgroundColor = Colors.LightPink, >); formattedString.Spans.Add(new Span < Text = " погода!", FontAttributes = FontAttributes.Bold >); header.FormattedText = formattedString; header.VerticalOptions = LayoutOptions.Center; header.HorizontalOptions = LayoutOptions.Center; grid.Children.Add(header); Content = grid; > > >
Аналогичный код в XAML:

Перевод строки
Для переноса текста на новую строку используется значение «\n». Например:
header.Text= "Его пример другим наука;\n"+ "Но, боже мой, какая скука\n" + "С больным сидеть и день и ночь,\n" + "Не отходя ни шагу прочь!\n";

В XAML тоже не сложно задать многострочный текст:
В данном случае применяется сложное свойство Label.Text , которое в качестве значения принимает объект String. Причем для элемента String применяется префикс x — x:String , то есть определение данного типа берется из пространства имен «http://schemas.microsoft.com/winfx/2009/xaml»
Обработка нажатия
Кнопки определяют событие нажатия, которое мы можем обработать. Однако у Label подобного события нет. Но что делать, если мы вдруг хотим обрабатывать нажатие на заголовок? В этом случае мы можем воспользоваться специальным классом TapGestureRecognizer , который позволяет обрабатывать нажатия:
namespace HelloApp < class StartPage : ContentPage < public StartPage() < Grid grid = new Grid(); Label label = new Label < Text = "Hello METANIT.COM", VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Center, FontSize = 22 >; TapGestureRecognizer tapGesture = new TapGestureRecognizer < NumberOfTapsRequired = 2 >; int count = 0; // счетчик нажатий tapGesture.Tapped += (s, e) => < count++; label.Text = $"Вы нажали раз"; >; label.GestureRecognizers.Add(tapGesture); grid.Children.Add(label); Content = grid; > > >
TapGestureRecognizer представляет специальный класс, который позволяет распознать нажатия. С помощью свойства NumberOfTapsRequired мы можем установить, сколько нажатий необходимо. В данном случае мы устанавливаем двойное нажатие. И именно по двойному нажатию будет генерироваться событие Tapped , в обработчике которого изменяется значение переменной count и текст метки.
И чтобы связать объект TapGestureRecognizer с меткой, необходимо добавить этот объект в коллекцию GestureRecognizers :
label.GestureRecognizers.Add(tapGesture);
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Перенос строки в TextBox с Multiline
Покажем, как выполнить перенос строки в TextBox с атрибутом Multiline (когда текстовое поле занимает несколько строк). Сделаем это на примере программы в Windows Forms и языка C#.
Создание интерфейса программы для демонстрации переноса строки в TextBox
Создадим проект Windows Forms. На окне формы расположим два элемента управления: кнопку (Button) и текстовое поле (TextBox). В кнопке параметру Text зададим значение «Прочитать файл», поскольку текст в TextBox будем считывать из файла.

Далее займёмся настройкой TextBox. Нажмите правой кнопкой на данном элементе управления и перейдите к Свойствам.
Значение атрибута Multiline установим, как True. Это позволит выводить в TextBox текст в несколько строк, а не в одну.

Далее активируем полосы прокрутки у TextBox. Это позволит удобнее просматривать и работать с многострочным текстом. Для активации параметр ScrollBars переведём в положение Both — полосы будут по обоим измерениям: по горизонтали и по вертикали.

Растянем TextBox по горизонтали до низа формы и получим нечто подобное:

Интерфейс программы готов.
Создание кода программы для показа возможности перехода на новую строку в TextBox
В Visual Studio два раза щёлкнем на кнопку (Button). Откроется редактор кода обработки нажатия на кнопку. Добавим следующие строки: