|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||
Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged?08.02.2013, 20:52. Показов 24809. Ответов 21
Метки нет (Все метки)
Всё предельно просто. Скропаем таблицу dataGridView1 из двух столбцов. Первый стоблбец пусть будет обыкновеный (DataGridViewTextBoxColumn), а второй пусть содержит чекбоксы, то есть типа DataGridViewCheckBoxColumn
Потом скропаем программно например 5 строк, вот так:
1) ставим галку в строке (например) 2-ноль эмоций(почему я и назвал тему- ни фига не реагирует обработчик событий!) 2) ставим галку в строке 0- закрашивается строка 2 3) ставим галку в строке 3- закрашивается строка 0 Ну и так далее. Чё за пятнашки в самом деле? Я хочу чтобы у меня окрашивалась та строка, напротив которой я ставлю галку, а не предыдущая! Спасибо, кто откликнется.
0
|
|||||||||||
| 08.02.2013, 20:52 | |
|
Ответы с готовыми решениями:
21
Почему когда я вешаю обработчик события на ячейку и этот обработчик срабатывает, то оказывается, он сработал совершенно для ДРУГОЙ ячейки? Событие CellValueChanged в DataGridView не вызывается программно Обработчик события выделения ячейки в DataGridView |
|
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
|
|
| 08.02.2013, 21:05 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 08.02.2013, 21:36 [ТС] | |
|
Я забыл добавить- msdn читал, но не понял, почему событие , должное возникнуть тогда, когда значение ячейки меняется, откладывается на потом. А если бы понял, не спрашивал бы.
0
|
|
|
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
|
|||
| 08.02.2013, 21:47 | |||
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||||||||||||||||||||||
| 09.02.2013, 04:07 [ТС] | |||||||||||||||||||||||||||||||
|
Ну это понятно. Я поставил галку- там уж всё должно зафиксироваться на 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_CurrentCellDirtyStateChang ed(object sender, EventArgs e) { Point po = ((DataGridView)sender).CurrentCellAddres s; 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(DataGridViewDat aErrorContexts.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(obje ct sender, DataGridViewEditingControlShowingEventAr gs e) { Point po = ((DataGridView)sender).CurrentCellAddres s; 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 | ||
|
kravam, вы опять за старое, чтож вы так MSDN читать то не любите, естественно, в "Remarks".
Если хочется обработать именно тот момент, когда юзер кликнул мышью, то нужно это делать в обработчике к событию DataGridView.CellClick, но это событие происходит до изменения ячейки, поэтому при использовании данного события необходимо вычислить ожидаемое значение, основываясь на текущем. Другой подход для отлавливания изменений в этой ячейки заключается в немедленном применении изменений, которые будут обрабатываться в обработчике к событию DataGridView.CellValueChanged. Для того, чтобы немедленно применить изменение ячейки, нужно создать обработчик события DataGridView.CurrentCellDirtyStateChange d и в этом обработчике, если ячейка является чекбоксом, вызывать метод DataGridView.CommitEdit. Как видите, в MSDN есть все, даже пример на 80% совпадающий с вашим случаем. Отличие только в том, что в данном примере енаблядся и дизаблядся кнопки, а у вас фон ячейки меняется.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 09.02.2013, 06:36 [ТС] | |||
Так я там и прочёл (ну или тут по другой какой ссыли), я же не с неба взял, что надо обрабатывать именно событие событие CurrentCellDirtyStateChanged и про вызов CommitEdit с параметром CommitТолько видите какая штука, там ни слова не сказано, что Наконец ещё два пункта- как сделать чтобы не вылетало исключение при тыканьи в последний квадратик и как вручную добавлять строки- там тоже слова нет про это. Хотя это и не очень относится к теме. Ну и наконец
0
|
|||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
||||||
| 09.02.2013, 07:47 | ||||||
|
А теперь, собственно, к тому, почему оно вызывается 2 раза: при клике на квадратике, состояние "измененности" ячейки становится "изенено", и вызывается событие CurrentCellDirtyStateChanged, в конце обработчика которого стоит вызов метода CommitEdt, который, в свою очередь, записывает новое значение в ячейку и меняет состояние "измененности" ячейки на "не изменено", тем самым инициируя вызов обработчика события CurrentCellDirtyStateChanged еще раз. Код обработчика проходит по второму кругу, в том числе вызывает метод CommitEdit, который смотрит, что ячейка находится в состоянии "не изменено" и уже ни чего не делает. Поэтому в вашем случае даннный обработчик вызывает ровно два раза при каждом тычке по квадратику.
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 09.02.2013, 16:06 [ТС] | ||
|
0
|
||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||||||||||
| 09.02.2013, 16:54 | |||||||||||
|
А еще говорите что по ссылкам ходите, и смотрите, что там. еще раз, здесь есть пример. Раз уж вам лень пройти по ссылке, посмотреть пример, и разобраться в нем, то выложу его сюда.
Адаптировать пример под свои задачи проще простого:
0
|
|||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||
| 09.02.2013, 19:40 [ТС] | |||||||||
|
kodv, да видел я это. Только вы не то даёте. Я-то думал вы мне покажете:
А теперь про CommitEdit
Про dataGridView1.IsCurrentCellDirty я вообще молчу.
0
|
|||||||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||
| 10.02.2013, 18:30 | |||
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||
| 10.02.2013, 19:04 [ТС] | ||||
|
Ваш перевод:
++++++++++++++++++++++++++++++++++++++++ ++++++++ Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged? А теперь извольте отвечать, раз уж взялись.
0
|
||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||
| 11.02.2013, 02:52 | |||
|
Вместо того, чтобы просто прочитать текст по ссылкам, сделать для себя правильные выводы и довести свой код до рабочего состояния., вы почему то начинаете возмущаться, что по приведенным ссылкам написано все не то и все не так. А потом начинаете возмущаться, как вы должны были понять то, что нужно обрабатывать нажатие в событие CellValueChanged, а в событии CurrentCellDirtyStateChanged вызвать метод CommitEdit, чтобы возникло событие CellValueChanged, если в MSDN всего лишь написано, что необходимо применять изменения, возникающие при изменении ячейки, сразу и обрабатывать нажатие в событии CellValueChanged, а чтобы немедленно применить изменения нужно в обработчике события CurrentCellDirtyStateChanged вызывать метод CommitEdit.
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 11.02.2013, 03:18 [ТС] | |||
|
Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged? можно было ставить точку.
0
|
|||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 11.02.2013, 07:55 | |
|
kravam, ваши умозаключения - это самопоиск ответов, на свои же вопросы, которые не возникли бы, если бы вы, перед тем, как впихивать в свой проект колонку типа DataGridViewCheckBoxColumn, прочли про то, как ее использовать. Я лишь только указал, что все можно было сделать не через жопу, гораздо быстрее и с меньшей потерей нервов. Видимо, это задело ваши чувства ...
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 11.02.2013, 18:19 [ТС] | |||||||
|
Я вам ещё раз говорю- всё равно пришлось бы переспрашивать, с таким-то переводом.
Добавлено через 8 минут ... А теперь по сути: вот коды, мой и ваш, мой плохой охренительно закрашивает ячейки по клику, а ваш хороший (закомменчен)- нет
0
|
|||||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 11.02.2013, 18:40 | |
|
kravam, может вы уже успокоитесь? Перед тем, как код запостить, я его проверил, и он работал прекрасно, на любой строке, как на первой, так и на последней, без всяких нюансов. То, что вы где то накосячили - это не удивительно. Навскидку у вас не работает потому, что вы недогодались обработчик datagridview1_cellvaluechanged привязать к событию CellValueChanged у DataGridView1. Ибо в противном случае ваш код бы не компилировался, ругаясь на отсутствии метода datagridview1_cellvaluechanged, который как бы прицеплен к событию, но закомментирован, то есть отсутствует. Глубже разбираться не охота. У вас есть свой код, который работает без ваших же нареканий, кроме того, что что то вызывается по 2 раза, а что то вам пришлось делать ReadOnly, чтобы нечаянно не нажалось во время выполнения. Используйте его.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 11.02.2013, 19:25 [ТС] | |||
|
0
|
|||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 12.02.2013, 03:05 | |
|
kravam, Код рабочий. В чем ваша ошибка, я написал - исправляейте. Если вы не можете нормально привязать 2 обработчика событий к 2-м событиям, то в чем моя вина? Удивляет лишь только ваша высокая репутация, ибо не ясно, от куда она, если вы базовых вещей сделать не в состоянии.
0
|
|
| 12.02.2013, 03:05 | |
|
Помогаю со студенческими работами здесь
20
Обработчик события выделения ячейки в DataGridView - нужен контроль Обработчик события нажатия кнопки мыши для dataGridView
Не изменяется значение в DataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|