Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265

Странное поведение DataGridView

24.06.2013, 01:45. Показов 2328. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Хочу в DataGridView отображать картинки.
Делаю следующее, создаю в гриде столбец с типом: DataGridViewImageColumn, а потом в цикле по строкам пишу так:
C#
1
dataGridView1.Rows[i].Cells["Picture"].Value = new Bitmap(picPath);
или так:
C#
1
dataGridView1.Rows[i].Cells["Picture"].Value = Image.FromFile(picPath);
И тут начинаются чудеса! Во-первых, картинки не отображаются, более того, если в свойствах столбца задать свойство Image, т.е. указать картинку, которая будет отображаться, если Value ячейки, цитирую "is not set", то отображается эта картинка, т.е. якобы значение не задано, но.
Но если я создам на форме PictureBox и напишу так:
C#
1
pictureBox.Image = (Image)dataGridView1.Rows[0].Cells["Picture"].Value;
То картинка отобразится в pictureBox! Т.е. значение в ячейке всё-таки есть и оно даже та самая картинка!
Почему так происходит? И как отобразить картинки в DataGridView?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2013, 01:45
Ответы с готовыми решениями:

Странное поведение DataGridView
Создал в DataGridView столбец, ColumnType: DataGridViewComboBoxColumn. Проблема в следующем: допустим, я выбрал что-то в одном ComboBox....

Странное поведение PrintSetupDialog
Добрый день! Никто не сталкивался со странным поведением компонента настройки параметров страницы PrintSetupDialog? При если к нему...

Странное поведение DrawRectangle
Помогите разобраться, не понимаю почему рисуется больше чем нужно прямоугольников в стороне квадрата и последние два растянутые. При том...

17
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
24.06.2013, 15:34
Попробуй так:

C#
1
dataGridView1.Rows[i].Cells["Picture"].Value = Bitmap.FromFile("c:\\download.jpg");
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
24.06.2013, 21:31  [ТС]
Доктор, у меня уточняющие симптомы.
Дело не в способе присваивания картинки к ячейке. Опытным путём выяснено, прекрасно работают все 3 способа, но только при одном условии. Таблица должна быть видна в тот момент, когда ячейкам присваиваются картинки! Т.е. если я вижу таблицу и запускаю присвоение, то всё ОК, если же таблица не видна когда ей присваиваются картинки, скажем она находится на другой вкладке Табконтрола, то картинки не отображаются после того как я перейду на таб с таблицей.
Как лечить?
Пробовал вызывать dataGridView1.Update() и dataGridView1.Refresh() - не помогает.
0
47 / 18 / 4
Регистрация: 17.04.2013
Сообщений: 87
24.06.2013, 22:14
По идее если Вы не присваиваете какому-то контролу который может влиять на отображение dataGridView1, в том числе и самой dataGridView1 Visible = false, то независимо от того видима dataGridView1 на экране монитора или скрыта за страницей табконтрола, ей что-то можно присвоить.
Попробуйте написать функцию присвоения каких-то рисунков колонкам dataGridView1 по нажатию и активации соответствующей страницы.
0
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
24.06.2013, 23:12
Цитата Сообщение от Predatore Посмотреть сообщение
Таблица должна быть видна в тот момент
Не понял это момент.
Прикрепи проект порсмотрим
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
24.06.2013, 23:53  [ТС]
По идее да, какая разница где грид находится? Но у студии видимо своё мнение на сей счёт.
Но вот сейчас я таких глюков нахватался, что просто даже не знаю... Собственно опишу что происходит.
Как я уже сказал, если грид активен, то всё ОК, но только если прога запущена из под Студии, если же я запускаю её отдельным экзешником, то если грид активен в момент присвоения ему картинок, выскакивает эксепшн: "в экземпляре объекта не задана ссылка на объект", если же не активен, то всё так же как и из под студии, грид не показывает картинок. Я конечно могу предположить, что где-то у меня ошибка, что где-то я пытаюсь обратиться к неинициализированному объекту, маловероятно, но не исключаю, но почему ошибка возникает только в отдельном экзешнике? Почему она не возникает при запуске из под Студии?
Ну и да, попробовал присваивать картинки по событию перехода на вкладку. И тут без чудес не обходится! Сначала я заполняю датасет, а потом привязываю датагрид к датасету и следом присваиваю картинки датагриду. Так вот опять же, если датагрид не виден, когда заполняется датасет, то картинки не отобразятся. Если же открыть сначала датагрид, а потом заполнить датасет и уже после этого покинуть грид и вернуться на него (помним, что привязка к датасет и присвоение картинок делаются при открытии таба с гридом, при первом открытии ещё нечего было привязывать), тогда картинки отобразятся!
И то же самое с отдельным экзешником, если заполнять датасет при открытом гриде, вылетает эксепшн, если грид не виден, никаких ошибок и никаких картинок...
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
25.06.2013, 00:16
приложите проект, у меня например все хорошо работает

