Программирование >>  Привязка данных 

1 2 3 [ 4 ] 5 6 7 ... 10


ставляет собой нечто более интересное. Этот интерфейс реализуют многие классы исполняющей системы. Среди них - Array, ArrayList и StringCollection.

Когда используется IList, в силе остается то же предупреждение относительно объектов, содержащихся в коллекции, которое было упомянуто ранее в примере с Array в качестве источника данных, а именно - если источником данных DataGrid служит StringCollection, то в визуальной таблице отображаются длины строк, а не их текст, как ожидалось.

Отображение обобщенных коллекций

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

Опять-таки, отображаемые столбцы основаны на свойствах объекта - все общедоступные читаемые поля отображаются в DataGridView. В следующем примере демонстрируется отображение списочного класса.

class PersonList : List < Person >

class Person

public Person( string name, Sex sex, DateTime dob )

name = name; sex = sex;

dateOfBirth = dob;

public string Name

get { return name; } set { name = value; }

public Sex Sex

get { return sex; } set { sex = value; }

public DateTime DateOfBirth

get { return dateOfBirth; } set { dateOfBirth = value; }

private string name; private Sex sex; private DateTime dateOfBirth;

enum Sex

Male,

Female

Экран показывает несколько экземпляров класса Person, которые сконструированы внутри класса PersonList (рис. 32.10).




Рис. 32.10. Экземпляры класса Person

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

[Browsable(false)] public bool IsEmployed

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

Любые изменения, проведенные в визуальной таблице, отображаются на лежащий в основе объект - поэтому например, если в предыдущем коде имя персоны изменится в пользовательском интерфейсе, будет вызван set-метод данного свойства.

Иерархия классов DataGridView

Иерархия классов основных частей элемента управления DataGridView показана

на рис. 32.11.

Object

MarshalByRefObject

Ч ComponentModel.Component

Windows.Forms.Control

Ц Windows.Forms.DataGridView

1 Windows.Forms.DataGridViewElement -I-

Рис. 32.11.

Иерархия классов основных частей элемента управленияDataGridView

Windows.Forms.DataGridViewBand ~~ Windows.Forms.DataGridViewColumn

~[ Windows.Forms.DataGridViewButtonColumn

Windows.Forms.DataGridViewCheckBoxColumn

Windows.Forms.DataGridViewComboBoxColumn

Windows.Forms.DataGridViewImageColumn

Windows.Forms.DataGridViewLinkColumn

Windows.Forms.DataGridViewTextBoxColumn

JWindows.Forms.DataGridViewCell



Элемент управления при отображении данных использует объекты, унаследованные от DataGridViewColumn - и как можно видеть на рис. 32.11, теперь доступно намного больше опций отображения данных, чем было раньше в оригинальном DataGrid. Основной недостаток DataGrid - отсутствие возможности отображения столбцов с раскрывающимися списками - теперь эта функциональность реализована в DataGridView в виде DataGridViewComboBoxColumn.

Когда указывается источник данных для DataGridView, по умолчанию он конструирует свои столбцы автоматически. Столбцы создаются на основе типов данных источника, поэтому, например, любое поле булевского типа отображается на DataGridViewCheckBoxColumn. Если вы предпочитаете создавать столбцы самостоятельно, то для этого можно установить значение false свойству AutoGenerateColumns и сконструировать столбцы самостоятельно.

В следующем примере показано, как можно определить столбцы с включением в них графических изображений, а также столбцы с раскрывающимися списками. Код использует DataSet и извлекает данные в два объекта DataTable. Первая таблица DataTable содержит информацию о наемных работниках из базы данных Northwind. Вторая таблица состоит из столбца EmployID и сгенерированного столбца Name, используемого при отображении раскрывающегося списка.

using (SqlConnection con = new SqlConnection (

ConfigurationSettings.ConnectionStrings[ northwind ].ConnectionString ) )

string select = SELECT EmployeeID, FirstName, LastName, Photo,

IsNull(ReportsTo,0) as ReportsTo FROM Employees ; SqlDataAdapter da = new SqlDataAdapter(select, con); DataSet ds = new DataSet();

da.Fill(ds, Employees );

select = SELECT EmployeeID, FirstName + + LastName as Name

FROM Employees UNION SELECT 0,(None) ; da = new SqlDataAdapter(select, con); da.Fill(ds, Managers );

Сконструировать столбце! для табличного экранного представления SetupColumns(ds); Высота строки по умолчанию dataGridView.RowTemplate.Height = 10 0;

Настроить источник данных dataGridView.AutoGenerateColumns = false; dataGridView.DataSource = ds.Tables[ Employees ];

Здесь следует отметить две вещи. Первое - оператор select заменяет значения NULL в столбце ReportsTo нулевыми значениями. В базе данных есть одна запись, содержащая в этом поле NULL, что говорит о том, что данный сотрудник не имеет руководителя. Однако когда данные связываются, ComboBox требует значения в этом столбце, иначе при отображении таблицы будет возбуждено исключение. В данном примере выбрано значение ноль, потому что оно отсутствует в таблице - обычно это называется сигнальнсм значением, поскольку имеет в приложении специальный смысл.

Вторая конструкция SQL извлекает данные для ComboBox и включает искусственную строку со значениями Zero и (None). На рис. 32.12 вторая строка отображает значение (None) .



1 2 3 [ 4 ] 5 6 7 ... 10

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика