Перейти к содержимому

Как сделать перенос строки в с

  • автор:

C# Как сделать перенос строки после определенного количества символов в строке?

Есть текст нужно чтобы через каждые 300 символов искал запятую, точку, пробел и т.д (Искал не после 300 символов а именно в этом отрезке 0 — 300 или например 300 — 600) и после этого символа (запятой, точки, пробела и т.д.) делал перенос строки и так далее.
Я хочу вывести это через Label, я знаю что есть вариант с Textbox но он мне не подходит.

  • Вопрос задан более трёх лет назад
  • 15770 просмотров

3 комментария

Простой 3 комментария

Вопрос про WPF или WinForms?
Почему не подходит TextBox?

TheMaxai

Михаил @TheMaxai Автор вопроса

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

mshak

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

arxont

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 

Обратите внимание на следующие моменты:

  1. Не имеет значения, что стоит перед или после \n : символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.
  2. Помните, что строка может содержать один символ или вообще ноль символов. А еще строка может содержать только \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; > > >

Label в .NET MAUI и C#

Аналогичный пример в 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:

Форматирование текста в .NET MAUI и C#

Перевод строки

Для переноса текста на новую строку используется значение «\n». Например:

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

Перенос текста на новую строку в .NET MAUI и C#

В 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

Далее займёмся настройкой TextBox. Нажмите правой кнопкой на данном элементе управления и перейдите к Свойствам.

Значение атрибута Multiline установим, как True. Это позволит выводить в TextBox текст в несколько строк, а не в одну.

Изменение значения параметра Multiline у TextBox

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

Активация полос прокрутки ScrollBars в TextBox

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

Программа для переноса строки в TextBox с атрибутом Multiline и ScrollBars

Интерфейс программы готов.

Создание кода программы для показа возможности перехода на новую строку в TextBox

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *