Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Трабла с DataGridViewImageColumn


Автор: allknower 16.9.2008, 10:51
Здравствуйте. У меня вопрос по DataGridView. На форме на одной из страниц TabControl'a лежит экзампляр грида (procMGrid), в нем добавлена колонка DataGridViewImageColumn (Name = PROC_STATUS). В момент выбора этой страницы вызывается следующий код, который получает DataTable и привязывает его к гриду. После чего foreach'ем проходится по строкам и в зависимости от значения колонки PROCESS_TYPE выставляет ту или иную картинку в Image-колонке.

Код

           private void Loadxxxxxx()
           {
            grid.DataSource = Getxxxxxx(); // возвращает DateTable
            grid.Columns["TYPE"].Visible = false;

            foreach (DataGridViewRow row in grid.Rows)
            {
                switch (row.Cells["TYPE"].Value.ToString())
                {
                    case "1":
                        {
                            row.Cells["STATUS"].Value =
                                global::MyNameSpace.Properties.Resources.start;
                        }
                        break;
                    case "0":
                        {
                            row.Cells["STATUS"].Value =
                                global::MyNameSpace.Properties.Resources.stop;
                        }
                        break;
                    default:
                        {
                            row.Cells["STATUS"].Value =
                                global::MyNameSpace.Properties.Resources.unknown;
                        }
                        break;
                }
            }

            grid.Columns["STATUS"].DisplayIndex = grid.Columns["TYPE"].DisplayIndex;
            }


Внимание вопрос: при ПЕРВОМ проходе выполняется все это, по картинок в Image-колонке нет. (value = null)
В результате трейса по коду выяснилось что после выполнения представленного выше кода выполняются накопившиеся в буфере event'ы (такие как RowEnter и т.п.), которые вызываются с "уже не актуальными параметрами" (например в момент привязки датасорса к гриду, генерится событие в момент когда первая строка добавляется. В этот момент grid.Rows.Count = 1, "ImageCol".Value = null.) Может это как то влияет... Как это все можно забороть???
После повторного переключения на эту страницу все отображается нормально.  smile

Зарание спасибо.

Автор: allknower 19.9.2008, 08:29
Сделал так: в грид добавил все необходимые для отображения колонки (нужных типов) и установил их свойства DataPropertyName.
Далее кинул на форму BindingSource  и код стал таким:

Код

        private void Loadxxxxxx()
        {
            bs.DataSource = Getxxxxxx(); // возвращает DateTable
            grid.AutoGenerateColumns = false;
            grid.DataSource = bs;
        }


Добавил обработчик события CellFormatting(...)
Код

        private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == grid.Columns["STATUS"].Index && e.Value != null)
                switch (e.Value.ToString())
                {
                    case "1":
                        {
                            e.Value =
                                global::MyNameSpace.Properties.Resources.start;
                        }
                        break;
                    case "0":
                        {
                            e.Value =
                                global::MyNameSpace.Properties.Resources.stop;
                        }
                        break;
                    default:
                        {
                            e.Value =
                                global::MyNameSpace.Properties.Resources.unknown;
                        }
                        break;
                }
        }


И фсё!!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)