Как удалить последний введенный пользователем символ (программная реализация backspace)?
Нажатием кнопки нужно удалить последний введенный пользователем символ (аналог backspace). На данный момент не могу разобраться с принципом работы.
Пытался сделать через maskedTextBox1.Text.Length, но в этом случае показывается общая длинна маски, а не количество введенных пользователем символов.
Пытался сделать через while, где сравнивал в цикле символы с конца, и если, символ не был равен цифре, то считал, что это символ маски. Тоже не вышло. Хотя возможно я неверно задал условия цикла или проверки символа.
Жду любых советов или мнений, как это можно сделать.
- Вопрос задан более трёх лет назад
- 195 просмотров
Text Box Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет элемент управления «текстовое поле» Windows.
public ref class TextBox : System::Windows::Forms::TextBoxBase
public class TextBox : System.Windows.Forms.TextBoxBase
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch)] [System.Runtime.InteropServices.ComVisible(true)] public class TextBox : System.Windows.Forms.TextBoxBase
type TextBox = class inherit TextBoxBase
[] [] type TextBox = class inherit TextBoxBase
Public Class TextBox Inherits TextBoxBase
Наследование
Производный
Примеры
В следующем примере кода создается многостроковый TextBox элемент управления с вертикальными полосами прокрутки. В этом примере используются AcceptsTabсвойства , AcceptsReturnи Dock , чтобы сделать элемент управления многострочного текстового поля полезным для создания текстовых документов.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; public class Form1 : Form < private TextBox textBox1; public Form1() < InitializeComponent(); >private void InitializeComponent() < this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // textBox1 // this.textBox1.AcceptsReturn = true; this.textBox1.AcceptsTab = true; this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; this.textBox1.Multiline = true; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; // // Form1 // this.ClientSize = new System.Drawing.Size(284, 264); this.Controls.Add(this.textBox1); this.Text = "TextBox Example"; this.ResumeLayout(false); this.PerformLayout(); >[STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); >>
Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Linq Imports System.Text Imports System.Windows.Forms Public Class Form1 Inherits Form Dim textBox1 As TextBox Public Sub New() InitializeComponent() End Sub Private Sub InitializeComponent() Me.textBox1 = New System.Windows.Forms.TextBox() Me.SuspendLayout() ' ' textBox1 ' Me.textBox1.AcceptsReturn = True Me.textBox1.AcceptsTab = True Me.textBox1.Dock = System.Windows.Forms.DockStyle.Fill Me.textBox1.Multiline = True Me.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical ' ' Form1 ' Me.ClientSize = New System.Drawing.Size(284, 264) Me.Controls.Add(Me.textBox1) Me.Text = "TextBox Example" Me.ResumeLayout(False) Me.PerformLayout() End Sub End Class
Комментарии
TextBox С помощью элемента управления пользователь может вводить текст в приложении. Этот элемент управления имеет дополнительные функциональные возможности, которые отсутствуют в стандартном элементе управления «Текстовое поле Windows», включая многостроочное редактирование и маскирование символов пароля.
Как правило, TextBox элемент управления используется для отображения или принятия в качестве входных данных одной строки текста. Свойства и ScrollBars можно использовать Multiline для отображения или ввода нескольких строк текста. AcceptsTab Задайте для свойств и AcceptsReturn значение , true чтобы обеспечить большую обработку текста в многострочного TextBox элемента управления.
Чтобы настроить высоту элемента управления, необходимо присвоить Multiline true свойству TextBox значение . Высоту можно настроить, задав Size свойство .
Вы можете ограничить количество текста, введенного в элемент управления , TextBox задав MaxLength для свойства определенное количество символов. TextBox Элементы управления также можно использовать для приема паролей и другой конфиденциальной информации. Свойство можно использовать для PasswordChar маскирования символов, введенных в однострочном варианте элемента управления. Используйте свойство , CharacterCasing чтобы разрешить пользователю вводить в элемент управления только прописные и строчные буквы или сочетание прописных и строчных символов TextBox .
Чтобы прокрутить содержимое TextBox элемента управления , пока курсор (курсор) не будет находиться в видимой области элемента управления, можно использовать ScrollToCaret метод . Чтобы выделить диапазон текста в текстовом поле, можно использовать Select метод .
Чтобы запретить ввод текста в TextBox элемент управления, можно создать обработчик событий для KeyDown события, чтобы проверить каждый символ, введенный в элементе управления. Можно также ограничить весь ввод данных в элементе TextBox управления, задав ReadOnly для свойства значение true .
Большая часть функциональных возможностей TextBox элемента управления наследуется от TextBoxBase класса .
TextBox Использование элемента управления с включенными стилями визуальных элементов приведет к неправильной обработке суррогатных шрифтов.
Конструкторы
Инициализирует новый экземпляр класса TextBox.
Свойства
Получает или задает значение, указывающее, что происходит в многострочном элементе управления TextBox при нажатии клавиши ENTER: создается новая строка текста или активируется кнопка стандартного действия формы.
Возвращает или задает значение, указывающее, что происходит при нажатии клавиши TAB в многострочном элементе управления: вводится знак табуляции в текстовом поле или фокус ввода в форме перемещается к следующему элементу управления в последовательности переходов.
Получает объект AccessibleObject, назначенный элементу управления.
Возвращает или задает описание выполняемого по умолчанию действия элемента управления для использования клиентскими приложениями со специальными возможностями.
Возвращает или задает описание элемента управления, используемого клиентскими приложениями со специальными возможностями.
Возвращает или задает имя элемента управления, используемого клиентскими приложениями со специальными возможностями.
Возвращает или задает доступную роль элемента управления.
Возвращает или задает значение, указывающее, может ли элемент управления принимать данные, перетаскиваемые в него пользователем.
Возвращает или задает границы контейнера, с которым связан элемент управления, и определяет способ изменения размеров элемента управления при изменении размеров его родительского элемента.
Возвращает или задает пользовательскую коллекцию StringCollection для использования в случае, когда для свойства AutoCompleteSource задано значение CustomSource .
Возвращает или задает параметр, который управляет работой автоматического завершения для TextBox.
Возвращает или задает значение, указывающее источник строк завершения, используемых для автоматического завершения.
Возвращает или задает местоположение, в котором выполняется прокрутка этого элемента управления в ScrollControlIntoView(Control).
Получает или задает значение, указывающее, подстраивается ли автоматически высота элемента управления при изменении шрифта, назначенного для элемента управления.
Возвращает или задает цвет фона элемента управления.
Данное свойство не применимо к этому классу.
Данное свойство не применимо к этому классу.
Возвращает или задает значение BindingContext для элемента управления.
Получает или задает тип границы элемента управления «Текстовое поле».
Возвращает расстояние в пикселях между нижней границей элемента управления и верхней границей клиентской области контейнера.
Возвращает или задает размер и местоположение (в пикселях) элемента управления, включая его неклиентские элементы, относительно его родительского элемента управления.
Получает значение, указывающее, можно ли для свойства ImeMode установить активное значение с целью включения поддержки IME.
Возвращает значение, указывающее, может ли элемент управления получать фокус.
Определяет, могут ли вызываться события в элементе управления.
Возвращает значение, указывающее, доступен ли элемент управления для выбора.
Получает значение, показывающее, может ли пользователь отменить предыдущую операцию в элементе управления «Текстовое поле».
Возвращает или задает значение, указывающее, была ли мышь захвачена элементом управления.
Возвращает или задает значение, указывающее, вызывает ли элемент управления выполнение проверки для всех элементов управления, требующих проверки, при получении фокуса.
Получает или задает значение, указывающее, изменяет ли элемент управления TextBox регистр знаков при вводе.
Возвращает прямоугольник, представляющий клиентскую область элемента управления.
Возвращает или задает высоту и ширину клиентской области элемента управления.
Возвращает название организации или имя создателя приложения, содержащего элемент управления.
Возвращает объект IContainer, который содержит коллекцию Component.
Возвращает значение, указывающее, имеет ли элемент управления или один из его дочерних элементов фокус ввода в настоящий момент.
Возвращает или задает контекстное меню, связанное с элементом управления.
Возвращает или задает объект ContextMenuStrip, сопоставленный с этим элементом управления.
Возвращает коллекцию элементов управления, содержащихся в элементе управления.
Возвращает значение, указывающее, был ли создан элемент управления.
Возвращает параметры, необходимые для создания дескриптора элемента управления.
Возвращает или задает курсор, отображаемый, когда указатель мыши находится на элементе управления.
Возвращает привязки данных для элемента управления.
Возвращает или задает контекст данных для привязки данных. Это свойство окружения.
Возвращает или задает курсор по умолчанию для элемента управления.
Возвращает стандартный режим редактора методов ввода, поддерживаемый данным элементом управления.
Возвращает стандартный режим редактора методов ввода, поддерживаемый данным элементом управления.
Возвращает размер пустого пространства в пикселях между элементами управления, которое определено по умолчанию.
Возвращает длину и высоту в пикселях, которые были указаны в качестве максимального размера элемента управления.
Возвращает длину и высоту в пикселях, которые были указаны в качестве минимального размера элемента управления.
Возвращает внутренние промежутки в содержимом элемента управления в пикселях.
Получает размер элемента управления по умолчанию.
Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.
Получает значение DPI для устройства, на котором сейчас отображается элемент управления.
Возвращает прямоугольник, представляющий отображаемую область элемента управления.
Получает значение, указывающее, находится ли базовый класс Control в процессе удаления.
Возвращает или задает границы элемента управления, прикрепленные к его родительскому элементу управления, и определяет способ изменения размеров элемента управления с его родительским элементом управления.
Получает или задает значение, показывающее, выполнена ли в буфере прорисовка элемента управления до его отображения. Данное свойство не применимо к этому классу.
Возвращает или задает значение, указывающее, может ли элемент управления отвечать на действия пользователя.
Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.
Возвращает значение, указывающее, имеется ли на элементе управления фокус ввода.
Возвращает или задает шрифт текста, отображаемого элементом управления.
Возвращает или задает высоту шрифта элемента управления.
Возвращает или задает цвет элемента управления.
Возвращает дескриптор окна, с которым связан элемент управления.
Возвращает значение, указывающее, содержит ли элемент управления один или несколько дочерних элементов.
Возвращает или задает высоту элемента управления.
Возвращает или задает значение, указывающее, остается ли выделенный текст в текстовом поле выделенным, когда фокус ввода в форме переходит с данного элемента управления на другой.
Возвращает или задает режим редактора метода ввода элемента управления.
Получает или задает режим редактора метода ввода элемента управления.
Возвращает значение, указывающее, следует ли вызывающему оператору обращаться к методу invoke во время вызовов метода из элемента управления, так как вызывающий оператор находится не в том потоке, в котором был создан элемент управления.
Возвращает или задает значение, указывающее, является ли элемент управления видимым для приложений со специальными возможностями.
Указывает, находится ли один из предков этого элемента управления в режиме DesignMode. Это свойство доступно только для чтения.
Возвращает значение, указывающее, был ли удален элемент управления.
Возвращает значение, указывающее, имеется ли у элемента управления связанный с ним дескриптор.
Возвращает значение, указывающее, отображается ли зеркально элемент управления.
Получает кэшированный экземпляр механизма размещения элемента управления.
Возвращает или задает расстояние в пикселях между левой границей элемента управления и левой границей клиентской области его контейнера.
Получает или задает строки текста в элементе управления «Текстовое поле».
Возвращает или задает координаты левого верхнего угла элемента управления относительно левого верхнего угла его контейнера.
Возвращает или задает расстояние между элементами управления.
Возвращает или задает размер, являющийся верхней границей, которую может указать метод GetPreferredSize(Size).
Возвращает или задает максимальное число символов, которое разрешается вводить или вставлять в элемент управления «текстовое поле».
Возвращает или задает размер, являющийся нижней границей, которую может указать метод GetPreferredSize(Size).
Получает или задает значение, которое показывает, что содержимое элемента управления «Текстовое поле» было изменено пользователем со времени создания элемента управления или последнего ввода его содержимого.
Получает или задает значение, показывающее, является ли данный элемент управления многострочным TextBox.
Получает или задает значение, показывающее, является ли данный элемент управления «Многострочным текстовым полем».
Возвращает или задает имя элемента управления.
Данное свойство не применимо к этому классу.
Возвращает или задает родительский контейнер элемента управления.
Получает или задает знак, используемый для маскировки знаков пароля, вводимых в однострочный элемент управления TextBox.
Возвращает или задает текст, отображаемый, если элемент управления не имеет текста и не имеет фокуса.
Получает предпочтительную высоту текстового поля.
Возвращает размер прямоугольной области, в которую может поместиться элемент управления.
Возвращает имя продукта сборки, содержащей элемент управления.
Возвращает версию сборки, содержащую элемент управления.
Получает или задает значение, указывающее, является ли текст в текстовом поле доступным только для чтения.
Возвращает значение, указывающее, осуществляет ли в настоящий момент элемент управления повторное создание дескриптора.
Возвращает или задает область окна, связанную с элементом управления.
Является устаревшей.
Является устаревшей.
Это свойство устарело.
Возвращает или задает значение, указывающее, перерисовывается ли элемент управления при изменении размеров.
Возвращает расстояние в пикселях между правой границей элемента управления и левой границей клиентской области его контейнера.
Возвращает или задает значение, указывающее, выровнены ли компоненты элемента управления для поддержки языков, использующих шрифты с написанием справа налево.
Получает значение, определяющее масштабирование дочерних элементов управления.
Получает или задает значение, показывающее, какие полосы прокрутки должны присутствовать в многострочном элементе управления TextBox.
Возвращает или задает значение, указывающее текст, выбранный в настоящий момент в элементе управления.
Получает или задает число символов, выделенных в редактируемой части текстового поля.
Получает или задает число знаков, выделенных в текстовом поле.
Получает или задает начальную позицию текста, выбранного в текстовом поле.
Возвращает или задает значение, указывающее, включены ли определенные сочетания клавиш.
Возвращает значение, указывающее, должен ли элемент управления отображать прямоугольники фокуса.
Возвращает значение, указывающее, имеет ли пользовательский интерфейс соответствующее состояние, при котором отображаются или скрываются сочетания клавиш.
Возвращает или задает местонахождение элемента управления.
Возвращает или задает высоту и ширину элемента управления.
Возвращает или задает последовательность перехода по клавише TAB между элементами управления внутри контейнера.
Возвращает или задает значение, указывающее, может ли пользователь перевести фокус на данный элемент управления при помощи клавиши TAB.
Возвращает или задает объект, содержащий данные об элементе управления.
Возвращает или задает текст, связанный с этим элементом управления.
Получает или задает способ выравнивания текста в элементе управления TextBox.
Возвращает длину текста в элементе управления.
Возвращает или задает расстояние в пикселях между верхней границей элемента управления и верхней границей клиентской области его контейнера.
Получает родительский элемент управления, не имеющий другого родительского элемента управления Windows Forms. Как правило, им является внешний объект Form, в котором содержится элемент управления.
Получает или задает значение, указывающее, следует ли отображать текст в элементе управления TextBox как знак пароля по умолчанию.
Возвращает или задает значение, указывающее, следует ли использовать курсор ожидания для текущего элемента управления и всех дочерних элементов управления.
Возвращает или задает значение, указывающее, отображаются ли элемент управления и все его дочерние элементы управления.
Возвращает или задает ширину элемента управления.
Данное свойство не применимо к этому классу.
Показывает, переносятся ли автоматически в начало следующей строки слова текста по достижении границы многострочного текстового поля.
Методы
Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.
Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.
Добавляет текст в конец текущего текста в текстовом поле.
Выполняет указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления.
Выполняет указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления.
Выполняет указанный делегат асинхронно с указанными аргументами в потоке, в котором был создан базовый дескриптор элемента управления.
Помещает элемент управления в начало z-порядка.
Удаляет весь текст из элемента управления «Текстовое поле».
Удаляет из буфера отмены текстового поля сведения относительно последней операции.
Возвращает значение, указывающее, является ли указанный элемент управления дочерним элементом.
Предоставляет элемент управления «текстовое поле» Windows.
Копирует текущий выбор из текстового поля в буфер обмена.
Предоставляет элемент управления «текстовое поле» Windows.
Предоставляет элемент управления «текстовое поле» Windows.
Вызывает принудительное создание видимого элемента управления, включая создание дескриптора и всех видимых дочерних элементов.
Создает новый экземпляр коллекции элементов управления для данного элемента управления.
Создает объект Graphics для элемента управления.
Создает дескриптор для элемента управления.
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.
Перемещает текущий выбор из текстового поля в буфер обмена.
Отправляет заданное сообщение процедуре окна, используемой по умолчанию.
Указывает, что значение свойства SelectionLength равно нулю для отмены выделения символов в элементе управления.
Удаляет дескриптор, связанный с элементом управления.
Освобождает все ресурсы, занятые модулем Component.
Освобождает неуправляемые ресурсы, используемые объектом TextBox, а при необходимости освобождает также управляемые ресурсы.
Освобождает неуправляемые ресурсы, используемые объектом Control и его дочерними элементами управления (при необходимости освобождает и управляемые ресурсы).
Начинает операцию перетаскивания.
Начинает операцию перетаскивания.
Поддерживает отрисовку в указанном точечном рисунке.
Получает возвращаемое значение асинхронной операции, представленное переданным объектом IAsyncResult.
Определяет, равен ли указанный объект текущему объекту.
Возвращает форму, в которой находится элемент управления.
Устанавливает фокус ввода на элемент управления.
Получает указанный объект AccessibleObject.
Получает значение, указывающее, как будет вести себя элемент управления, когда его свойство AutoSize включено.
Извлекает знак, ближайший к указанному местоположению в элементе управления.
Возвращает индекс ближайшего к указанному местоположению символа.
Возвращает дочерний элемент управления, имеющий указанные координаты.
Возвращает дочерний элемент управления, расположенный по указанным координатам, определяя, следует ли игнорировать дочерние элементы управления конкретного типа.
Возвращает следующий объект ContainerControl в цепочке родительских элементов управления данного элемента.
Возвращает индекс первого символа заданной строки.
Возвращает индекс первого символа текущей строки.
Служит хэш-функцией по умолчанию.
Является устаревшей.
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.
Вычисляет номер строки по указанному положению символа в тексте элемента управления.
Возвращает следующий или предыдущий элемент среди дочерних элементов управления в последовательности клавиши TAB.
Вычисляет положение в элементе управления по указанному индексу символа.
Вычисляет размер прямоугольной области, в которую помещается элемент управления.
Возвращает границы, внутри которых масштабируется элемент управления.
Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.
Возвращает значение указанного бита стиля элемента управления для данного элемента управления.
Определяет, находится ли элемент управления на верхнем уровне.
Возвращает объект Type для текущего экземпляра.
Скрывает элемент управления от пользователя.
Является устаревшей.
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.
Вызывается после добавления элемента управления в другой контейнер.
Делает недействительной всю поверхность элемента управления и вызывает его перерисовку.
Делает недействительной конкретную область элемента управления и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Выполняет указанный делегат в том потоке, которому принадлежит основной дескриптор окна элемента управления, с указанным списком аргументов.
Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления.
Вызывает событие GotFocus для указанного элемента управления.
Вызывает событие LostFocus для указанного элемента управления.
Вызывает событие Click для указанного элемента управления.
Вызывает событие Paint для указанного элемента управления.
Вызывает событие PaintBackground для указанного элемента управления.
Определяет, является ли символ входным символом, который распознается элементом управления.
Определяет, является ли указанная клавиша клавишей ввода или специальной клавишей, требующей предварительной обработки.
Преобразует логическое значение DPI в эквивалентное значение DPI DeviceUnit.
Преобразует размер из логических единиц в единицы устройства путем его масштабирования к текущему DPI и округлением вниз до ближайшего целого значения ширины и высоты.
Создает неполную копию текущего объекта Object.
Создает неполную копию текущего объекта MarshalByRefObject.
Вызывает событие Invalidated, чтобы сделать недействительной указанную область элемента управления.
char to string c#
Очень нужна помощь, пожалуйста. Есть текст в richtextbox, который превращаю в массив символов. Дальше нужно пройтись по всему массиву символов и проверить нет ли знаков (можно только буквы, если знак удалить, я пока добавляю в textbox), затем нужно добавить в datagrid слово, которое состоит из букв без иных знаков (в нижнем регистре). Проблема в том, что добавляется в datagrid в одну строку все слова и склеенные. Понимаю, что нужно разделить по пробелу, но так тоже не получается вывести нормально по одному слову в одну строку datagrid. Вот код:
. string word; string str; private DataGridViewRow row; public Form1() < InitializeComponent(); var col1 = new DataGridViewTextBoxColumn(); dataGridView1.Columns.AddRange(col1); >private void button1_Click(object sender, EventArgs e) < Word(); >public bool Oper(char v) < if (("№:;'+-/*@^<>~`()%$ =<>&. --#0123456789".IndexOf(v) != -1)) return true; return false; > public void Word() < char[] lines = richTextBox1.Text.ToCharArray(); foreach (var s in lines) < if (!Oper(s) && s != ' ') < word += s; >else < textBox1.Text = textBox1.Text + s; >> dataGridView1.Rows.Add(word.ToString().ToLower()); > >
Отслеживать
задан 21 сен 2019 в 17:54
15 4 4 бронзовых знака
21 сен 2019 в 18:46
Пробовала, не получается, сливается все в одну строку и добавляется в одну строку datagrid
21 сен 2019 в 19:00
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Я бы предложил работать через формирование списка токенов на основе изучаемого текста.
Создадим такой интерфейс
public interface IToken < //значение токена string Value < get; >//позиция первого символа токена в тексте int Position < get; >//название токена string TokenName < get; >//инфо для отображения string TokenValue < get; >>
Вот пример класса для токена Пробела
public class SpaceToken : IToken < public string Value < get; >public int Position < get; >public string TokenName < get; >public string TokenValue => $@"[:]"; public SpaceToken(int position) < Position = position; Value = " "; TokenName = "space"; >public override string ToString() < return TokenName; >>
А это для токена слова
public class WordToken : IToken < public string Value < get; >public int Position < get; >public string TokenName < get; >public string TokenValue => $"::>"; public int OrderNumber < get; >public WordToken(int position, string value, int orderNumber) < Position = position; Value = value.ToLower(); TokenName = "word"; OrderNumber = orderNumber; >public override string ToString() < return Value; >>
Тогда текст можно превратить в токены так
public List GetTokens(string text) < if (string.IsNullOrEmpty(text)) throw new ArgumentException(nameof(text)); //готовим результат Listtokens = new List(); //нумерация слов в тексте int wordsOrder = 0; //позиция первой буквы слова int wordPosition = 0; //для посимвольного набора слова List wordChars = new List(); var chars = text.ToCharArray(); for (int i = 0; i < chars.Length; i++) < //извлекаем текущий символ var current = chars[i]; if (Char.IsLetter(current)) < //если это первая буква слова if (wordChars.Count == 0) < wordPosition = i; >//вносим букву в массив слова wordChars.Add(current); //если это последний символ в тексте, т.е. текст заканчивается на слове //нужно добавить словный токен if (i + 1 == chars.Length) < AddWordToken(wordChars, wordPosition, tokens, ++wordsOrder); >> else < //т.е. текущий символ не относится к слову //и до этого у нас возможно собиралось слово //и его нужно закрывать и создавать словный токен if (wordChars.Count >0) < AddWordToken(wordChars, wordPosition, tokens, ++wordsOrder); //очищаем для следующего слова wordChars.Clear(); >//добавляем небуквенный токен AddNotLetterToken(tokens, i, current); > > return tokens; > private void AddWordToken(List wordChars, int position, List tokens, int wordsOrder) < var array = wordChars.ToArray(); var word = new String(array); tokens.Add(new WordToken(position, word, wordsOrder)); >private void AddNotLetterToken(List tokens, int i, char current) < if (Char.IsWhiteSpace(current)) < tokens.Add(new SpaceToken(i)); return; >if (Char.IsDigit(current)) < tokens.Add(new NumberToken(i, current.ToString())); return; >//если это не пробел и не цифра, значит это какой-то знак tokens.Add(new SignToken(i, current.ToString())); >
Ну, а далее уже будет достаточно просто работать с коллекцией токенов.
Shatunoff
Пришло время научить наш блокнот работать с текстом, а именно: вставлять, удалять, вырезать, копировать, искать и заменять текст. Помимо этого мы научим строку состояния выводить нам актуальную информацию о количестве символов в тексте (с пробелами и без), а также о количестве строк в документе.

Для начала напишем код для элементов меню «Правка».
Отменить
Вырезать
if (notebox.SelectionLength > 0)
<
notebox.Cut();
>
Копировать
if (notebox.SelectionLength > 0)
<
notebox.Copy();
>
Вставить
Удалить
if (notebox.SelectionLength > 0)
<
notebox.SelectedText = «»;
>
Выделить всё
Время и дата
Найти и заменить
SearchForm findText = new SearchForm();
findText.Owner = this;
findText.Show();
Перейти.
GoToForm gotoform = new GoToForm();
gotoform.Owner = this;
gotoform.tbLineNum.Minimum = 0;
gotoform.tbLineNum.Maximum = notebox.Lines.Count();
gotoform.ShowDialog();
TextWork.cs
Теперь создадим класс TextWork.cs. В этот класс мы поместим методы поиска и замены для нашего текстового редактора, а также методы подсчета символов, строк и слов для строки состояния, метод для активации некоторых пунктов меню «Правка» только при наличии текста.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace NewNoteBlock
<
public static class TextWork
<
// Метод поиска текста в TextBox
// Для использования создаем в форме поиска глобальную переменную
// типа int = 0 для стартовой позиции поиска,
// передаем в метод ссылки на TextBox’ы с исходным и искомым текстами,
// а также необходимо указать, учитывать ли регистр букв при поиске (True — учитывать, False — не учитывать)
public static int FindTextBox(ref TextBox textBox, string findText, ref int findCutLength, bool register)
<
// Поиск с учетом регистра
if (register == true)
<
if (textBox.Text.Contains(findText))
<
// Заносим текст в переменную string, удаляем из него уже пройденный
// текст (findCutLength) в переменной nextText
string text = textBox.Text;
string nextText = text.Remove(0, findCutLength);
// Ищем в nextText
int resultPosition = nextText.IndexOf(findText);
// Если искомое выражение найдено — выделяем его, добавляем его позицию и длину
// к значению пройденного текста (findCutLenght)
if (resultPosition != -1)
<
textBox.Select(resultPosition + findCutLength, findText.Length);
textBox.ScrollToCaret();
textBox.Focus();
findCutLength += findText.Length + resultPosition;
>
// Если попытка поиска не первая, и больше совпадений в тексте нет — обнуляем
// значение пройденного текста и начинаем поиск сначала
else if (resultPosition == -1 && findCutLength != 0)
<
findCutLength = 0;
return FindTextBox(ref textBox, findText, ref findCutLength, register);
>
>
else
<
findCutLength = 0;
MessageBox.Show(«По вашему запросу ничего не нашлось.», «Совпадений не найдено», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
// Поиск без учета регистра
else if (register == false)
<
if (textBox.Text.ToLower().Contains(findText.ToLower()))
<
string text = textBox.Text.ToLower();
string nextText = text.Remove(0, findCutLength);
int resultPosition = nextText.IndexOf(findText.ToLower());
if (resultPosition != -1)
<
textBox.Select(resultPosition + findCutLength, findText.Length);
textBox.ScrollToCaret();
textBox.Focus();
findCutLength += findText.Length + resultPosition;
>
else if (resultPosition == -1 && findCutLength != 0)
<
findCutLength = 0;
return FindTextBox(ref textBox, findText, ref findCutLength, register);
>
>
// Если текст изначально не содержит результатов поиска — обнуляем findCutLength, выводим сообщение
else
<
findCutLength = 0;
MessageBox.Show(«По вашему запросу ничего не нашлось.», «Совпадений не найдено», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
return 0;
>
// Метод «Заменить»
public static int ReplaceTextBox(ref TextBox textBox, string findText, string replaceText, ref int findCutLength, bool register)
<
if (register == true)
<
if (textBox.Text.Contains(findText))
<
if (textBox.SelectedText == «» || textBox.SelectedText != findText)
<
string text = textBox.Text;
string nextText = text.Remove(0, findCutLength);
int resultPosition = nextText.IndexOf(findText);
if (resultPosition != -1)
<
textBox.Select(resultPosition + findCutLength, findText.Length);
textBox.ScrollToCaret();
textBox.Focus();
findCutLength += findText.Length + resultPosition;
>
else if (resultPosition == -1 && findCutLength != 0)
<
findCutLength = 0;
return ReplaceTextBox(ref textBox, findText, replaceText, ref findCutLength, register);
>
>
else if (textBox.SelectedText == findText)
<
textBox.SelectedText = replaceText;
>
>
else
<
findCutLength = 0;
MessageBox.Show(«По вашему запросу ничего не нашлось.», «Совпадений не найдено», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
else if (register == false)
<
if (textBox.Text.ToLower().Contains(findText.ToLower()))
<
if (textBox.SelectedText == «» || textBox.SelectedText.ToLower() != findText.ToLower())
<
string text = textBox.Text.ToLower();
string nextText = text.Remove(0, findCutLength);
int resultPosition = nextText.IndexOf(findText.ToLower());
if (resultPosition != -1)
<
textBox.Select(resultPosition + findCutLength, findText.Length);
textBox.ScrollToCaret();
textBox.Focus();
findCutLength += findText.Length + resultPosition;
>
else if (resultPosition == -1 && findCutLength != 0)
<
findCutLength = 0;
return ReplaceTextBox(ref textBox, findText, replaceText, ref findCutLength, register);
>
>
else if (textBox.SelectedText.ToLower() == findText.ToLower())
<
textBox.SelectedText = replaceText;
>
>
else
<
findCutLength = 0;
MessageBox.Show(«По вашему запросу ничего не нашлось.», «Совпадений не найдено», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
return 0;
>
// Метод «Заменить всё»
public static int ReplaceAllTextBox(ref TextBox textBox, string findText, string replaceText, bool register)
<
if (register == true)
<
string text = textBox.Text;
string words = findText;
if (textBox.Text.Contains(words))
<
int startPosition = text.IndexOf(words);
textBox.Select(startPosition, words.Length);
textBox.SelectedText = replaceText;
return ReplaceAllTextBox(ref textBox, findText, replaceText, register);
>
else
<
MessageBox.Show(«Замены произведены успешно.», «Заменить всё», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
else if (register == false)
<
string text = textBox.Text.ToLower();
string words = findText.ToLower();
if (text.Contains(words))
<
int startPosition = text.IndexOf(words);
textBox.Select(startPosition, findText.Length);
textBox.SelectedText = replaceText;
return ReplaceAllTextBox(ref textBox, findText, replaceText, register);
>
else
<
MessageBox.Show(«Замены произведены успешно.», «Заменить всё», MessageBoxButtons.OK, MessageBoxIcon.Information);
>
>
return 0;
>
public static void mEditEnableds(ref TextBox notebox, ref ToolStripMenuItem mEditCopy, ref ToolStripMenuItem mEditCut, ref ToolStripMenuItem mEditDel)
<
if (notebox.Text.Length < 1)
<
mEditCopy.Enabled = false;
mEditCut.Enabled = false;
mEditDel.Enabled = false;
mEditFind.Enabled = false;
mEditGo.Enabled = false;
>
else
<
mEditCopy.Enabled = true;
mEditCut.Enabled = true;
mEditDel.Enabled = true;
mEditFind.Enabled = true;
mEditGo.Enabled = true;
>
>
public static void StatusAnalize(ref TextBox notebox, ref ToolStripStatusLabel statusLinesCount, ref ToolStripStatusLabel statusWordsCount, ref ToolStripStatusLabel statusCharSpaceCount, ref ToolStripStatusLabel statusCharCount)
<
string text = notebox.Text;
// Количество строк в тексте
statusLinesCount.Text = notebox.Lines.Count().ToString();
// Количество слов в тексте
statusWordsCount.Text = text.Split(new Char[] < ' ', '\t', '\n', '\r', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-',
‘_’, ‘+’, ‘=’, ‘[‘, », ‘/’, ‘\\’, ‘|’, ‘»‘, ‘:’, ‘;’, ‘.’, ‘,’, ‘>’, ‘, StringSplitOptions.RemoveEmptyEntries).Length.ToString();
// Количество символов без пробелов
statusCharCount.Text = text.Replace(» «, «»).Replace(«\t», «»).Replace(«\n», «»).Replace(«\r», «»).ToCharArray().Length.ToString();
// Количество символов с пробелами
statusCharSpaceCount.Text = text.ToCharArray().Length.ToString();
>
>
>
SearchForm.cs
Переходим к коду формы SearchForm.cs. В нём мы определим ту самую переменную из класса TextWork.cs, по которой метод поиска определяет с какой позиции начать выполнять операцию, а также напишем код для использования этого класса.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace NewNoteBlock
<
public partial class SearchForm : Form
<
public SearchForm()
<
InitializeComponent();
>
private void SearchForm_Shown(object sender, EventArgs e) // Событие при открытии формы поиска и замены
<
tbFind.Focus();
>
int findCutLength = 0; // На сколько символов обрезаем текст для поиска
private void tbFind_TextChanged(object sender, EventArgs e) // Cобытие при изменении текста в tbFind
<
findCutLength = 0;
>
private void tbReplace_TextChanged(object sender, EventArgs e) // Событие при изменении текста в tbReplace
<
findCutLength = 0;
>
private void cbReg_CheckStateChanged(object sender, EventArgs e) // Событие при изменении статуса cbReg
<
findCutLength = 0;
>
private void SearchForm_FormClosing(object sender, FormClosingEventArgs e) // Событие при закрытии формы (до закрытия)
<
findCutLength = 0;
>
private void butFind_Click(object sender, EventArgs e) // Кнопка «Найти»
<
MainForm main = this.Owner as MainForm;
if (main != null)
<
if (cbReg.CheckState == CheckState.Checked)
<
TextWork.FindTextBox(ref main.notebox, tbFind.Text, ref findCutLength, true);
>
else
<
TextWork.FindTextBox(ref main.notebox, tbFind.Text, ref findCutLength, false);
>
>
>
private void butReplace_Click(object sender, EventArgs e) // Кнопка «Заменить»
<
MainForm main = this.Owner as MainForm;
if (main != null)
<
if (cbReg.CheckState == CheckState.Checked)
<
TextWork.ReplaceTextBox(ref main.notebox, tbFind.Text, tbReplace.Text, ref findCutLength, true);
>
else
<
TextWork.ReplaceTextBox(ref main.notebox, tbFind.Text, tbReplace.Text, ref findCutLength, false);
>
>
>
private void butReplaceAll_Click(object sender, EventArgs e) // Кнопка «Заменить всё»
<
MainForm main = this.Owner as MainForm;
if (main != null)
<
if (cbReg.CheckState == CheckState.Checked)
<
TextWork.ReplaceAllTextBox(ref main.notebox, tbFind.Text, tbReplace.Text, true);
>
else
<
TextWork.ReplaceAllTextBox(ref main.notebox, tbFind.Text, tbReplace.Text, false);
>
>
>
private void butCancel_Click(object sender, EventArgs e) // Кнопка «Отмена»
<
this.Close();
>
>
>