|
Программирование >> Привязка данных
Рис. 32.12. Отображение значения (None) Пользовательские столбцы создаются следующей функцией: private void SetupColumns(DataSet ds) DataGridViewTextBoxColumn forenameColumn = new forenameColumn.DataPropertyName = FirstName ; forenameColumn.HeaderText = Forename ; forenameColumn.ValueType = typeof(string); forenameColumn.Frozen = true; dataGridView.Columns.Add(forenameColumn); DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn surnameColumn = new DataGridViewTextBoxColumn(); surnameColumn.DataPropertyName = LastName ; surnameColumn.HeaderText = Surname ; surnameColumn.Frozen = true; surnameColumn.ValueType = typeof(string); dataGridView.Columns.Add(surnameColumn); DataGridViewImageColumn photoColumn = new DataGridViewImageColumn(); photoColumn.DataPropertyName = Photo ; photoColumn.Width = 100; photoColumn.HeaderText = Image ; photoColumn.ReadOnly = true; photoColumn.ImageLayout = DataGridViewImageCellLayout.Normal; dataGridView.Columns.Add(photoColumn); DataGridViewComboBoxColumn reportsToColumn reportsToColumn.HeaderText = Reports To ; reportsToColumn.DataSource = ds.Tables[ Managers ]; reportsToColumn.DisplayMember = Name ; reportsToColumn.ValueMember = EmployeeID ; reportsToColumn.DataPropertyName = ReportsTo ; dataGridView.Columns.Add(reportsToColumn); = new DataGridViewComboBoxColumn(); В этом примере раскрывающийся список (ComboBox) создается последним и использует в качестве источника данных таблицу Managers. Она содержит столбцы Name и EmployeeID и они присваиваются, соответственно, свойствам DisplayMember и ValueMember. Эти свойства определяют, откуда поступают данные для ComboBox. Свойство DataPropertyName устанавливается на столбец в главной таблице данных, к которой привязан раскрывающийся список - это обеспечивает начальное значение столбца, и если пользователь выберет в раскрывающемся списке другую позицию, то это значение будет обновлено. Единственное, с чем еще необходимо справиться в этом примере - корректная обработка null-значений при обновлении базы данных. В данный момент, если в раскрывающемся списке выбрать позицию (None) , он будет пытаться записать в базу null-значение. Это может вызвать исключение со стороны SQL Server, поскольку нарушает ограничение внешнего ключа для столбца ReportsTo. Чтобы преодолеть это, потребуется выполнить предварительную обработку данных перед отправкой их SQL Server, установив NULL в столбце ReportsTo для всех записей, где было значение 0. Привязка данных В предшествующих примерах использовались элементы управления DataGrid и DataGridView, которые составляют лишь небольшую часть из всех элементов управления .NET, применяемых для отображения данных. Процесс связывания элемента управления с источником данных называется привязкой данных (data binding). В библиотеке MFC (Microsoft Foundation Class) процесс связывания данных из переменных класса с набором элементов управления назывался DDX (Dialog Data Exchange - диалоговый обмен данными). Средства связывания данных с элементами управления, доступные в .NET, существенно проще в использовании и к тому же имеют более широкие возможности. Например, в .NET можно связать данные с большинством свойств элемента управления, а не только с отображаемым текстом. Можно также связывать данные в манере, подобной ASP.NET (см. главу 37). Простая привязка Элемент управления, поддерживающий простую привязку, обычно отображает одно значение за раз, как это делает текстовое поле или переключатель. В следующем примере показано, как связать столбец из DataSet с TextBox: DataSet ds = CreateDataSet(); textBox.DataBindings.Add( Text , ds , Products.ProductName ); После извлечения некоторых данных из таблицы Products и сохранения их в возвращаемом методом CreateDataSet() экземпляре DataSet вторая строка привязывает свойство Text элемента управления (textBox) к столбцу Products.ProductName. На рис. 32.13 показан результат привязки данных подобного рода. Текстовое поле отображает строку из базы данных. На рис. 32.14 демонстрируется использование инструмента SQL Server Management Studio для сверки содержимого таблицы Products с отображенным в текстовом поле значением столбца. Иметь на экране единственное текстовое поле без возможности прокрутки к следующей или предыдущей записи и без возможности обновления данных в базе не очень-то полезно. В следующем разделе мы рассмотрим более реалистичный пример, а также представим другие объекты, необходимые для того, чтобы привязка данных работала. Рис. 32.13. Пример привязки данных Рис. 32.14. Использование инструмента SQL Server Management Studio для целей верификации Объекты привязки данных На рис. 32.15 показана иерархия классов объектов, обеспечивающих привязку данных. В этом разделе мы рассмотрим классы BindingContext, CurrencyManager и PropertyManager пространства имен System.Windows.Forms и продемонстрируем, как они взаимодействуют с данными, привязанными к одному или более элементов управления формы. Объекты, используемые для привязки, выделены серым. В предыдущем примере свойство DataBindings элемента управления TextBox применялось для привязки столбца из DataSet к свойству Text элемента управления. Свойство DataBindings - это экземпляр коллекции ControlBindingsCollection, показанной на рис. 32.15: textBox1.DataBindings.Add( Text , ds, Products.ProductName ); Эта строка привязывает объект Binding к Control BindingsCollection. Object Binding BindingContext BindingManagerBase PropertyManager CurrencyManager MarshalByRefObject BaseCollection BindingCollection ControlBindingCollection Рис. 32.15. Иерархия классов объектов, обеспечивающих привязку данных BindingContext Каждая форма Windows Forms имеет свойство BindingContext. Кстати, класс Form унаследован от Control, в котором это свойство на самом деле определено, потому большинство элементов управления обладают этим свойством. Объект BindingContext включает коллекцию экземпляров BindingManagerBase (рис. 32.16). Эти экземпляры создаются и добавляются к объекту диспетчера привязки в момент связывания элемента управления с данными. BindingContext может включать несколько источников данных, помещенных в оболочку либо CurrencyManager, либо PropertyManager. Решение о том, какой именно класс использовать, основывается на самом источнике данных. Если источник данных включает список элементов, такой как DataTable, DataView, или же любой объект, реализующий интерфейс IList, применяется CurrencyManager. Объект CurrencyManager может поддерживать текущую позицию внутри источника данных. Если же источник данных возвращает только одно значение, в BindingContext помещается PropertyManager.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |