shaileshshinde Ответов: 2

Перекрытие строк после изменения текста


я разрабатываю программу, в которой только символы клавиатуры, я имею в виду только значения клавиш клавиатуры, принимаются в текстовом поле, а другие удаляются.

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

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

Что я уже пробовал:

Тусклые символы, разрешенные как строка = " abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz`~,;.:!""@#$%^&*()_-?/+=|\}]{[<>'"

Частная суб TextBox1_TextChanged(отправителя как объект, а равно EventArgs) обрабатывает текстовое поле textbox1.Очередь textchanged
Дим текст как строка = элемент textbox1.Текст
Тусклая Буква Как Строка
Дим sel_s как integer = текстовое поле textbox1.Объект selectionstart
Дим did_change как булево = ложь
Для x As Integer = 0 To TextBox1.Text.Length - 1
Letter = TextBox1.Text.Substring(x, 1)
Если символов.Содержит(Письмо) = Ложь Тогда
theText = theText.Replace(буква, строка.Пустой)
did_change = истина
Конец, Если
Следующий
Текстовое поле textbox1.Текст = текст
Если did_change = True, то
Текстовое поле textbox1.Выберите(sel_s, 0)
Еще
TextBox1.Select(sel_s - 1, 0)
Конец, Если
Конец Подводной Лодки

2 Ответов

Рейтинг:
2

Maciej Los

Не ответ, а предложение...

Я бы посоветовал использовать Класс ErrorProvider (System.Окна.Формы) | Microsoft Docs[^]
Это позволяет вам Отображение значков ошибок для проверки формы с помощью компонента ErrorProvider - Windows Forms | Microsoft Docs[^]

Это было бы более эффективно, чем проверка текста при каждом нажатии клавиши. Все, что вам нужно сделать, это использовать Контроль.События Validating (Системы.Окна.Формы) | Microsoft Docs[^]
Когда проверка будет пройдена, то очистите сообщение об ошибке от ErrorProvider объект.

Вот простой пример: Visual Studio 2010 ErrorProvider control in VB.NET[^]

Что касается вашего кода... Вы можете использовать Linq, чтобы получить список запрещенных символов. Видеть:

Dim charactersAllowed As String = " abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ`~,;.:!""@#$%^&*()_-?/+=|\}]{[<>'"
Dim enteredText = "Kraków, Łódź, Poznań and Wrocław - cities of Poland with citizens between 500,000 and 999,999!"

Dim result = enteredText _
	.Where(Function(x) Not charactersAllowed.Any(Function(y) y=x)) _
	.Select(Function(x) x) _
	.ToList()
	
Console.WriteLine($"'{String.Join(", ", result)}' are not allowed!")


Рейтинг:
0

OriginalGriff

Проблема в том, что при загрузке текста из файла в текстовое поле возникает событие TextChanged, которое удаляет символы, отсутствующие в вашем списке. И этот список не включает символ новой строки, поэтому вы удаляете их все и получаете в результате одну строку текста. Добавьте новую строку в свой список "разрешено", и все будет в порядке.

Но также убедитесь, что ваше текстовое поле помечено как многострочное - если это не так, то новые строки все равно не будут иметь никакого эффекта!


shaileshshinde

как добавить новую строку в список "разрешенных ", сэр?

это мой список.;

Тусклые символы, разрешенные как строка = " abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz`~,;.:!""@#$%^&*()_-?/+=|\}]{[<>'"

OriginalGriff

Попробуйте включить это:
https://docs.microsoft.com/en-us/dotnet/api/system.environment.newline?view=netcore-3.1

shaileshshinde

спасибо, вопрос решен, решен.

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

OriginalGriff

Во - первых, не выполняйте длительных операций в обработчике кликов-вы заблокируете пользовательский интерфейс до тех пор, пока все они не будут завершены. Переместите длинные операции в другой поток - я бы предложил посмотреть на BackgroundWorker, поскольку они просты в использовании и предоставляют отчеты о ходе выполнения в пользовательский интерфейс.

Затем тривиально заставить его работать для нескольких файлов: переместите свой код в метод, который принимает путь в качестве параметра, и вызывайте его повторно.

shaileshshinde

есть примеры кода, сэр?
поскольку я не совсем понимаю, что вы говорите

OriginalGriff

Ты ведь шутишь, правда?
Вам нужен пример кода для написания метода, который принимает строковый параметр?

shaileshshinde

так что извини, я все понял, совсем забыл.

OriginalGriff

Такое случается.