попробуйте создать датагрид, с 1 колонкой изображений, и посмотрите будет ли проявлятся этот глюк
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
25.06.2013, 01:47  [ТС]
Решил часть проблем. Обнаружил новые симптомы. Проект очень большой, весь выкладывать накладно, сейчас спать уже хочется, поэтому выдирать из него функционал с гридом и картинками не имею возможности.
А теперь подробнее.
1. Разобрался с ошибками отдельного экзешника и даже предполагаю почему они не проявлялись в студии. Я подумал, какая связь между датасетом и еще не привязанным к нему датагридом? Оказалось что есть связь, датагрид не привязан к таблице в датасете, но уже привязан к самому датасету в дизайнере. А т.к. датасет изначально пустой, грид и сваливается как только начинаются какие-то телодвижения. В студии ошибки не возникает потому что студия генерит для датасета пустую табличку отображаемую на форме в дизайнере, в самой же проге этой таблицы нет, вот и сыпятся эксепшены. Сделал привязку грида уже после того как датасет заполнен и проблема исчезла.
2. Первичные симптомы не совсем верны, что бы картинки отображались, не обязательно что бы привязка картинок делалась при открытом гриде. Достаточно перед привязкой отобразить его и можно с него уходить. Т.е. если я открою вкладку с гридом, а потом уйду с неё и запущу привязку, то всё будет ок, если же я запущу привязку не открывая грида, то картинок не будет. И у меня так же есть предположение на сей счёт. Начну с того, что визуальные объекты полноценно создаются только в тот момент, когда отображаются на экране. В этом я убедился когда создавал кучу динамических объектов и они начинали жрать память только тогда, когда я открывал вкладку с ними, а не тогда когда создавал их. Т.е. мой грид, пока я его не открою, вроде как бы и есть, но на самом деле визуально его ещё нет, в прямом смысле нет, а не просто он находится на другой вкладке. И к этому, ещё визуально не существующему объекту я начинаю цеплять более чем визуальные объекты, т.е. картинки. Сам грид то существует и картинки к нему соответственно присваиваются, о чём свидетельствует PictureBox, который замечательно их отображает. Но визуально, он (грид) ещё не существует и поэтому картинки получаются не визуальными объектами, а не более чем объектами типа Image и соответственно не отображаются. Наверное немного сумбурно, но надеюсь основную мысль передать удалось.
3. Завтра у меня нет времени, а послезавтра, если не получится решить проблему, выложу кусок проекта с гридом и картинками.

Итого, главный вопрос по второму пункту, что с этим делать? Ну кроме очевидного и топорного решения, открывать вкладку с гридом, перед привязкой картинок? Может можно как-то до конца проинициализировать визуальный объект не отображая его? Если можно, то как?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
25.06.2013, 02:39
Начну с того, что визуальные объекты полноценно создаются только в тот момент, когда отображаются на экране. В этом я убедился когда создавал кучу динамических объектов и они начинали жрать память только тогда, когда я открывал вкладку с ними, а не тогда когда создавал их.
UI обьекты создаются в конструкторе формы, вот тут
C#
1
InitializeComponent();
как и все остальные UI обьекты.
они просто не отрисовываются пока вы не открыли окно с ними, поэтому они не жрут лишнюю память на отрисовку, но память под сам обьект они занимают, как и под все его св-ва и ссылки на связи

Т.е. мой грид, пока я его не открою, вроде как бы и есть, но на самом деле визуально его ещё нет, в прямом смысле нет, а не просто он находится на другой вкладке.
т.е он есть в памяти, но его нету на экране.
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
25.06.2013, 11:51  [ТС]
Aloir, и что с этим делать? Как я уже сказал, пока грид не отрисуется, ему бесполезно присваивать картинки, они не отрисуются вместе с отрисовкой грида.
Как его отрисовать, не открывая? Или как заставить отрисоваться картинки?
P.S. Я так полагаю, в сути проблемы мы сошлись и проект выкладывать нет смысла?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
25.06.2013, 17:49
Цитата Сообщение от Predatore Посмотреть сообщение
Aloir, и что с этим делать? Как я уже сказал, пока грид не отрисуется, ему бесполезно присваивать картинки, они не отрисуются вместе с отрисовкой грида.
Как его отрисовать, не открывая? Или как заставить отрисоваться картинки?
P.S. Я так полагаю, в сути проблемы мы сошлись и проект выкладывать нет смысла?
выложите, давайте посмотрим.

почему то мне кажется у вас где-то теряются ссылки на ваши обьекты и выходит такая бяка.

потому как повторяюсь, у меня все ок работает:
кинул таб контрол, на второй вкладке грид с колонкой под картинки, на первом табе кнопки на инициализацию строк картинкой - все ок работает
0
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.06.2013, 18:28
Цитата Сообщение от Aloir Посмотреть сообщение
почему то мне кажется у вас где-то теряются ссылки на ваши обьекты и выходит такая бяка.
согласен +1
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
25.06.2013, 23:54  [ТС]
Выдернул и выложил: http://yadi.sk/d/VI3e9kRD6Blfg
В проекте ничего лишнего, только демо проблемы.
Там 2 архива и эксельный файл: в архиве test.rar сам проект, во втором архиве понятно картинки. Пару слов о том, что это, с чем едят и причём тут эксель файл.
Источником данных для таблицы являются эксель файлы, в данном случае, что бы не перегружать проект, я взял всего 1 файл и открываю всего одну вкладку. Но картинки прикладываю все, т.к. разделить какие к каким файлам относятся нет никакой возможности, поэтому архив с картинками такой жирный. А дальше всё просто. Таб контрол, 2 вкладки, датагрид на второй. 2 кнопки, первая открывает эксель файл, загружает его в датасет и привязывает датасет к датагриду. Вторая присваивает картинки. Если грид отрисовался и мы привязываем картинки, то всё ок, если нет, то картинки не отображаются.
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
26.06.2013, 00:17
архив с проектом test пустой, что то или перевырезали или не доложили...
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
26.06.2013, 12:33  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
архив с проектом test пустой, что то или перевырезали или не доложили...
Прошу прощения, не ту папку заархивировал. Перевыложил.
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
27.06.2013, 01:34
я вас скажу где ошибка, а вы уже сами исправляйте.

для грида добавтье метод DataBindingCompleate и скопируйте туда код от кнопки LoadPicture,и все поймете
1
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
27.06.2013, 01:58  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
я вас скажу где ошибка, а вы уже сами исправляйте.

для грида добавтье метод DataBindingCompleate и скопируйте туда код от кнопки LoadPicture,и все поймете
Заработало! И на этом уже спасибо! И так в любом случае выглядит краше Но я видимо не такой понятливый... я довольно смутно представляю, почему этот способ работает, а через кнопку - нет. И насколько я не понятливый, настолько же и любопытный. Если не трудно, поясните в двух словах, в чём суть?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
27.06.2013, 03:23
ну попробую, у меня туго бывает с ясным выражением мыслей:
если вы добавите в тот метод еще какой-нт messagebox вы увидите когда отрабаывает bind на ваши данные с exceля, => при каждом бинде, у нас данные перезатягиваются и перезаполняется таблица => в наших pictureColumn.Value = null (и это видно кстати из дебага, научитесь пользоваться отладчиком он экономит время) => там просто нечего отоюражать.

если нажать в вашем первоначальном примере, загрузить список, а потом картинки, и не открывая вкладку 2 таба, вывести значение например ячейки 0,0 - то картинка там будет(Значение Bitmap в Value), если активируем таб, то значение уже будет там null
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2013, 03:23
Помогаю со студенческими работами здесь

Странное поведение webBrowser
Доброго всем дня. Прошу помощи. Не могу разобраться почему некорректно работает программа. Основная задача зайти на web-интерфейс топливной...

Странное поведение Bitmap
При загрузке изображения, оно сохраняется в sorseBitmap. При выполнении функции ToGray() возвращается его обесцвеченная копия и...

Странное поведение по тику таймера
День добрый. Приложение дергает каждые 30 секунд курсы валют из xml-ки по урлу, например...

Странное поведение Thread.Sleep
Эх, прошу помочь. В общем. Есть поток выполняющий эту функцию: { Begin: CoreInProcessing = true; for...

Странное поведение panel при рисовании (появляется перечёркнутый прямоугольник)
Здравствуйте! Рисую на панели, всё отлично получается, кроме сохранения состояния graphics, т.е. когда я перехожу с одного таба (на...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru