быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
1 | |||||||||||
Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged?08.02.2013, 20:52. Показов 22753. Ответов 21
Метки нет (Все метки)
Всё предельно просто. Скропаем таблицу dataGridView1 из двух столбцов. Первый стоблбец пусть будет обыкновеный (DataGridViewTextBoxColumn), а второй пусть содержит чекбоксы, то есть типа DataGridViewCheckBoxColumn
Потом скропаем программно например 5 строк, вот так:
1) ставим галку в строке (например) 2-ноль эмоций(почему я и назвал тему- ни фига не реагирует обработчик событий!) 2) ставим галку в строке 0- закрашивается строка 2 3) ставим галку в строке 3- закрашивается строка 0 Ну и так далее. Чё за пятнашки в самом деле? Я хочу чтобы у меня окрашивалась та строка, напротив которой я ставлю галку, а не предыдущая! Спасибо, кто откликнется.
0
|
08.02.2013, 20:52 | |
Ответы с готовыми решениями:
21
Почему когда я вешаю обработчик события на ячейку и этот обработчик срабатывает, то оказывается, он сработал совершенно для ДРУГОЙ ячейки? Событие CellValueChanged в DataGridView не вызывается программно Обработчик события выделения ячейки в DataGridView Обработчик события выделения ячейки в DataGridView - нужен контроль |
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
|
|
08.02.2013, 21:05 | 2 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
08.02.2013, 21:36 [ТС] | 3 |
Я забыл добавить- msdn читал, но не понял, почему событие , должное возникнуть тогда, когда значение ячейки меняется, откладывается на потом. А если бы понял, не спрашивал бы.
0
|
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
|
|
08.02.2013, 21:47 | 4 |
оно должно возникнуть когда значение ячекий изменилось.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||||||||||||
09.02.2013, 04:07 [ТС] | 5 | ||||||||||||||||||||||||||||||
Ну это понятно. Я поставил галку- там уж всё должно зафиксироваться на 100 рядов! Обработчик-то почему не срабатывает? И как заставит его срабатывать?
Добавлено через 2 часа 54 минуты Короче я закалебался разбиратся с редактированием этого столбика, но подвижки кое какие есть, поехали. Во-первых, если мы хотим, чтобы всё было круто, необходимо использовать событие CurrentCellDirtyStateChanged, но не CellValueChanged и если кто-то считает, что этим дело исчерпывается, он ошибается. Всё самое интересное впереди. Пишем (ну это как водится, набросаем пять строк):
Кликните здесь для просмотра всего текста
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.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Diagnostics; //using System.Windows.Forms.DataGridBoolColumn; namespace WindowsFormsApplication32 { public partial class Form1 : Form { public Form1() { InitializeComponent(); for (int i = 0; i < 5; i++) dataGridView2.Rows.Add(); } private void dataGridView2_CurrentCellDirtyStateChanged(object sender, EventArgs e) { Point po = ((DataGridView)sender).CurrentCellAddress; if ((bool)(dataGridView2.Rows[po.Y].Cells[1].Value) == true) dataGridView2.Rows[po.Y].Cells[0].Style.BackColor = System.Drawing.Color.Violet; else dataGridView2.Rows[po.Y].Cells[0].Style.BackColor = System.Drawing.Color.White; dataGridView2.CommitEdit(DataGridViewDataErrorContexts.Commit); } private void dataGridView2_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { dataGridView2.Rows[e.RowIndex].Cells[1].Value = false; dataGridView2.Rows[e.RowIndex + 1].Cells[1].ReadOnly = true; } private void dataGridView2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { Point po = ((DataGridView)sender).CurrentCellAddress; if (((DataGridView)sender).Rows[po.Y].Cells[po.X].Value == null) dataGridView2.Rows.Add(); } } } Добавлено через 22 минуты А, я забыл ещё сказать, по клику на квадратик, событие CurrentCellDirtyStateChanged произойдёт дважды и, честное слово, мне неохота разбираться, почему.
1
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
09.02.2013, 04:22 | 6 |
kravam, вы опять за старое, чтож вы так MSDN читать то не любите, естественно, в "Remarks".
Если хочется обработать именно тот момент, когда юзер кликнул мышью, то нужно это делать в обработчике к событию DataGridView.CellClick, но это событие происходит до изменения ячейки, поэтому при использовании данного события необходимо вычислить ожидаемое значение, основываясь на текущем. Другой подход для отлавливания изменений в этой ячейки заключается в немедленном применении изменений, которые будут обрабатываться в обработчике к событию DataGridView.CellValueChanged. Для того, чтобы немедленно применить изменение ячейки, нужно создать обработчик события DataGridView.CurrentCellDirtyStateChanged и в этом обработчике, если ячейка является чекбоксом, вызывать метод DataGridView.CommitEdit. Как видите, в MSDN есть все, даже пример на 80% совпадающий с вашим случаем. Отличие только в том, что в данном примере енаблядся и дизаблядся кнопки, а у вас фон ячейки меняется.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
09.02.2013, 06:36 [ТС] | 7 |
Так я там и прочёл (ну или тут по другой какой ссыли), я же не с неба взял, что надо обрабатывать именно событие событие CurrentCellDirtyStateChanged и про вызов CommitEdit с параметром Commit
Только видите какая штука, там ни слова не сказано, что ; это уж своим умом доходить надо. Кроме того там абсолютно ничего нет про куда писать CommitEdit и чё даёт. Я крутил его и так и сяк (кстати). Дошёл сам и отписался. А вы мне ещё и тычете этим. Наконец ещё два пункта- как сделать чтобы не вылетало исключение при тыканьи в последний квадратик и как вручную добавлять строки- там тоже слова нет про это. Хотя это и не очень относится к теме. Ну и наконец Может быть самый главный вопрос. Почему? Тоже может, скажете, написано?
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
09.02.2013, 07:47 | 8 |
Я же знаю, что вы с английским не дружите, поэтому и перевел, что там написано. Если идти вторым путем, то обрабатывается не событие CurrentCellDirtyStateChanged, а событие CellValueCnaged, а в обработчике события CurrentCellDirtyStateChanged присутствует всего одна строка, которая инициирует возникновение события CellValueChanged. Вы же всю логику в событие CurrentCellDirtyStateChanged зафигачили. Более того, вызов метода CommitEdit вы обосновали не желанием закоммитить новое значение в ячейку датагрида, а желанием перерисовать этот грид. Как правильно перерисовывается грид, есть в примере, ссылка на который присутствует в моем предыдущем посте.
Если правильно создать обработчики, как написано в MSDN, и как приведено в примере, то данные вопросы не возникнут. Ибо в событие CellValueChanged значение ячейки уже изменено, и содержит корректное значение. Нет, этого в MSDN нет, ибо данное поведение запрограммировано вами самим. Вы просто не понимаете, когда возникает событие CurrentCellDirtyStateChanged и как с ним работать. Перед тем, как с ним работать, нужно было сначала про него прочитать. Данное событие возникает не при изменении значения ячейки датагрида, которое еще не закомиченно в датагрид, а возникает оно, когда меняется состояние "измененности" у выбранной ячейки. То есть, когда начинается редактирование текущей ячейки, данное событие возникает один раз (состояние "измененности" принимает значение "Изменено"), а потом не возникает до тех пор, пока новое значение либо не будет принято для текущей ячейки, либо не будет отменено (состояние "измененности" принимает значение "не изменено"). А теперь, собственно, к тому, почему оно вызывается 2 раза: при клике на квадратике, состояние "измененности" ячейки становится "изенено", и вызывается событие CurrentCellDirtyStateChanged, в конце обработчика которого стоит вызов метода CommitEdt, который, в свою очередь, записывает новое значение в ячейку и меняет состояние "измененности" ячейки на "не изменено", тем самым инициируя вызов обработчика события CurrentCellDirtyStateChanged еще раз. Код обработчика проходит по второму кругу, в том числе вызывает метод CommitEdit, который смотрит, что ячейка находится в состоянии "не изменено" и уже ни чего не делает. Поэтому в вашем случае даннный обработчик вызывает ровно два раза при каждом тычке по квадратику.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
09.02.2013, 16:06 [ТС] | 9 |
напишите. Я могу, конечно, попробовать угадать, но я один раз уже угадал, плохим оказался. Так что напишите и обсудим. Правильность, доступность, очевидность...
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||||||||||
09.02.2013, 16:54 | 10 | ||||||||||
А еще говорите что по ссылкам ходите, и смотрите, что там. еще раз, здесь есть пример. Раз уж вам лень пройти по ссылке, посмотреть пример, и разобраться в нем, то выложу его сюда.
Адаптировать пример под свои задачи проще простого:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
09.02.2013, 19:40 [ТС] | 11 | |||||
kodv, да видел я это. Только вы не то даёте. Я-то думал вы мне покажете:
А теперь про CommitEdit Про dataGridView1.IsCurrentCellDirty я вообще молчу.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
10.02.2013, 18:30 | 12 |
Зачем догадываться, если все и так написано. Но из-за вашего нежелания прочитать пару предложений, уже в очередной раз получается срач в теме, когда вы уверяете, что там, куда вас носом тыкают, ни чего не написано.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
10.02.2013, 19:04 [ТС] | 13 |
Ваш перевод:
++++++++++++++++++++++++++++++++++++++++++++++++ так-то всё ничё, но второй раз получается ситуация: я худо бедно, с матом-перматом, через пень колоду дохожу до всего сам, тут нарисовываетесь вы и тычете мне пальчиком... Второй раз: дорога ложка к обеду. Ценность ваших советов под большим-большим вопросом, а уж когда я сам до всего дошёл под вопросом тем более. Не нарисовались бы вы невовремя и не было бы никакого срача, а всё закончилось бы моими выводами Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged? А теперь извольте отвечать, раз уж взялись.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
11.02.2013, 02:52 | 14 |
Да. А разве нет? Что не ясно написано. Обработка в CellValueChanged, чтобы это событие возникло, вызывается CommitEdit в CurrentCellDirtyStateChanged. По ходу, вы не только на английском нормально прочиттаь не можете, но и на русском.
Дойти то дошли, но не туда. Как итог, у вас возникло еще больше вопросов. А я вам просто указал, во-первых, ссылку, где описано 2 правильных варианта обработки тычков по галочки в колонке DataGridView, во-вторых, для вас это перевел, в-третьих, дал ссылку на пример из MSDN, где вы могли поменять минимум кода и заставить работать код так, как вам нужно. Вместо того, чтобы просто прочитать текст по ссылкам, сделать для себя правильные выводы и довести свой код до рабочего состояния., вы почему то начинаете возмущаться, что по приведенным ссылкам написано все не то и все не так. А потом начинаете возмущаться, как вы должны были понять то, что нужно обрабатывать нажатие в событие CellValueChanged, а в событии CurrentCellDirtyStateChanged вызвать метод CommitEdit, чтобы возникло событие CellValueChanged, если в MSDN всего лишь написано, что необходимо применять изменения, возникающие при изменении ячейки, сразу и обрабатывать нажатие в событии CellValueChanged, а чтобы немедленно применить изменения нужно в обработчике события CurrentCellDirtyStateChanged вызывать метод CommitEdit.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
11.02.2013, 03:18 [ТС] | 15 |
если бы это был корявый РУССКИЙ текст, тогда бы я может и понял. А, поскольку оригинал английский- машешь рукой на перевод- свой ли, машинный ли ибо- чёрт его знает, что на самом деле имелось ввиду... и "Мы пойдём другим путём!"
как итог вашего вмешательства, вы хотели сказать. После этого сообщения Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged? можно было ставить точку.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
11.02.2013, 07:55 | 16 |
kravam, ваши умозаключения - это самопоиск ответов, на свои же вопросы, которые не возникли бы, если бы вы, перед тем, как впихивать в свой проект колонку типа DataGridViewCheckBoxColumn, прочли про то, как ее использовать. Я лишь только указал, что все можно было сделать не через жопу, гораздо быстрее и с меньшей потерей нервов. Видимо, это задело ваши чувства ...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
11.02.2013, 18:19 [ТС] | 17 | |||||
Я вам ещё раз говорю- всё равно пришлось бы переспрашивать, с таким-то переводом.
Добавлено через 8 минут ... Добавлено через 3 часа 44 минуты А теперь по сути: вот коды, мой и ваш, мой плохой охренительно закрашивает ячейки по клику, а ваш хороший (закомменчен)- нет
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
11.02.2013, 18:40 | 18 |
kravam, может вы уже успокоитесь? Перед тем, как код запостить, я его проверил, и он работал прекрасно, на любой строке, как на первой, так и на последней, без всяких нюансов. То, что вы где то накосячили - это не удивительно. Навскидку у вас не работает потому, что вы недогодались обработчик datagridview1_cellvaluechanged привязать к событию CellValueChanged у DataGridView1. Ибо в противном случае ваш код бы не компилировался, ругаясь на отсутствии метода datagridview1_cellvaluechanged, который как бы прицеплен к событию, но закомментирован, то есть отсутствует. Глубже разбираться не охота. У вас есть свой код, который работает без ваших же нареканий, кроме того, что что то вызывается по 2 раза, а что то вам пришлось делать ReadOnly, чтобы нечаянно не нажалось во время выполнения. Используйте его.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
11.02.2013, 19:25 [ТС] | 19 |
естессно, как же не накосячить-то? Я же всегда косячу.
Что значит охота- не охота? Взялся за гуж, так и не говори, что не дюж. Не хотите разбираться в моём- дайте свой рабочий код. А то получается: "У меня есть код, он рабочий, но я его не покажу".
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
12.02.2013, 03:05 | 20 |
kravam, Код рабочий. В чем ваша ошибка, я написал - исправляейте. Если вы не можете нормально привязать 2 обработчика событий к 2-м событиям, то в чем моя вина? Удивляет лишь только ваша высокая репутация, ибо не ясно, от куда она, если вы базовых вещей сделать не в состоянии.
0
|
12.02.2013, 03:05 | |
12.02.2013, 03:05 | |
Помогаю со студенческими работами здесь
20
Обработчик события нажатия кнопки мыши для dataGridView Почему может не работать обработчик события? Почему обработчик события формы 2 отрабатывает и на первой? Не изменяется значение в DataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |