Отображение недопустимого значения по умолчанию в DataGridViewComboBoxColumn

У меня есть DataGridViewComboBoxColumn в DataGridView в приложении Windows. Пользователь может изменить настройки в другом месте, чтобы потенциально сделать недействительным выбор в DataGridViewComboBoxColumn. У меня есть требование сохранить/отобразить недопустимый элемент, оставив в списке только допустимые элементы.

Без исправления выбора возникает исключение:
Значение DataGridViewComboBoxCell недопустимо.

Перехват и игнорирование параметра возвращает выбранное значение к первому допустимому элементу в списке.

Есть ли способ предоставить значение DataGridViewComboBoxColumn, чтобы оно не отображалось в списке выбираемых значений?


person BrianH    schedule 07.10.2008    source источник
comment
Знакомы ли вы с событиями CellValidating и DataError? Последнее может заменить исключение, которое создает DataGridView.   -  person Not Sure    schedule 10.06.2009
comment
Я поймал исключение и проигнорировал его (к сожалению, распространенный шаблон), и значение вернулось. Если у вас есть предложения, я весь в ушах... эээ... в глазах?   -  person BrianH    schedule 15.06.2009


Ответы (3)


Я нашел очень странное решение:

Установите для autosizecolumnmode значение none...

Вот объяснение

http://www.kebabshopblues.co.uk/2007/03/24/more-on-that-datagridviewcombobox-error/

person Rulas    schedule 03.03.2009

Я собираюсь использовать пример того, что значения в раскрывающемся списке — это цвета, а в DataGridView есть список футболок в вашем шкафу.

Вы пытались вставить недопустимый цвет в объект списка, привязанный к столбцу ComboBox? Возможно, вы можете вставить в список что-то, ключ которого соответствует вашему недопустимому цвету, но показывает «(Недействительно)» (или другой подобный текст). Вам придется реагировать на событие CellValidating, если кто-то попытается выбрать его после первоначальной привязки.

Если недопустимые цвета появляются в результате изменения поиска в другом месте приложения, так что значения DataGridView (футболки) больше недействительны, у вас есть несколько вариантов. Возможно, вы могли бы изменить эту логику, чтобы найти данные, которые идут в список футболок, и посмотреть, есть ли какие-либо существующие футболки с этим цветом, а затем предложить пользователю сказать: «Вы деактивировали красный цвет, но у вас есть Красные футболки, что ты хочешь делать?» Вы можете остановить деактивацию Red, изменить футболки или удалить футболки.

Если недопустимые цвета поступают из источника, который вы не контролируете, вы можете подсказать пользователю, когда он попытается просмотреть список футболок: «Красный больше не является допустимым цветом для футболок, что нам делать с красные футболки?»

У нас есть подобное ограничение в нашем приложении. Мы отказались от полей со списком и вместо этого используем CellValidating.

person JJO    schedule 01.05.2009
comment
Спасибо за ответ. Подправляя ваш пример, мы отслеживаем цвет рубашки и цвет пижамы за последние X дней. Несколько цветов могут быть удалены/сделаны недействительными одновременно. В настоящее время мы просто сбрасываем список в невыбранное состояние с возможностью выбора только допустимых значений. Проблема в том, что пользователь больше не знает, КАКОЙ цвет был одет в определенные дни (тогда как, если бы мы могли показать неверные записи, они могли бы увидеть, что они носили красное на 6-й день и синее на 12-й день), хотя красный и синий больше не действительны. - person BrianH; 05.05.2009
comment
Исторический аспект этого очень интересен. Это часть вашей бизнес-логики? Если да, то вы же не хотите, чтобы они изменили историю, верно? Итак, перед вами стоит очень сложная задача. Честно говоря, я думаю, что проблема была бы лучше решена с помощью пользовательского столбца. В идеале у вас должен быть доступ к истории на определенную дату. Затем, когда отображается поле со списком, вы можете отображать только те цвета, которые были активны в эту дату. Если у вас нет доступа к истории, даже не показывайте поле со списком, особенно если оно историческое. - person JJO; 06.05.2009
comment
Это не совсем история, это просто подходит для примера. Может быть, это рубашки, которые вы хотите носить до конца недели. Или план питания, но сейчас ты не можешь есть хлопья или блины, потому что молоко испортилось. Короче говоря: то, что когда-то было действительным, теперь удалено. Чтобы перепланировать новые варианты, в идеале вам нужно знать, какими были старые варианты, чтобы заменить их. Поскольку это для бизнес-приложения, вам нужно знать, что старое значение было A, поэтому вы можете заменить его на C, это другое старое значение было B, поэтому вы можете заменить его на D, за исключением 3-го экземпляра, где вы также должны хочу С. - person BrianH; 06.05.2009

Предположительно, ваш связанный источник данных для заполнения поля со списком доступен только для чтения. Если да, то почему бы просто временно не вставить недопустимое значение в базовый источник данных. Таким образом, он все еще будет отображаться. Вы можете добавить временный столбец, чтобы помечать недопустимые элементы и не позволять пользователю оставлять его выбранным, а затем удалять его, когда пользователь выходит из ячейки. Я никогда не делал этого с datagridview, но мы сделали что-то очень похожее с другой сторонней сеткой. Удачи!

person Community    schedule 17.09.2009