Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
.NET 4.x

Отслеживание изменения DataGridViewComboBoxCell

21.06.2013, 12:32. Показов 4797. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добый день. Начал изучать С# и столкнулся с одной проблеймой.
Есть таблица DataViewGrid, в которую дабавляю данные из БД. В этой таблице мне нужно изменять данные. Для удобства я добавил 3 списка.
Вот код добавления:
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
DataGridViewComboBoxCell cmb = new DataGridViewComboBoxCell();
DataGridViewComboBoxCell cmb1 = new DataGridViewComboBoxCell();
DataGridViewComboBoxCell cmb2 = new DataGridViewComboBoxCell();
 
                cmb.MaxDropDownItems = 5;
                cmb.Items.Add("Машинист");
                cmb.Items.Add("Помощник");
                cmb.Items.Add("Дублер");
                cmb.Items.Add("Машинист - инструктор");
                cmb.Items.Add("Водитель");
                dataGridView1.Rows[6].Cells[0] = cmb;
                cmb.Value = (string)dataReader["post"];
 
               
                cmb2.MaxDropDownItems = 2;
                cmb2.Items.Add("М");
                cmb2.Items.Add("Ж");
                dataGridView1.Rows[10].Cells[0] = cmb2;
                cmb2.Value = (string)dataReader["gender"];
 
               
                if (cmb.Value.ToString() == "Машинист")
                {
                    cmb1.MaxDropDownItems = 3;
                    cmb1.Items.Add("1 кл");
                    cmb1.Items.Add("2 кл");
                    cmb1.Items.Add("3 кл");
                    dataGridView1.Rows[7].Cells[0] = cmb1;
                    cmb1.Value = (string)dataReader["class"];
                }
                else
                {
                    cmb1.MaxDropDownItems = 1;
                    dataGridView1.Rows[7].Cells[0] = cmb1;
                }
Мне нужно отследить изменения в списке "cmb". Т.е. Если там выбрано "Машинист", то в списке "cmb1" нужно добавить список классов, если выбрано что-либо другое, то список очищаю.
Я думал, что в DataGridViewComboBoxCell есть события, а их увы нет... Сделал по событию "CellParsing".
Вот код события:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
        {
            if (e.RowIndex == 6)
            {
                //MessageBox.Show(cmb.Selected.ToString());
                if (cmb.Value.ToString() == "Машинист")
                {
                    if (cmb1.MaxDropDownItems == 1)
                    {
                        cmb1.MaxDropDownItems = 3;
                        cmb1.Items.Add("1 кл");
                        cmb1.Items.Add("2 кл");
                        cmb1.Items.Add("3 кл");
                    }
                }
                else
                {
                    cmb1.MaxDropDownItems = 1;
                    cmb1.Value = null;
                    cmb1.Items.Clear();
                }
            }
        }
Но проблема в том, что при первом выборе элемента списка значение не заносится в cmb.Value. Нужно выбрать еще раз и тогда прошлой выбранное внесется в Value. Так же после выбора элемента нужно кликнуть на любой ячейке таблицы, что бы вызвать событие CellParsing.

Подскажите как правильно сделать отслеживание изменения значений в списке, что бы не счелкать на любой ячейке и не выбирать два раза значение... То что смог придумать это сделать свой класс DataGridViewComboBoxCell с добавлением события изменения значения ячейки, но для этого моих знаний пока не хватает...

Буду очнь благодарен за помощь

Добавлено через 1 час 56 минут
Вроде получилось, наверно, не совсем правильно... Но увы, пока так. Если можно по другому посоветуйте как.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
 
        //определение ячейки, на которую нажали. И в зависимости от выбранной ячейки выводятся разные списки
        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            SetComboBoxCellType objChangeCellType = new SetComboBoxCellType(ChangeCellToComboBox);
            if (e.RowIndex == 6)
            {
                this.dataGridView1.BeginInvoke(objChangeCellType, e.RowIndex);
                bIsComboBox = false;
            }
            if (e.RowIndex == 7)
            {
                this.dataGridView1.BeginInvoke(objChangeCellType, e.RowIndex);
                bIsComboBox = false;
            }
            if (e.RowIndex == 10)
            {
                this.dataGridView1.BeginInvoke(objChangeCellType, e.RowIndex);
                bIsComboBox = false;
            }
        }
 
        //создание и вывод списков в зависимости от нажатой ячейки
        private void ChangeCellToComboBox(int iRowIndex)
        {
            if (iRowIndex == 6)
            {
                if (bIsComboBox == false)
                {
                    DataGridViewComboBoxCell dgComboCell = new DataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("work", typeof(string));
 
                    //for (int i = 0; i < 5; i++)
                    //{
                    //DataRow dr = dt.NewRow();
                    //dr["Name"] = "Name - " + i.ToString();
 
                    dt.Rows.Add("Машинист");
                    dt.Rows.Add("Помощник");
                    dt.Rows.Add("Машинист - инструктор");
                    dt.Rows.Add("Водитель");
                    dt.Rows.Add("Дублер");
 
                    //}
                    //for (int i = 0; i < 5; i++)
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "work";
                    dgComboCell.DisplayMember = "work";
 
                    try
                    {
                        MessageBox.Show(dgComboCell.Value.ToString());
                    }
                    catch
                    { }
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
            if (iRowIndex == 7)
            {
                if (bIsComboBox == false)
                {
                    DataGridViewComboBoxCell dgComboCell = new DataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("class", typeof(string));
 
                    //for (int i = 0; i < 5; i++)
                    //{
                    //DataRow dr = dt.NewRow();
                    //dr["Name"] = "Name - " + i.ToString();
 
                    dt.Rows.Add("1 кл");
                    dt.Rows.Add("2 кл");
                    dt.Rows.Add("3 кл");
 
                    //}
                    //for (int i = 0; i < 5; i++)
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "class";
                    dgComboCell.DisplayMember = "class";
 
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
 
            if (iRowIndex == 10)
            {
                if (bIsComboBox == false)
                {
                    DataGridViewComboBoxCell dgComboCell = new DataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("gender", typeof(string));
 
                    //for (int i = 0; i < 5; i++)
                    //{
                    //DataRow dr = dt.NewRow();
                    //dr["Name"] = "Name - " + i.ToString();
 
                    dt.Rows.Add("М");
                    dt.Rows.Add("Ж");
 
                    //}
                    //for (int i = 0; i < 5; i++)
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "gender";
                    dgComboCell.DisplayMember = "gender";
 
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
        }
//после завершения изменения обрабатываю событие и смотрю что было выбрано. Если выбрано "Машинист", то разрешаю изменение ячейки со списком класс, в противном случае запрещаю изменение ячейки.
 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == 6)
            {
                if (dataGridView1[0, 6].Value != null)
                {
                    if (dataGridView1[0, 6].Value.ToString() != "Машинист")
                    {
                        dataGridView1.Rows[7].Cells[0].ReadOnly = true;
                    }
                    else
                    {
                        dataGridView1.Rows[7].Cells[0].ReadOnly = false;
                    }
                }
            }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2013, 12:32
Ответы с готовыми решениями:

Отслеживание изменения переменной
Здравствуйте! Вопрос немного ламерский. Есть trackBar. Есть значение переменной, допустим, а. Нужно при изменении a (меняется...

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

Отслеживание изменения значения переменной
Привет! Возникла такая задача - есть адрес переменной в памяти какого-то процесса. Мне нужно отслеживать это значение и при его изменении...

14
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 12:33
Как вариант,далеко не самый лучший и не полностью готовый,только по-сабжу..

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
public delegate void valchng(object sender,EventArgs e);
    public class MyDataGridViewComboBoxCell : DataGridViewComboBoxCell
    {
        public event valchng ValueChanged;
        
        protected override bool SetValue(int rowIndex, object value)
        {
 
            if (ValueChanged != null)
            {
 
                ValueChanged(this, new EventArgs());                
 
                return base.SetValue(rowIndex,value);
 
            } return false;
 
        }
 
        protected override object GetValue(int rowIndex)
        {
            return base.GetValue(rowIndex);
        }
    
       
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 MyDataGridViewComboBoxCell cell = new MyDataGridViewComboBoxCell();
 
      
        private void Form1_Load(object sender, EventArgs e)
        {
            cell.Items.Add("assa");
            cell.Items.Add("ooo");
            cell.Value = "";
            cell.ValueChanged += (sn, ea) => { MessageBox.Show("Value changed!"); };
            dataGridView1.Columns.Add("ds", "sdsds");
            dataGridView1.Rows.Add(1);
            dataGridView1.Rows[0].Cells[0]=cell;
}
1
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 13:00  [ТС]
Добрый день sniper_lunev.
Попробую разобраться в коде, который Вы дали.

Мы создаем делегат. Создаем класс DataGridViewComboBoxCell, который наследуется от DataGridViewComboBoxCell. Создаем событие и переназначаем SetValue и GetValue; Т.к. выбрали элемент и изменили содержимое ячейки мы вызываем событие ValueChanged.
Далее я создаю обработчик этого события
C#
1
2
3
4
5
6
7
cell.ValueChanged+=new System.EventHandler(this.valueChanged);
 
//обработчик
private void valueChanged(object sender, EventArgs e)
        {
             
        }
правильно?
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 13:05
Цитата Сообщение от Stelsing Посмотреть сообщение
правильно?
да,все верно.
1
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 13:15  [ТС]
Хорошо, а чем такой вариант плох?
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 13:23
Кстати,вот еще
C#
1
2
3
4
5
6
7
8
 if (ValueChanged != null)
            {
 
                ValueChanged(this, new EventArgs());                
 
                return base.SetValue(rowIndex,value);
 
            } return false;//Заменить на return base.SetValue(rowIndex,value);
Я не знаю,зачем я в возврат пихнул false,получается,если обьект не подписан на событие,то и меняться ничего не будет..Мой косяк)
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 13:30  [ТС]
вот теперь я немного не понял
Если изменения были (ValueChanged != null) то мы вызываем событие, возвращаем номер строки и значение, на что изменилось.
Если изменений не было (ValueChanged == null) то мы не вызываем событие. Зачем возвращать return base.SetValue(rowIndex,value); ?

Если вопросы глупые, извиняюсь, я только учусь...
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 13:38
C#
1
(ValueChanged != null)
говорит,есть ли подписчики у события.
Если вызывается метод SetValue,то изменения уже есть.

т.е. мы вызываем событие только тогда,когда есть подписчики на это событие и,независимо от этого,изменяем значение..
1
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 14:35  [ТС]
Понял. Если мы создали обработчик события, то вызываем событие и передаем ему параметры (ValueChanged(this, new EventArgs()); ) и возвращаем значения номер строки и значение. В противном случае все тоже, но без вызова события.
Попробую это использовать.

Добавлено через 53 минуты
Попробовал я Ваш вариант. Работает не совсем так как хотелось бы
C#
1
2
3
4
5
6
7
8
9
MyDataGridViewComboBoxCell dgComboCell = new MyDataGridViewComboBoxCell();
 
dgComboCell.ValueChanged += dgComboCell_ValueChanged;
 
void dgComboCell_ValueChanged(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            MessageBox.Show("ok");
        }
Событие выполняется когда нажимаю на списке (еще ничео не выбрав). А когда выбираю значение из списка событие выполняется только, когда счелкаю на любом другом поле таблицы...
Сейчас попробую еще, может получится переделать немного.
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 14:44
А когда выбираю значение из списка событие выполняется только, когда счелкаю на любом другом поле таблицы...
Сейчас попробую еще, может получится переделать немного.
Так и должно быть,в принципе,т.к. значения применяются после...
когда счелкаю на любом другом поле таблицы...
Событие выполняется когда нажимаю на списке (еще ничео не выбрав).
В смысле?
0
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 14:53  [ТС]
После открытия окна и создания таблицы я счелкаю на поле, где список. После этого срабатывает событие. После я нажимаю еще раз для раскрытия списка, выбираю нужный параметр. Затем счелкаю на любом другом поле таблицы и у меня срабатывает событие. Я в нем вывожу значение
C#
1
MessageBox.Show(dataGridView1.Rows[6].Cells[0].Value.ToString());
Но строка не меняется. Если, к примеру, было выбрано Машинист, я переключаю на Водитель, то в событие высвечивается Машинист. Получается как предыдущее значение сохраняется в ячейке...
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 15:06
Потому что,сначала вызывается событие,а потом применяются значения.Тогда уж вот так:

C#
1
2
3
4
5
6
7
8
 if (ValueChanged != null)
            {
                base.SetValue(rowIndex, value);
                ValueChanged(this, new EventArgs());
                return true;
 
 
            } return base.SetValue(rowIndex, value);
После открытия окна и создания таблицы я счелкаю на поле, где список. После этого срабатывает событие.
А этого по-идее не должно быть,да и у меня такого нету..
1
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 15:47  [ТС]
Кстати да, в начале отрисовать, а потом событие вызвать... Не додумался...
Вот что мне передается в событие Sender -ом при нажатии на список, без выбора и без его раскрытия.
C#
1
{DataGridViewComboBoxCell { ColumnIndex=-1, RowIndex=-1 }}
0
 Аватар для mrReptiloid
313 / 176 / 25
Регистрация: 30.04.2011
Сообщений: 1,469
21.06.2013, 15:58
Говорю же,у меня нету такого,видимо Вы где-то что-то напутали.

Можно тогда еще добавить проверку
C#
1
2
3
4
5
6
7
8
if (ValueChanged != null && rowIndex > -1)
            {
         base.SetValue(rowIndex, value);
                ValueChanged(this, new EventArgs());
                return true;
 
 
            } return base.SetValue(rowIndex, value);
1
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128
21.06.2013, 21:36  [ТС]
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

2 sniper_lunev
Вроде получилось.
Вот код результата:
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
public delegate void valchng(object sender, EventArgs e);
    public class MyDataGridViewComboBoxCell : DataGridViewComboBoxCell
    {
        public event valchng ValueChanged;
 
        protected override bool SetValue(int rowIndex, object value)
        {
 
            if (ValueChanged != null && rowIndex!=-1)
            {
 
                base.SetValue(rowIndex, value);
                ValueChanged(this, new EventArgs());
                return true;
 
            } return base.SetValue(rowIndex, value);
 
        }
 
        protected override object GetValue(int rowIndex)
        {
            return base.GetValue(rowIndex);
        }
    }
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            SetComboBoxCellType objChangeCellType = new SetComboBoxCellType(ChangeCellToComboBox);
            if ((e.RowIndex == 6)||(e.RowIndex == 7)||(e.RowIndex == 10))
            {
                this.dataGridView1.BeginInvoke(objChangeCellType, e.RowIndex);
                bIsComboBox = false;
            }
        }
 
        private void ChangeCellToComboBox(int iRowIndex)
        {
            if (iRowIndex == 6)
            {
                if (bIsComboBox == false)
                {
                    MyDataGridViewComboBoxCell dgComboCell = new MyDataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    //dgComboCell.ValueChanged += new System.EventHandler(this.ValueChanged);
                    //dgComboCell.ValueChanged += new 
                    dgComboCell.ValueChanged += dgComboCell_ValueChanged;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("work", typeof(string));
 
                    dt.Rows.Add("Машинист");
                    dt.Rows.Add("Помощник");
                    dt.Rows.Add("Машинист - инструктор");
                    dt.Rows.Add("Водитель");
                    dt.Rows.Add("Дублер");
 
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "work";
                    dgComboCell.DisplayMember = "work";
                    dgComboCell.Value = dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex].Value;
 
                    try
                    {
                        //MessageBox.Show(dgComboCell.Value.ToString());
                    }
                    catch
                    { }
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
            if (iRowIndex == 7)
            {
                if (bIsComboBox == false)
                {
                    MyDataGridViewComboBoxCell dgComboCell = new MyDataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("class", typeof(string));
 
                    dt.Rows.Add("1 кл");
                    dt.Rows.Add("2 кл");
                    dt.Rows.Add("3 кл");
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "class";
                    dgComboCell.DisplayMember = "class";
                    if (dataGridView1.Rows[6].Cells[0].Value.ToString() == "Машинист")
                    {
                        dgComboCell.Value = dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex].Value;
                    }
                    else
                    {
                        dgComboCell.Value = "";
                    }
 
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
 
            if (iRowIndex == 10)
            {
                if (bIsComboBox == false)
                {
                    MyDataGridViewComboBoxCell dgComboCell = new MyDataGridViewComboBoxCell();
                    dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
 
                    DataTable dt = new DataTable();
                    dt.Columns.Add("gender", typeof(string));
 
                    dt.Rows.Add("М");
                    dt.Rows.Add("Ж");
 
 
                    dgComboCell.DataSource = dt;
                    dgComboCell.ValueMember = "gender";
                    dgComboCell.DisplayMember = "gender";
                    dgComboCell.Value = dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex].Value;
 
                    dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                    bIsComboBox = true;
                }
            }
        }
 
        //обработка изменения в списке
        void dgComboCell_ValueChanged(object sender, EventArgs e)
        {
               if (dataGridView1[0, 6].Value != null)
                {
                    if (dataGridView1[0, 6].Value.ToString() != "Машинист")
                    {
                        dataGridView1.Rows[7].Cells[0].ReadOnly = true;
                    }
                    else
                    {
                        dataGridView1.Rows[7].Cells[0].ReadOnly = false;
                        dataGridView1.Rows[7].Cells[0].Value = "";
                    }
                }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2013, 21:36
Помогаю со студенческими работами здесь

Отслеживание изменения значения переменной
Как мне сделать так, что бы при изменении переменной, выполнялась функция из другого класса и после этого выполнялась программа идущая...

Отслеживание программного изменения положения курсора
Добрый день. Как можно, да и можно ли вообще узнать, указатель переместился с помощью мыши, или его передвинул какой-то процесс? ...

Отслеживание изменения значения свойства класса
Доброго всем времени суток! Есть некий класс, которых хранит свойства в виде class SomeClass { public bool SomeProp1{ get; set; }...

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

Отслеживание изменения состояния службы
7. Служба отслеживает изменения состояния (приостановка, запуск, остановка) заданной службы и фиксирует их в текстовом файле. - у меня вот...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru