Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/125: Рейтинг темы: голосов - 125, средняя оценка - 4.97
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged?

08.02.2013, 20:52. Показов 22753. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всё предельно просто. Скропаем таблицу dataGridView1 из двух столбцов. Первый стоблбец пусть будет обыкновеный (DataGridViewTextBoxColumn), а второй пусть содержит чекбоксы, то есть типа DataGridViewCheckBoxColumn

Потом скропаем программно например 5 строк, вот так:

C#
1
2
3
4
5
6
        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < 5; i++)
                dataGridView2.Rows.Add();
        }
И напишем такой обработчик сообщения, коорый вызовется, если изменится значение какой-либо ячейки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            //Работаем, только с первым (ненулевым в смысле) столбцом. То есть обработчик срабатывает, если
        //снимаем или ставим галку в какой-либо строке  
            if (e.ColumnIndex == 1)
            {
                //И если мы в какой-либо ячейке первого столбца поставим галку
                if ((bool)(((DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1]).Value) == true)
                {
                        //То текущая строка окрастся в фиолетовый цвет
            dataGridView1.Rows[e.RowIndex].Cells[0].Style.BackColor = System.Drawing.Color.Violet;
                }
            }
        }
Чёрта с два! Я тоже был таким же наивным, ни хрена она не окрашивается. Вместо этого начинается издевательство, а именно:
1) ставим галку в строке (например) 2-ноль эмоций(почему я и назвал тему- ни фига не реагирует обработчик событий!)
2) ставим галку в строке 0- закрашивается строка 2
3) ставим галку в строке 3- закрашивается строка 0

Ну и так далее. Чё за пятнашки в самом деле? Я хочу чтобы у меня окрашивалась та строка, напротив которой я ставлю галку, а не предыдущая!

Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2013, 20:52
Ответы с готовыми решениями:

Почему когда я вешаю обработчик события на ячейку и этот обработчик срабатывает, то оказывается, он сработал совершенно для ДРУГОЙ ячейки?
Да, почему? Скропаем DataGridView; кинем на форму listBox2 и listBox1 и напишем такой обработчик...

Событие CellValueChanged в DataGridView не вызывается программно
Здравствуйте! Есть таблицы DataTable dt1, dt2; DataGridView dgv1, dgv2; dgv1.DataSource = dt1;...

Обработчик события выделения ячейки в DataGridView
Есть две таблицы. В первой формируется столбец из 11 строк. Вторая заполняется функцией, которая...

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

21
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
08.02.2013, 21:05 2
http://msdn.microsoft.com/ru-r... anged.aspx

просто почитай внимательно
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
Цитата Сообщение от kravam Посмотреть сообщение
Я забыл добавить- msdn читал, но не понял, почему событие , должное возникнуть тогда, когда значение ячейки меняется, откладывается на потом. А если бы понял, не спрашивал бы.
оно должно возникнуть когда значение ячекий изменилось.
Событие происходит при фиксации DataGridView.CellValueChanged заданное пользователем значение, которое обычно возникает, когда фокус покидает ячейку.
ну если по простому, пока ты редактируешь ячеку она находиться в подвешенном состоянии и все изменения делаеються в "буфере", и после завершения редактирования они окончательно фиксируються, как то так.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
09.02.2013, 04:07  [ТС] 5
Ну это понятно. Я поставил галку- там уж всё должно зафиксироваться на 100 рядов! Обработчик-то почему не срабатывает? И как заставит его срабатывать?

Добавлено через 2 часа 54 минуты
Короче я закалебался разбиратся с редактированием этого столбика, но подвижки кое какие есть, поехали.

Во-первых, если мы хотим, чтобы всё было круто, необходимо использовать событие CurrentCellDirtyStateChanged, но не CellValueChanged и если кто-то считает, что этим дело исчерпывается, он ошибается. Всё самое интересное впереди.
Пишем (ну это как водится, набросаем пять строк):
C#
1
2
3
4
5
6
        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < 5; i++)
                dataGridView2.Rows.Add();
        }
и обработчик события

C#
1
2
3
4
5
6
7
8
        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;
        }
Тычем в ячейку (не в последнюю!) в надежде получить результат, да только чёрта с два! Эти хироманты из C# придумали так, что изначально значение ячейки ни false, ни true, а не понять что; поэтому при добавлении строк надо это учесть, пишем такой обработчик:
C#
1
2
3
4
5
        private void dataGridView2_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
 
            dataGridView2.Rows[e.RowIndex].Cells[1].Value = false;
        }
Если вы думаете, что щас можно тыкать в ячейки, опять попали пальцем в небо. Тут самый большой прикол. Ткнув на ячейку, вы её всего лишь отметите, но строка не окрасится! А окрасится она когда выткнёте на следующую ячейку! (справедливости ради нельзя не отметить заботу о нас, разработчиках- изменение цвета произойдёт не когда вы отпустите мышь на другой ячеке, а когда всего лишь нажмёте... м-да...) ПОэтому пишем так:


C#
1
2
3
4
5
6
7
8
9
10
11
        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);
        }
Встроить-то вызов не судьба была видно, да... И опять это ещё не всё. Если вы щас ткнёте в последнюю ячейку, вылетит исключение. Чтобы этого не было пишем так: (ну типа нельзя изменять значение последней ячейки)

C#
1
2
3
4
5
        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;
        }
Казалось бы- можно вздохнуть свободно- но не тут-то было! Если мы щас заходтим прибавить строку вручную- чёрта с два у нас это получится. В общем, пишем последний обработчик:

C#
1
2
3
4
5
6
        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();
        }
Теперь можно прибавлять строки тыча не на квадратик, а на первую ячейку. Вроде всё. Весь код:

Кликните здесь для просмотра всего текста
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".
If you want to respond immediately when users click a check box cell, you can handle the DataGridView.CellClick event, but this event occurs before the cell value is updated. If you need the new value at the time of the click, one option is to calculate what the expected value will be based on the current value. Another approach is to commit the change immediately, and handle the DataGridView.CellValueChanged event to respond to it. To commit the change when the cell is clicked, you must handle the DataGridView.CurrentCellDirtyStateChanged event. In the handler, if the current cell is a check box cell, call the DataGridView.CommitEdit method and pass in the Commit value.
Так как я уже в курсе, по поводу того, как вы умеете понимать английский текст, сразу передам смысл:

Если хочется обработать именно тот момент, когда юзер кликнул мышью, то нужно это делать в обработчике к событию 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

Только видите какая штука, там ни слова не сказано, что

Цитата Сообщение от kravam Посмотреть сообщение
изначально значение ячейки ни false, ни true, а не понять что
; это уж своим умом доходить надо. Кроме того там абсолютно ничего нет про куда писать CommitEdit и чё даёт. Я крутил его и так и сяк (кстати). Дошёл сам и отписался. А вы мне ещё и тычете этим.

Наконец ещё два пункта- как сделать чтобы не вылетало исключение при тыканьи в последний квадратик и как вручную добавлять строки- там тоже слова нет про это. Хотя это и не очень относится к теме.

Ну и наконец
Цитата Сообщение от kravam Посмотреть сообщение
по клику на квадратик, событие CurrentCellDirtyStateChanged произойдёт дважды
Может быть самый главный вопрос. Почему? Тоже может, скажете, написано?
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
09.02.2013, 07:47 8
Цитата Сообщение от kravam Посмотреть сообщение
обрабатывать именно событие событие CurrentCellDirtyStateChanged и про вызов CommitEdit с параметром Commit
Я же знаю, что вы с английским не дружите, поэтому и перевел, что там написано. Если идти вторым путем, то обрабатывается не событие CurrentCellDirtyStateChanged, а событие CellValueCnaged, а в обработчике события CurrentCellDirtyStateChanged присутствует всего одна строка, которая инициирует возникновение события CellValueChanged. Вы же всю логику в событие CurrentCellDirtyStateChanged зафигачили. Более того, вызов метода CommitEdit вы обосновали не желанием закоммитить новое значение в ячейку датагрида, а желанием перерисовать этот грид. Как правильно перерисовывается грид, есть в примере, ссылка на который присутствует в моем предыдущем посте.
Цитата Сообщение от kravam Посмотреть сообщение
изначально значение ячейки ни false, ни true, а не понять что
Цитата Сообщение от kravam Посмотреть сообщение
как сделать чтобы не вылетало исключение при тыканьи в последний квадратик и как вручную добавлять строки- там тоже слова нет про это. Хотя это и не очень относится к теме.
Если правильно создать обработчики, как написано в MSDN, и как приведено в примере, то данные вопросы не возникнут. Ибо в событие CellValueChanged значение ячейки уже изменено, и содержит корректное значение.
Цитата Сообщение от kravam Посмотреть сообщение
по клику на квадратик, событие CurrentCellDirtyStateChanged произойдёт дважды
Цитата Сообщение от kravam Посмотреть сообщение
Может быть самый главный вопрос. Почему? Тоже может, скажете, написано?
Нет, этого в MSDN нет, ибо данное поведение запрограммировано вами самим. Вы просто не понимаете, когда возникает событие CurrentCellDirtyStateChanged и как с ним работать. Перед тем, как с ним работать, нужно было сначала про него прочитать. Данное событие возникает не при изменении значения ячейки датагрида, которое еще не закомиченно в датагрид, а возникает оно, когда меняется состояние "измененности" у выбранной ячейки. То есть, когда начинается редактирование текущей ячейки, данное событие возникает один раз (состояние "измененности" принимает значение "Изменено"), а потом не возникает до тех пор, пока новое значение либо не будет принято для текущей ячейки, либо не будет отменено (состояние "измененности" принимает значение "не изменено").
А теперь, собственно, к тому, почему оно вызывается 2 раза: при клике на квадратике, состояние "измененности" ячейки становится "изенено", и вызывается событие CurrentCellDirtyStateChanged, в конце обработчика которого стоит вызов метода CommitEdt, который, в свою очередь, записывает новое значение в ячейку и меняет состояние "измененности" ячейки на "не изменено", тем самым инициируя вызов обработчика события CurrentCellDirtyStateChanged еще раз. Код обработчика проходит по второму кругу, в том числе вызывает метод CommitEdit, который смотрит, что ячейка находится в состоянии "не изменено" и уже ни чего не делает. Поэтому в вашем случае даннный обработчик вызывает ровно два раза при каждом тычке по квадратику.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
09.02.2013, 16:06  [ТС] 9
Цитата Сообщение от kodv Посмотреть сообщение
в обработчике события CurrentCellDirtyStateChanged присутствует всего одна строка, которая инициирует возникновение события CellValueChanged
напишите. Я могу, конечно, попробовать угадать, но я один раз уже угадал, плохим оказался. Так что напишите и обсудим. Правильность, доступность, очевидность...
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
09.02.2013, 16:54 10
А еще говорите что по ссылкам ходите, и смотрите, что там. еще раз, здесь есть пример. Раз уж вам лень пройти по ссылке, посмотреть пример, и разобраться в нем, то выложу его сюда.
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
// This event handler manually raises the CellValueChanged event 
// by calling the CommitEdit method. 
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}
 
// If a check box cell is clicked, this event handler disables   
// or enables the button in the same row as the clicked cell. 
public void dataGridView1_CellValueChanged(object sender,
    DataGridViewCellEventArgs e)
{
    if (dataGridView1.Columns[e.ColumnIndex].Name == "CheckBoxes")
    {
        DataGridViewDisableButtonCell buttonCell =
            (DataGridViewDisableButtonCell)dataGridView1.
            Rows[e.RowIndex].Cells["Buttons"];
 
        DataGridViewCheckBoxCell checkCell =
            (DataGridViewCheckBoxCell)dataGridView1.
            Rows[e.RowIndex].Cells["CheckBoxes"];
        buttonCell.Enabled = !(Boolean)checkCell.Value;
 
        dataGridView1.Invalidate();
    }
}
Обработчик события CurrentCellDirtyStateChanged вызывает метод CommitEdit, если в гриде есть не закомиченные изменения. Обработчик события CellValueChanged, в случае, если текущая ячейка принадлежит столбцу "CheckBoxes", то в зависимости от значения этой ячейки выставляет свойство Enabled у соответствующей ячейки, которая принадлежит колонке кнопок. Пример занимает 30 строк, считая коментарии, отступы и всевозможные фигурные скобки. Ни чего сложно в нем нет, все сопровождается комментариями. Пример 100% рабочий и правильный, ибо это пример из официального источника, коим является MSDN. У вас провайдер доступ к MSDN заблокировал что ли, раз вы уже сутки не можете посмотреть пример работы с чекбоксовыми колонками?
Адаптировать пример под свои задачи проще простого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (((DataGridView)sender).IsCurrentCellDirty) ((DataGridView)sender).CommitEdit(DataGridViewDataErrorContexts.Commit);
}
 
public void dataGridView1_CellValueChanged(object sender,
    DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0 && e.ColumnIndex >= 0 && ((DataGridView)sender).Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn)
        ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = (bool)((DataGridView)sender)[e.ColumnIndex, e.RowIndex].Value ? Color.Yellow : Color.White;
}
Как видите, минимум кода и никаких скрытых нюансов. Обсуждайте.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
09.02.2013, 19:40  [ТС] 11
kodv, да видел я это. Только вы не то даёте. Я-то думал вы мне покажете:
Цитата Сообщение от kodv Посмотреть сообщение
в обработчике события CurrentCellDirtyStateChanged присутствует всего одна строка, которая инициирует возникновение события CellValueChanged.
C#
1
2
3
4
5
6
7
8
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}
И? Откуда тут следует, что щас вызовется событие CellValueChanged? Я должен догадаться? Я не умею. Вот например, написано:

public void PerformClick()
Член System.Windows.Forms.Button

Сводка:
Создает событие System.Windows.Forms.Control.Click для кнопки.
Ясно, чисто без всяких там этих самых.

А теперь про CommitEdit
Сводка:
Фиксирует изменения в текущей ячейке в кэш данных, не завершая режим редактирования
и я ещё виноват, что я не догадался, что эта муть означает всего-навсего создание события CellValueChanged! Это же ясно как день!

Про dataGridView1.IsCurrentCellDirty я вообще молчу.
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
10.02.2013, 18:30 12
Цитата Сообщение от kravam Посмотреть сообщение
И? Откуда тут следует, что щас вызовется событие CellValueChanged? Я должен догадаться?
Зачем догадываться, если все и так написано. Но из-за вашего нежелания прочитать пару предложений, уже в очередной раз получается срач в теме, когда вы уверяете, что там, куда вас носом тыкают, ни чего не написано.
Another approach is to commit the change immediately, and handle the DataGridView.CellValueChanged event to respond to it. To commit the change when the cell is clicked, you must handle the DataGridView.CurrentCellDirtyStateChanged event. In the handler, if the current cell is a check box cell, call the DataGridView.CommitEdit method and pass in the Commit value.
Перевод смотрите выше.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
10.02.2013, 19:04  [ТС] 13
Ваш перевод:
Другой подход для отлавливания изменений в этой ячейки заключается в немедленном применении изменений, которые будут обрабатываться в обработчике к событию DataGridView.CellValueChanged. Для того, чтобы немедленно применить изменение ячейки, нужно создать обработчик события DataGridView.CurrentCellDirtyStateChanged и в этом обработчике, если ячейка является чекбоксом, вызывать метод DataGridView.CommitEdit.
Это отсюда я должен сделать вывод, что
Цитата Сообщение от kravam Посмотреть сообщение
щас вызовется событие CellValueChanged
?
++++++++++++++++++++++++++++++++++++++++++++++++
Цитата Сообщение от kodv Посмотреть сообщение
Но из-за вашего нежелания прочитать пару предложений, уже в очередной раз получается срач в теме, когда вы уверяете, что там, куда вас носом тыкают, ни чего не написано.
так-то всё ничё, но второй раз получается ситуация: я худо бедно, с матом-перматом, через пень колоду дохожу до всего сам, тут нарисовываетесь вы и тычете мне пальчиком... Второй раз: дорога ложка к обеду. Ценность ваших советов под большим-большим вопросом, а уж когда я сам до всего дошёл под вопросом тем более. Не нарисовались бы вы невовремя и не было бы никакого срача, а всё закончилось бы моими выводами
Почему когда изменяется значение ячейки DataGridView, то не вызывается обработчик события CellValueChanged?

А теперь извольте отвечать, раз уж взялись.
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
11.02.2013, 02:52 14
Цитата Сообщение от kravam Посмотреть сообщение
Это отсюда я должен сделать вывод, что
Да. А разве нет? Что не ясно написано. Обработка в CellValueChanged, чтобы это событие возникло, вызывается CommitEdit в CurrentCellDirtyStateChanged. По ходу, вы не только на английском нормально прочиттаь не можете, но и на русском.
Цитата Сообщение от kravam Посмотреть сообщение
уж когда я сам до всего дошёл
Дойти то дошли, но не туда. Как итог, у вас возникло еще больше вопросов. А я вам просто указал, во-первых, ссылку, где описано 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
Цитата Сообщение от kodv Посмотреть сообщение
Что не ясно написано
если бы это был корявый РУССКИЙ текст, тогда бы я может и понял. А, поскольку оригинал английский- машешь рукой на перевод- свой ли, машинный ли ибо- чёрт его знает, что на самом деле имелось ввиду... и "Мы пойдём другим путём!"

Цитата Сообщение от kodv Посмотреть сообщение
Как итог, у вас возникло еще больше вопросов.
как итог вашего вмешательства, вы хотели сказать. После этого сообщения

Почему когда изменяется значение ячейки 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 минут
...
Цитата Сообщение от kravam Посмотреть сообщение
Я забыл добавить- msdn читал, но не понял
Добавлено через 3 часа 44 минуты
А теперь по сути: вот коды, мой и ваш, мой плохой охренительно закрашивает ячейки по клику, а ваш хороший (закомменчен)- нет

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
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++)
                dataGridView1.Rows.Add();
        }
 
        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            Point po = ((DataGridView)sender).CurrentCellAddress;
            if ((bool)(dataGridView1.Rows[po.Y].Cells[1].Value) == true)
                dataGridView1.Rows[po.Y].Cells[0].Style.BackColor = System.Drawing.Color.Violet;
            else
                dataGridView1.Rows[po.Y].Cells[0].Style.BackColor = System.Drawing.Color.White;
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
 
 
 
 
        //public void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        //{
        //    if (((DataGridView)sender).IsCurrentCellDirty) ((DataGridView)sender).CommitEdit(DataGridViewDataErrorContexts.Commit);
        //}
 
        //public void datagridview1_cellvaluechanged(object sender, DataGridViewCellEventArgs e)
        //{
        //    if (e.RowIndex >= 0 && e.ColumnIndex >= 0 && ((DataGridView)sender).Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn)
        //        ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = (bool)((DataGridView)sender)[e.ColumnIndex, e.RowIndex].Value ? Color.Yellow : Color.White;
        //}
 
 
 
 
 
 
 
        private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            dataGridView1.Rows[e.RowIndex].Cells[1].Value = false;
            dataGridView1.Rows[e.RowIndex + 1].Cells[1].ReadOnly = true;
        }
 
        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            Point po = ((DataGridView)sender).CurrentCellAddress;
            if (((DataGridView)sender).Rows[po.Y].Cells[po.X].Value == null)
                dataGridView1.Rows.Add();
        }
 
 
 
    }
}
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
Цитата Сообщение от kodv Посмотреть сообщение
То, что вы где то накосячили - это не удивительно.
естессно, как же не накосячить-то? Я же всегда косячу.

Цитата Сообщение от kodv Посмотреть сообщение
Глубже разбираться не охота.
Что значит охота- не охота? Взялся за гуж, так и не говори, что не дюж. Не хотите разбираться в моём- дайте свой рабочий код. А то получается: "У меня есть код, он рабочий, но я его не покажу".
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
12.02.2013, 03:05 20
kravam, Код рабочий. В чем ваша ошибка, я написал - исправляейте. Если вы не можете нормально привязать 2 обработчика событий к 2-м событиям, то в чем моя вина? Удивляет лишь только ваша высокая репутация, ибо не ясно, от куда она, если вы базовых вещей сделать не в состоянии.
0
12.02.2013, 03:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2013, 03:05
Помогаю со студенческими работами здесь

Обработчик события нажатия кнопки мыши для dataGridView
Здравствуйте=) помогите пожалуйста с решением вот этой задачи: для таблиц DataGridView создается...

Почему может не работать обработчик события?
Подскажите пожалуйста, почему в моем коде не срабатывает обработчик? LRESULT CALLBACK...

Почему обработчик события формы 2 отрабатывает и на первой?
Есть 2 формы - main и bd_master. форма bd_master открывается из main вот так: bd_master...

Не изменяется значение в DataGridView
Имею следующий код, label1 просто для проверки того что, значение выбирается. Дак вот данные в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru