Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/133: Рейтинг темы: голосов - 133, средняя оценка - 4.51
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521

Вызов события TextChanged в TextBox по нажатию Enter

20.02.2014, 11:57. Показов 25222. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть несколько TextBox'сов. Вполне логично прикрутить по событию TextChanged некоторую обработку.
Но! Чтоб активировалось это событие TextBox должен потерять фокус - а это не очень удобно.
прикручиваю метод на KeyDown:

C#
1
2
3
4
5
6
7
        private void Artikl_Filter_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                (sender as TextBox).TextChanged(sender, null);
            }
        }
Выдает:
Событие "System.Windows.Forms.Control.TextChange d" может находиться только в левой части операции += или -=
че это за такое корявое событие, что я его вызвать не могу?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2014, 11:57
Ответы с готовыми решениями:

Вызов события из другого события по нажатию клавиши
Всем привет! Есть кнопка на Windows.Forms, к ней привязано событие. Хочется, чтобы еще и по нажатию Enter эта кнопка срабатывала...

Отмена события по нажатию на Enter
Доброго времени суток. Есть кнопка по нажатию на которую добавляются текстовые поля. Но когда нажимаешь на поле и enter то поле тоже...

Убрать обработку события по нажатию Enter
У меня есть сгенерированный код, который я не могу редактировать: jTextField1.setColumns(3); jTextField1.setFont(new...

20
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.02.2014, 12:10
Цитата Сообщение от Learx Посмотреть сообщение
че это за такое корявое событие, что я его вызвать не могу?
Это как раз нормальное событие. Оно является оберткой над делегатами и поддерживает всего 2 действия: add(+=) и remove(-=). Вызываются как раз делегаты. Для возникновения события TextChanged, нужно вызывать метод OnTextChanged. Но этот метод защищенный, поэтому его можно вызывать только из класса наследника.
В общем, либо вызывайте обработчик события напрямую, либо создайте метод, который вы будете вызывать, как из обработчика события TextChanged, так и из обработчика события KeyDown.
1
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.02.2014, 12:22
Цитата Сообщение от Learx Посмотреть сообщение
че это за такое корявое событие, что я его вызвать не могу?

Не по теме:

- не люблю я кошек...
- Просто ты не умеешь их готовить



событие как раз нормальное. На событие либо подписку нужно делать, что собственно в данном случае абсолютно не нужно, либо напрямую вызывать метод, который работает при требуемом событии.
1
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
20.02.2014, 13:02  [ТС]
значит будем создавать свой TextBox.

свое заключение о корявости я заключил из статьи msdn
то, что указано как пример использования события(и как я раньше пользовался событиями сам) не работает с контролами .
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.02.2014, 13:17
Learx, вот нутром чую, что ты ошибаешься, и ничего тут разрабатывать не нужно. Опиши подробно задачу, тогда станет ясно, чем тебе можно помочь
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
20.02.2014, 14:02
Цитата Сообщение от Learx Посмотреть сообщение
че это за такое корявое событие, что я его вызвать не могу?
Цитата Сообщение от nio Посмотреть сообщение
- не люблю я кошек...
- Просто ты не умеешь их готовить
целиком поддерживаю. и вообще, как пришло в голову вызывать события ДРУГИХ объектов?
объект может вызвать свои и только свои события. Даже наследник не имеет полного доступа к функционалу событий предка.

а по поводу задачи..

Очевидно, что раз необходимо вызвать событие TextChanged, на это событие подвешан какой-то обработчик.

Предполагается, что если используется конструкция "(sender as TextBox)." то подобных объектов как минимум больше одного.

Так же разумно предположить, что если необходимо нажимать enter для костыльного вызова обработчиков TextChanged, либо:
а) Обработчик зависит от внешних, постоянно изменяющихся объектов (потоки, либо банальный рандом).
б) Сильно, очень сильно хромает логика MVC
в) Обработчики события добавляются после установки первоначального значения текста (в принципе это "б")

нужно или править логику, либо при нажатии enter изменять текст и возвращать его в исходное состояние (двойной вызов события, явный костыль, причем корявый), либо таки создать предка TextBox с блэкдж... с новым событием, которое вызывается каждый раз как только вызываются события базового класса TextChanged или KeyDown, если (key==enter)
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
20.02.2014, 15:17  [ТС]
задача более чем полностью отражена в теме.
1) по сути: имеем сто тыщ TextBox
2) изменение текста вызывает определенную обработку
3) используется метод прикрученный к TextChanged, у каждого свой
4) если бы работало как в статье мсдн:
- создаем статический метод, который по нажатию Enter вызывает у TextBox'а отправителя событие TextChanged
- прикрутив к событию KeyDown наш статический метод Любой TextBox теперь адекватно реагирует на нажатие Enter. PROFIT!!!
5) что по факту имею: на каждом TextBox свой метод KeyDown который вызывает нужный метод, отличаясь лишь названием метода(а этот метод и так прикручен уже к TextChanged) = говнокод

Добавлено через 10 минут
да, из-за того что событие в контролах ограничено ТОЛЬКО += и -=, а вызов события - защищенный метод
приходится создавать свой ТВ:
C#
1
2
3
4
5
6
7
8
9
10
    class TextBoxEnter : TextBox
    {
        public TextBoxEnter()
        {
            this.KeyDown += new KeyEventHandler((x, e) =>
            {
                 if (e.KeyCode == Keys.Enter) this.OnTextChanged(null);
            });
        }
    }
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.02.2014, 15:54
Learx, я не понимаю, зачем использовать KeyDown для вызова TextChanged? Почему не использовать сразу TextChanged? Изменился текст - сработал соответствующий обработчик. А тут какая-то левая подписка каждого текстбокса на общее событие, только для того, что бы оно вызвало опять же индивидуальное для вызывающего событие....
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
20.02.2014, 16:04  [ТС]
изменение текста->вызов обработки
как определить изменение текста:
1) событие TextChanged
2) нажатие Enter

вопросы:
1. как сделать чтоб при каждом из случаев(и 1 и 2) выполнялся один метод?
2. как это дело оптимизировать, чтоб работало на всех TextBox, которые требуют обработки после изменения содержимого(а не городить тысячи методов, когда нам на самом деле требуется одно и то же поведение)
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
20.02.2014, 16:15
Цитата Сообщение от Learx Посмотреть сообщение
1. как сделать чтоб при каждом из случаев(и 1 и 2) выполнялся один метод?
вызывать в методе1 и методе2, которые являются обработчиками случаев 1 и 2, метод 3.

Цитата Сообщение от Learx Посмотреть сообщение
2. как это дело оптимизировать, чтоб работало на всех TextBox, которые требуют обработки после изменения содержимого(а не городить тысячи методов, когда нам на самом деле требуется одно и то же поведение)
передовать ссылку на экземпляр, вызвавший событие.

и да:
Цитата Сообщение от Learx Посмотреть сообщение
как определить изменение текста:
1) событие TextChanged
2) нажатие Enter
если текстбокс не мультилайновый, то нажатие Enter не изменит текста в нём.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
20.02.2014, 17:02  [ТС]
вызывать в методе1 и методе2, которые являются обработчиками случаев 1 и 2, метод 3.
так и работает.
цель данного топика - сократить количество методов1 и 2 которые по сути есть болванка для поведения текстбокса
передовать ссылку на экземпляр, вызвавший событие.
тогда метод3 будет многостраничным эпосом с кучей switch для всех текст боксов.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.02.2014, 17:49
Learx, ты решаешь проблему не с той стороны: KeyDown - ловит событие нажатия кнопки, при нажатии ввода тебе нужно выполнить тоже самое, что происходит при окончании редактирования. Поэтому тебе нужно не искать способ вызова события, а создать его. Т.е. при нажатии Enter должно быть окончено редактирование текcта, это автоматически вызовет событие TextChanged
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
21.02.2014, 16:41  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
при нажатии Enter должно быть окончено редактирование текcта

как это реализовать?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.02.2014, 12:40  [ТС]
в моем понимании "окончание редактирования" - это и есть вызов события TextChanged. реализовал свой класс и все работает как надо.

Другие две возможности: вызов OnTextChanged или непосредственно события TextChanged невозможны из-за их ограничений, приходится создавать свой класс-наследник.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
24.02.2014, 15:24
Цитата Сообщение от Learx Посмотреть сообщение
в моем понимании "окончание редактирования" - это и есть вызов события TextChanged
хм... странно, на мой взгляд окончание редактирования, судя по контексту - это событие enter. и если для разных текст-боксов необходимо установить принципиально разные обработчики окончания редактирования - необходимо создавать вручную каждый обработчик. другой вопрос - а зачем тогда событие TextChanged, если оно сообщает о каждом промежуточном изменении текста и в итоге и не нужно? и да, это не риторический вопрос.

Добавлено через 22 минуты
на мой взгляд правильнее организовать как то так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
...
 
textBox1.KeyDown += (sndr, e) => if (e.KeyCode == Keys.Enter) textBox1_FinishEdit(sndr);
textBox1.lostFocus += (sndr, e) => textBox1_FinishEdit(sndr);
textBox1.TextChanged += (sndr, e) => allBox_StartEdit(sndr);
 
...
void allBox_StartEdit(object sender)
{
(sender as TextBox).Tag=false;
(sender as TextBox).BackColor = Color.Green;
}
 
bool allBox_FinishEdit(object sender)
{
if ((sender as TextBox).Tag != null)
if ((sender as TextBox).Tag is bool)
if (((sender as TextBox).Tag as object) == false)
{
(sender as TextBox).Tag = true;
(sender as TextBox).BackColor = Color.Whie;
return true;
}
return false;
}
 
void textBox1_FinishEdit(object  sender)
{
if(!allBox_FinishEdit(sender)) return;
 
//тут что-нибудь вроде:
SetSpecialValue((sender as TextBox).Text);
}
В итоге пока идёт изменение текст-бокса он сам зелёный, но ничего кроме как его текста не изменяется. так же значение его тэга становится булевым значением false

Как только нажат enter (или способ для ленивых - переход на новый контрол без нажатия) проверяется значение тэга, и если оно не false, то действие и не требуется, иначе установка тэга в true и вызов специального обработчика для контрола.

Можно даже допилить метод allBox_StartEdit чтоб и внутри него постоянно проверялся тэг, и если он уже false, то ничего и делать ненужно.

Как итог - у нас количество обработчиков ровно на два больше чем количество текст-боксов, а пользователь сразу видит реальные значение Control модели. Ну или если бокс зелёный - View модели.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.02.2014, 15:25  [ТС]
это уже черезчур.
рабочий вариант найден, и он гораздо компакнее вашего кода.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
24.02.2014, 15:35
Цитата Сообщение от Learx Посмотреть сообщение
Теперь хочу добавить обработку по нажатию Ente
момент такой, если пользователь до этого вводил что-нибудь, то данные уже обработаны обработчиком TextChanged, если не вводил - то данные остались прежними и обрабатывать нечего.

Цитата Сообщение от Learx Посмотреть сообщение
просто пользователь вводит какую-то информацию. и потом нажимает на КНОПКУ чтоб выполнить некоторую операцию. в программе такое очень часто встречается. гораздо удобнее будет, если после того, как пользователь ввел данные сразу начать обработку
неверно. по крайней мере верно далеко не для всех случаев. а если обработчик переинициализирует толпу классов? переписывает некоторые файлы? сортирует здоровенные массивы? пользователь захочет ввести значение "132", но обработчик сначала может выкинуть ексепшн когда текст поля будет "", потом выполнит обработчик для "1", потом для "13", и в конце уже для "132". просто представьте что это поле ответственно за SQL выборку из какой-нибудь здоровенной БД, и получится что для того чтоб произвести эту выборку потребуется времени в 4 раза больше.

хотя... если грамотно организовать многопоточность - то это конечно удобней для пользователя. но опять же, при чём тут событие нажатия enter - не могу понять. Или просто может потребоваться сделать одно и то же действие несколько раз подряд? случай наподобие такого:
Code
1
2
3
4
5
текст бокс<<количество строк в таблице>>:
устанавливается значение 132
создаётся 132 строки, ведь обработчики нажатия на клавиши есть.
нажимается "enter"
строки пересоздаются? нафига?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
25.02.2014, 11:47  [ТС]
в том то и дело что не вызывается событие по мере ввода. событие возникает при потере фокуса текстбоксом!
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
25.02.2014, 12:09
э... простите конечно, но событие TextChanged вызывается при изменении свойства Text класса TextBox, а при потере фокуса происходит событие LostFocus. может вы не на то событие подписали обработчик? это более вероятно чем описанная вами ситуация.
0
 Аватар для Jool
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 39
08.01.2015, 12:12
Есть код. Выдает ошибку, что нет определения для txtBox_TextChanged и txtBoxEmpty_Validating. Как и куда его записать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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;
using System.Data.Common;
using System.Data.SqlClient;
 
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            this.button1.Enabled = false;
 
            this.textBox1.Tag = false;
            this.textBox2.Tag = false;
            this.textBox3.Tag = false;
            this.textBox4.Tag = false;
            this.textBox5.Tag = false;
            this.textBox6.Tag = false;
            this.textBox7.Tag = false;
            this.textBox8.Tag = false;
            this.textBox9.Tag = false;
            this.textBox10.Tag = false;
 
            this.textBox1.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox2.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox3.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox4.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox5.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox6.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox7.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox8.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox9.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
            this.textBox10.Validating += new CancelEventHandler(this.txtBoxEmpty_Validating);
 
            this.textBox1.TextChanged += new EventHandler(txtBox_TextChanged);
            this.textBox2.TextChanged += new EventHandler(txtBox_TextChanged);
            this.textBox3.TextChanged += new
 EventHandler(txtBox_TextChanged);
            this.textBox4.TextChanged += new
            EventHandler(txtBox_TextChanged);
            this.textBox5.TextChanged += new
             EventHandler(txtBox_TextChanged);
            this.textBox6.TextChanged += new
            EventHandler(txtBox_TextChanged);
            this.textBox7.TextChanged += new
            EventHandler(txtBox_TextChanged);
            this.textBox8.TextChanged += new
            EventHandler(txtBox_TextChanged);
            this.textBox9.TextChanged += new
             EventHandler(txtBox_TextChanged);
            this.textBox10.TextChanged += new
            EventHandler(txtBox_TextChanged);
 
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2015, 12:12
Помогаю со студенческими работами здесь

Вызов процедудры по нажатию Enter
Уважаемые не могу понять свою ошибку. // На форме авторизации при нажатии Enter нужно что бы вызывалась процедура BitBtn1.Click ...

<input> вызов onclick-обработчика по нажатию enter
Требуется чтобы когда фокус на кнопке, вызывалась/лись функция/и, привязанная/ые к onclick &lt;input id=&quot;button&quot;...

Обработка данных из TextBox по нажатию Enter
Здравствуйте, начал работать с winform в C# и появился такой вопрос: у меня в форме есть textbox, в нем пользователь что-то вводит и есть...

Имитация нажатия клавиши Enter в TextBox по нажатию кнопки
Что то я совсем легкое и простое позабыл... А найти на форуме не могу... Нужно сделать по нажатию кнопки(button) имитацию нажатии кнопки...

Как по нажатию Enter перейти на новую строку в TextBox
Снова здравствуйте. Маленькая проблема возникла. Имею текстовое поле. Задаю команду, что при нажатии enter начинается новая строка, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru