Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C#. Как блокировать события, чтобы они не выполнялись при работе с контролами? / 18 сообщений из 18, страница 1 из 1
26.12.2012, 14:42
    #38093481
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Есть у меня textbox1 и List1.


Изменяю содержимое textbox1.text, вызывается событие TextChanged.

Изменяю содержимое List1.text, вызывается событие SelectedIndexChanged.

Цель:
При изменении TextBox1, хочется, чтобы в List1 курсор позиционировался в соответствующую строку.
И наоборот:
При изменении выделенной строки в List1, она должна записываться в textbox1.

Проблема:
При изменении TextBox1 я пишу:
Код: c#
1.
2.
3.
4.
5.
void TextBox1_TextChanged(...)
{
   int i = ...
   List1.SelectedIndex = i
}


соответственно, во второй строке вызывается событие SelectedIndexChanged
Код: c#
1.
2.
3.
4.
void List1_SelectedIndexChanged(...)
{
    TextBox1.Text = List1.Text;
}


которое, в свою очередь, из-за изменения значения TextBox1.Text, вызывает TextBox1_TextChanged. И поехали циклиться.

предполагаемое решение
Код: c#
1.
2.
3.
4.
5.
6.
7.
void TextBox1_TextChanged(...)
{
   int i = ...
   SuspendLayout();
   List1.SelectedIndex = i
   ResumeLayout(false);
}


не помогло.
Прошу помощи.
...
Рейтинг: 0 / 0
26.12.2012, 14:46
    #38093491
sld
sld
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
или отключать обработчик события навремя, или ввести булевскую переменную для проверки
...
Рейтинг: 0 / 0
26.12.2012, 14:47
    #38093493
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Charles Weyland,

используй биндинг
...
Рейтинг: 0 / 0
26.12.2012, 14:52
    #38093514
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
pationCharles Weyland,

используй биндинг
в смысле?..
...
Рейтинг: 0 / 0
26.12.2012, 14:53
    #38093519
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Вообще, может, есть паттерн на эту тему?
...
Рейтинг: 0 / 0
26.12.2012, 14:55
    #38093521
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
как удалось добиться зацикливания? Или это просто предположение?


SuspendLayout();ResumeLayout(false); - это здесь не нужно.
...
Рейтинг: 0 / 0
26.12.2012, 15:03
    #38093548
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Изопропилкак удалось добиться зацикливания? Или это просто предположение?


SuspendLayout();ResumeLayout(false); - это здесь не нужно.

Полного зацикливания нет, но по второму разу он по этим событиям проходит - это точно:
Изменяю текстбокс, в нём указывается изменение позиции в списке

Изменяется листбокс, теперь он посылает в текстбокс корректированное название этого текста

снова вызывается текстбокс, в нём указывается изменение позиции в списке. Поскольку позиция на деле не изменяется, то событие листбокса не вызывается.

Зацикливания нет, но всё равно фигня какая-то.
...
Рейтинг: 0 / 0
26.12.2012, 15:06
    #38093557
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Charles WeylandИзменяется листбокс, теперь он посылает в текстбокс корректированное название этого текста

снова вызывается текстбокс, в нём указывается изменение позиции в списке. Поскольку позиция на деле не изменяется, то событие листбокса не вызывается.

Зацикливания нет, но всё равно фигня какая-то.

за вас просто подумали и запретили повторный вызов события.

никакой фигни и никакого зацикливания.
...
Рейтинг: 0 / 0
26.12.2012, 15:21
    #38093584
smeh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
А чем не устроил стандартный комбо-бокс
с выставленным свойством DropDownStyle = Simple

а?
...
Рейтинг: 0 / 0
26.12.2012, 15:33
    #38093615
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
smehА чем не устроил стандартный комбо-бокс
с выставленным свойством DropDownStyle = Simple

а?
тонкости проектного решения...
...
Рейтинг: 0 / 0
26.12.2012, 15:37
    #38093621
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
ИзопропилCharles WeylandИзменяется листбокс, теперь он посылает в текстбокс корректированное название этого текста

снова вызывается текстбокс, в нём указывается изменение позиции в списке. Поскольку позиция на деле не изменяется, то событие листбокса не вызывается.

Зацикливания нет, но всё равно фигня какая-то.

за вас просто подумали и запретили повторный вызов события.

никакой фигни и никакого зацикливания.
Да неужели всё так просто?
...
Рейтинг: 0 / 0
26.12.2012, 15:44
    #38093641
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Charles WeylandДа неужели всё так просто?
да. пользователь ввёл в поле textBox1 некий текст, а какой-то чудак ему насильно пытается приписать суффикс abc, причём на любое изменение поля
...
Рейтинг: 0 / 0
26.12.2012, 15:45
    #38093642
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        private void Form1_Load(object sender, EventArgs e)
        {
            String[] list = new String[] { "1", "2", "3", "4", "5", "6" };
            listBox1.DataSource = list;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Console.WriteLine("{0}, listBox1_SelectedIndexChanged", DateTime.Now);
            textBox1.Text = (string)listBox1.SelectedItem;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            Console.WriteLine("{0}, textBox1.TextChange", DateTime.Now);
            if (((String[])listBox1.DataSource).Contains<string>(textBox1.Text))
                listBox1.SelectedItem = textBox1.Text;
        }



вот я решил проверить написанное вами, сделал только малость по другому.
при вводе в текст боксе числа он выбирается в списке, при выборе в списке меняется в textbox и при этом ни каких 2 событий не возникает. Даже не знаю, с чем это связано.
...
Рейтинг: 0 / 0
26.12.2012, 15:52
    #38093667
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Roman Mejtes,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox2.TextChanged -= textBox2_TextChanged;
            textBox3.Text = textBox2.Text + "a";
            textBox2.TextChanged += textBox2_TextChanged;
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            textBox3.TextChanged -= textBox3_TextChanged;
            textBox4.Text = textBox3.Text + "b";
            textBox3.TextChanged += textBox3_TextChanged;
        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            textBox4.TextChanged -= textBox4_TextChanged;
            textBox2.Text = textBox4.Text + "c";
            textBox4.TextChanged += textBox4_TextChanged;
        }

вот так в вашем 2 варианте всё работает, но зачем это надо я не представляю даже, получает хрень какая то )
если убрать + "а", +"b" и +"c" то обработчики событий можно не удалять на время, всё само как то замечательно работает :)
...
Рейтинг: 0 / 0
26.12.2012, 16:00
    #38093682
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
еще вариант отключать элемент управления
в состоянии Enable = false, объект не обрабатывает события
еще вариант получить доступ к закрытому полю объекта через Reflection
...
Рейтинг: 0 / 0
26.12.2012, 16:06
    #38093703
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Roman MejtesRoman Mejtes,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox2.TextChanged -= textBox2_TextChanged;
            textBox3.Text = textBox2.Text + "a";
            textBox2.TextChanged += textBox2_TextChanged;
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            textBox3.TextChanged -= textBox3_TextChanged;
            textBox4.Text = textBox3.Text + "b";
            textBox3.TextChanged += textBox3_TextChanged;
        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            textBox4.TextChanged -= textBox4_TextChanged;
            textBox2.Text = textBox4.Text + "c";
            textBox4.TextChanged += textBox4_TextChanged;
        }


вот так в вашем 2 варианте всё работает, но зачем это надо я не представляю даже, получает хрень какая то )
если убрать + "а", +"b" и +"c" то обработчики событий можно не удалять на время, всё само как то замечательно работает :)
Это был тест сказанного
Изопропилза вас просто подумали и запретили повторный вызов события.
никакой фигни и никакого зацикливания.
Дело в том, что в моём листе и текстбоксе нет точного соответствия, а некоторое "примерное" (там алгоритмы уже смотрят, что к чему относятся). Поэтому решение от Romanа Mejtes хоть и дало мне кое-что новенькое, но не очень подходит:

Roman Mejtes
Код: c#
1.
2.
            if (((String[])listBox1.DataSource).Contains<string>(textBox1.Text))
                listBox1.SelectedItem = textBox1.Text;


Но вариант - проглядывать через "посредника" -мне нравится
...
Рейтинг: 0 / 0
26.12.2012, 18:44
    #38093983
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
Charles WeylandpationCharles Weyland,

используй биндинг
в смысле?..
так
...
Рейтинг: 0 / 0
26.12.2012, 19:33
    #38094042
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C#. Как блокировать события, чтобы они не выполнялись при работе с контролами?
sldили отключать обработчик события навремя, или ввести булевскую переменную для проверки
+1
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C#. Как блокировать события, чтобы они не выполнялись при работе с контролами? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]