О RowWrapperDescriptor Марка Грэйвелла для привязки System.Data.Rows к PropertyGrid - PullRequest
0 голосов
/ 13 февраля 2010

Я сталкивался Марк Гравелл х элегантное и остроумное решение к проблеме, опубликованной Мэттом (название " C # / winforms" : как лучше связать таблицу свойств и System.Data.DataRow ") и использовать одно и то же решение в одном из моих приложений.

Используя некоторые выдержки из кода Марка:

    DataTable table = new DataTable();
    table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Foo", typeof(int));
    table.Columns.Add("Bar", typeof(string));
    table.Columns.Add("Audit", typeof(DateTime));

    table.Rows.Add(1, 14, "abc", DateTime.MinValue);
    DataRow row = table.Rows.Add(2,13,"def", DateTime.MinValue);
    table.Rows.Add(3, 24, "ghi", DateTime.MinValue);

    RowWrapper wrapper = new RowWrapper(row);
    wrapper.Exclude.Add("ID");
    wrapper.Exclude.Add("Bar");

Мне удалось как-то заставить эту работу работать с DataGridView; DataGridView использует таблицу в качестве источника, в то время как каждый щелчок по строке в DataGridView будет установлен как SelectedObject для propertyGrid1 (с использованием RowWrapper Марка), и он работает отлично. Вы можете спросить, почему я это делаю, то есть использовать DataGridView и PropertyGrid; Дело в том, что бизнес-требования и ограниченные политики управления.

Во всяком случае, теперь у меня есть еще одна дилемна; один из столбцов таблицы, например, «Foo» (который, кстати, отображается в PropertyGrid как одно из полей), должен быть своего рода выпадающим списком в PropertyGrid. Я имею в виду, что «Foo» должен быть списком, содержащим список элементов, полученных из другой DataTable. Кроме того, есть ли способ включить какое-то описание для каждого элемента поля?

Может ли это быть сделано? Марк Гравелл упомянул что-то вроде ". Обратите внимание, что вы можете сделать другие вещи в этой области, чтобы сделать некоторые свойства недоступными для редактирования (IsReadOnly), или иметь другой заголовок (DisplayName) или категорию (Category) - переопределив другие члены в RowWrapperDescriptor."как заключительная заметка к его сообщению, и мне было интересно, есть ли способ сделать это.

Любой теоретический совет очень ценится. Большое спасибо.

1 Ответ

0 голосов
/ 15 февраля 2010

Спасибо за ответ, Марк ...

Это так; при условии, что наше бизнес-требование имеет следующую настройку DataTable:

DataTable table = new DataTable();

table.Columns.Add("ID", typeof(int));
table.Columns.Add("MedSequence", typeof(int));
table.Columns.Add("Prognosis", typeof(string));
table.Columns.Add("RBC", typeof(string));
table.Columns.Add("WBC", typeof(string));
table.Columns.Add("BP Normal", typeof(bool);
table.Columns.Add("Histology", typeof(string));

DataRow row = table.Rows.Add(559,6845,"Progressive decline","54–62pcnt","6.1 million/uL",true,"Haematoxylin");

Я установил источник данных dataGridView1 как «таблица», в то время как при каждом щелчке содержимого ячейки для просмотра данных, свойство SelectedObject свойстваGrid1 устанавливается равным «текущей» выбранной строке в dataGridView. В некотором смысле требовалось, чтобы dataGridView1 отображал только 2 столбца: MedSequence и Prognosis, а остальные столбцы таблицы DataTable невидимы для пользователя.

Однако propertyGrid1 должен показывать ВСЕ столбцы в таблице как свойства. Следовательно, предполагаемый эффект был для DataGridView просто как средство для отображения (столбцов MedSequence и Prognosis), в то время как редактирование других значений таблицы обрабатывается propertyGrid1.

Как я уже говорил в своем посте, на данный момент, используя ваш класс RowWrapper, он работает отлично. Однако для одного из столбцов таблицы «Гистология» propertyGrid1 должен отображать редактируемый раскрывающийся список, который содержит следующий список: {«Гематоксилин», «Эозин», «Толуидин синий», «Периодическая кислота-пятно Шиффа» }. По сути, руководство задумывалось о том, чтобы этот выпадающий список заполнялся значениями, запрашиваемыми из базы данных (вероятно, это то, что мы будем делать), но в основном моя проблема заключается в том, чтобы поле «Гистология» в propertyGrid1 стало выпадающим. вниз список. Поскольку propertyGrid1 использует оболочку для своих полей, полученных из столбцов таблицы данных, я не знаю, что делать.

Даже если бы я изменил столбец DataGridView для гистологии на раскрывающийся список, он все равно не работал бы, поскольку, как я уже сказал, будут отображаться только 2 столбца таблицы (MedSequence и Prognosis), тогда как все остальные доступны для редактирования. только через propertyGrid1, причем гистология является особым случаем, поскольку она должна отображаться в раскрывающемся списке значений в propertyGrid1.

...