c datagridview ячейка combobox

В заметке рассказано как получить индекс выпадающего списка находящегося в ячейке DataGr >получить SelectedIndex находящегося в ячейке ComboBox-а . Как добавить в DataGridView колонку с выпадающими списками или с чекбоксами можете посмотреть в одной из прошлых статей.

Проблема заключается в том, что получив объект, находящийся в ячейке, мы не можем получить его индекс как с обычным ComboBox-ом, т.е., например, такой код не будет работать:

Всё потому, что у DataGridViewComboBoxCell нет свойства SelectedIndex. Для решения проблемы я взял за основу информацию из ответа на вопрос на Stack Overflow. Там описано 2 способа как получить индекс выбранного элемента. Первый способ навел меня на размышления и я его реализовал по-своему.

1-й способ. Использование EditingControlShowing

Суть идеи в том, чтобы использовать событие EditingControlShowing, которое происходит когда ячейка переходит в состояние редактирования и отображается контрол, находящийся в этой ячейке. Во время этого события я на этот контрол (ComboBox) навешиваю событие изменения выбранного элемента.

Предположим, что у нас в DataGridView вторая колонка содержит ComboBox-ы:

Как видно в коде, я сначала «снимаю» с ComboBox-а событие, а потом заново его «навешиваю». Это сделано специально, чтобы не происходило повторных «навешиваний». Пользователь ведь может зайти в ячейку, поменять значение выпадающего списка, потом уйти в другую ячейку, а затем снова вернуться и опять поменять значение списка. Так вот, чтобы каждый раз, когда он редактирует ComboBox не происходило многократного назначения события, я и делаю сначала его удаление.

Теперь обработчик события изменения ComboBox-а:

Таким образом, при изменении выбранного элемента в ComboBox-е его индекс запишется в свойство Tag ячейки в которой находится этот ComboBox. Можно так же сохранить выбранный индекс и в массив или куда пожелаете, а потом, когда понадобится индекс, его будет легко получить.

2-й способ. Поиск по значению.

Этот метод очень прост, но имеет недостаток. Его смысл в том, что нужно сначала получить контрол в ячейке и потом в нем найти индекс выбранного значения.

Минус у этого способа, как я думаю, лишь один: если в выпадающем списке будут повторяющиеся названия элементов, то будет определяться индекс первого найденного, в то время как на самом деле выбран другой с таким же названием. Каким способом пользоваться, решайте сами, в зависимости от ситуации и потребности.

Я ведь это уже делал, но хрен теперь найдешь тот кусок кода, гуглим снова… Где бы найти простое и понятное руководство для начинающего, а не тонкости для мега-гуру?

Рубрики

Свежие записи

Свежие комментарии

  • Calator prin Romania к записи Как переименовать проект/каталог проекта в Visual Studio?
  • iukovl к записи Как изменить максимальный размер загружаемого файла в php
  • sdfdsgeg к записи Работа с файлом конфигурации (configuration) в C# — читаем и сохраняем
  • iukovl к записи Как изменить максимальный размер загружаемого файла в php
  • Надежда к записи Ошибка в коде привела к убыткам в 476 миллионов долларов и банкротству компании

Архивы

Имеем DataGridView связанный с некоторой таблицей. Необходимо создать в нем колонку выпадающих списков ComboBox, элементы которых будут заполняться из другой таблицы, содержащий тексты элементов комбокса и коды. Во время работы нам надо получить выбранной код для каждой строки.

Делается это несложным, но крайне неочевидным способом. В таблице-источнике данных для датагрида нам надо добавить столбец для выбранного кода. Для столбца с комобоксами типа DataGridViewComboBoxColumn нам нам надо указать источником данных таблицу-справочник, а в свойство DataPropertyName занести столбец для выбранного кода из таблицы-источника данных для всего DataGridView. После чего выбранные данные будут автоматически транслироваться в таблицу-источник данных для даатагрида через механизм привязки. Чтобы у вас голова окончательно не пошла кругом я заготовил небольшую схему (BindingSource посредники на ней опущены):

Принципиально важно установить один и тот же тип данных для столбца с кодом в обеих DataTable — иначе получим ошибку System.FormatException: DataGridViewComboBoxCell value is not valid.

В коде это может выглядеть примерно так:

Когда все заработает вы столкнетесь с еще одной проблемой — для открытия выпадающего списка надо кликнуть по нему несколько раз. Это глюк. Наиболее простой способ лечения (найден на английском сайте Codelicious) — установить свойству DataGridView EditMode значение EditOnEnter. Правда это вызовет другой глюк — не получится удалить строку выбрав ее кликом по ячейке-заголовку, так как данные об удалении будут пересланы отдельной ячейке, исправить это можно следующим способом.

Вы думаете это все? Значит вы действительно новичок. )) Скорее всего вы столкнетесь с тем, что длина элементов выпадающего списка гораздо большие ширины столбца в гриде. Причем расширять столбец грида нежелательно. Два очевидных решения — сделать всплывающую подсказку или увеличить ширину самого выпадающего списка. Я в свое время выбрал второе.

Комментарии

Особенности работы с ComboBoxColumn в DataGridView — Комментарии (8)

..Когда все заработает вы столкнетесь с еще одной проблемой — для открытия выпадающего списка надо кликнуть по нему несколько раз. Это глюк. Наиболее простой способ лечения (найден на английском сайте Codelicious) — установить свойству DataGridView EditMode значение EditOnEnter..
— Не пройдет. При щелчке по ячейке появляется значение из списка, но НЕ заносится в ячейку, пропадает если сразу перейти на другую ячейку.

За описание глюка — большое человеческое спасибо

Официальное трудоустройство, работа в интернете.

На нынешний день выбор любой аппаратуры полагается постигаться скоропостижно и отменно, собственно есть действовать на выигрышных положении, именно по уместной цене и отличном хорошем уходе. Указанная компания климатической системы подает обеспечение циркулирующей системой надобное комнате особенно на таких обстоятельствах. Организация Мастер-Климат в окрестностях Киеве купить канальный кондиционер создает сбыт, снабжение, подключение, наладку, демонтаж, чистку также диагностику приобретенной климатизерной оборудовании в недорогим ценами и утверждение надежности. У презентованном серверном-сайте Мастер Климат покупатель получает назначение определить лучшую продукт европейских также японских поставщиков Panasonic, НеоКлима, Купер Хантер, Mitsubishi, Olma, Leberg, что можно заказать по Киеве за вразумительным расценкам. Мастер Климат применяет отпуск снабжения вентиляций и подогрева, какие подсобит предоставить нормальный атмосферу, устроенность к тому же нескончаемую функционирование на долгие годы употребления. Звоните до Мастер Климат, тогда мы подбираем к клиенту избранные разновидности полностью на выгодных условиях.

Кондиционерные аппараты также вентиляционные установки собственно за умеренными стоимостью в Одессе пользователи сможете обозреть также заказать в онлайн- точке климатологической технического оснащения Мастер Климат master-climat.com/pages/montazh. На источнике точки клиент имеют возможность просмотреть кондиционерное оборудование производителя Тошиба, Панасоник, Neoclima, Купер Хантер, Карриер, Daikin, Chigo, LG и иные, или же к тому же оформить вентиляционный блок плюс бесплатную снабжение у Одессе. К привоза компания выполняем сервис монтировки, демонтирование, проверки плюс уборка канальных двухблочные- концепция и производтсвенных установок. обновляйте кондиционеры любой работоспособности также разновидности также низкие расценки в магазине Мастер Климат, ну а работающие монтажники выдают первоклассное сервис на счет монтировки приобретенного климатизерного установок. Промышляя собственно на бирже длительное период, фирма одержала желанное признание посредь абонентов, сертификаты гарантии свойств, авторизацию также права утвержденного производителя, все это дает компании возможность вести доставку считаясь любые просьбы клиентов.

Рекомендую Вам посетить сайт, с огромным количеством статей по интересующей Вас теме.

Заполняю динамически datagridview. Далее при двойном щелчке по опреленной ячейке в этой же ячейке надо чтоб появлялся combobox. Как это сделать.

1 ответ 1

и обязательно обработать ошибку DataError

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# winforms или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459

Понравилась статья? Поделиться с друзьями:
Vkontakte.INFO
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: