Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Связывание, просмотр и фильтрация данных
8 февраля 2009

Возможность просмотра данных жизненно важна для многих приложений. Связы-
вание данных позволяет ассоциировать записи источника данных с элементами
управления формы для просмотра и модификации этих данных. На этом занятии
вы научитесь применять ADO.NET для связывания элементов управления с дан-
ными, управлять передачей данных в приложении, а также создавать с помощью
класса Data View представления для объектов DataTabies, поддерживающие фильт-
рацию и сортировку, и узнаете, как управлять несколькими объектами DataView с
помощью одного объекта DataViewManager.
Изучив материал этого занятия, вы сможете:
^ описать роль провайдера данных;
^ описать роль потребителя данных;
^ связать свойство объекта-потребителя данных с провайдером данных;
•/ управлять потоком данных в приложении Windows Forms;
^ осуществлять фильтрацию и сортировку данных с помощью компонента
Data View;
S описать роль класса DataView Manager и рассказать, как его применяют.
Продолжительность занятия - около 45 минут.
Связывание данных
Связыванием данных называется создание связи между двумя объектами — провай-
дером и потребителем данных. Провайдер — это источник данных, связанный с
объектом-потребителем данных, который получает данные, после чего обрабатыва-
ет либо отображает их. Типичный пример связывания данных — элемент управле-
ния TextBox, связанный с источником данных. Он отображает значение некоторого
поля в текущей строке источника данных, к которому привязан. При модификации
этого поля отображаемое элементом управления значение также изменится.
Провайдеры данных
Провайдер данных участвует в связывании, предоставляя значения для связанных с
ним свойств и элементов управления.
Примечание В данном контексте термин «.провайдер данных» обозначает не много-
компонентный провайдер ADO.NET, применяемый для доступа к отсоединенным
данным, а вообще любой объект, с которым может быть связан другой объект-
потребитель данных,,
В .NЕТ Framework провайдерами данных могут быть любые объекты, в которых
реализован интерфейс IList, то есть не только объекты ADO.NET, такие, как DataSet,
DataTable и DataColumn, но и другие, например массивы и наборы. Объект DataView,
о котором пойдет речь далее, является настраиваемым представлением данных и
способен быть их провайдером.
Другая функция провайдеров — управление потоком данных. В прежних техно-
логиях доступа к данным для управления потоком данных применялись курсоры.
При перемещении курсора на другую запись выполнялось обновление связанных
элементов управления. Поскольку ADO.NET основана на доступе к отсоединен-
ным данным, концепция курсора в ней отсутствует как таковая. Теперь с каждым
источником данных связан объект Currency Manager, который следит за положени-
ем текущей записи. Управление объектами Currency Manager осуществляется с по-
мощью объекта BindingContexl формы. Подробно управление потоком данных опи-
сано далее.
Потребители данных
Потребитель данных — это элемент управления, свойства которого привязаны к
источнику данных. В .NET Framework с источником данных можно связать любое
доступное в период выполнения свойство любого элемента управления. Например,
свойство Size — с записью БД, каталогом или другим свойством элемента управле-
ния, доступным в период выполнения.
Связывание данных применяется очень широко. Типичный пример использо-
вания связывания данных — формы для ввода данных, содержащие элементы упра-
вления (TextBox, Checkbox, LisiBoxtt т.д.), связанные с соответствующими полями
объекта DataSet. Новые записи можно ввести вручную через соответствующие эле-
менты управления формы. Готовая запись добавляется к объекту DataSet, который
используется для обновления БД.
Выделяют два вида связывания данных — простое и сложное. В простом задей-
ствовано только одно поле источника данных, последовательно предоставляющее
значения связанному с ним компоненту. Например, элемент управления Label мож-
но связать с полем объекта DataTable, чтобы он отображал текущее значение поля,
с которым связан. Сложное связывание позволяет связать несколько записей с од-
ним элементом управления. Так, элементы управления ListBox и ComboBox можно
связать с полем объекта DataTable или Data View— они будут отображать во время
выполнения все значения этого поля, а не только текущее. Обычно сложное связы-
вание применяют для создания элементов управления, отображающих набор зна-
чений и позволяющих выбрать определенные строки данных. Такие элементы упра-
вления, как DataGrid, поддерживают еще более сложный вид связывания: их можно
связать со всеми значениями объекта DataTable, DataView или даже DataSet.
Создание элемента управления, использующего простое связывание данных
Свойство DataBindings позволяет создать элементы управления, применяющие про-
стое связывание данных. Это свойство является экземпляром класса Control Bindings-
Collection, который следит за связыванием элементов управления с источником дан-
ных и управляет им. В период разработки свойство DataBindings отображается и окне
Properties в виде отдельного узла. Раскрыв его, вы получите доступ к списку свойств,
которые чаще всего связывают с данными (рис. 6-5).
Чтобы связать такое свойство с источником данных, щелкните поле рядом с
именем свойства — откроется список доступных провайдеров данных, где объекты
DataSet отображаются в виде узлов. Раскрыв такой узел, вы получите список досту-
пных объектов DataTable, там же перечислены объекты DataView. А раскрыи узел
объекта DataView— список полей источника данных. Найдите в нем нужный стол-
бец и выберите его — вы создадите связь между выбранным полем и данным свой-
ством элемента управления.
Так можно связать с источником данных любое свойство элемента управления.
Чтобы связать с данными свойство, отсутствующее в списке DataBindings, щелкни-
те поле (Advanced) под узлом DataBindings, затем щелкните кнопку (...), чтобы от-
крыть диалоговое окно Advanced Data Binding.
В нем отображается полный список свойств элемента управления, доступных в
период выполнения: выбрав здесь нужное поле, вы свяжете его с определенным
свойством элемента управления.
Ь> Связывание данных в период разработки
1. В окне Properties раскройте узел DataBindings.
2. Если нужное свойство присутствует в списке узла, выберите в раскрывающемся
списке соответствующее поле.
Если нужное свойство отсутствует в списке узла, щелкните кнопку (...) рядом с
полем (Advanced), чтобы вызвать диалоговое окно Advanced Data Binding; ука-
жите нужное свойство, затем выберите в списке рядом с его именем поле, кото-
рое вы хотите связать с этим свойством.
Связывание данных в период выполнения
Часто в период выполнения требуется модифицировать источник данных, с кото-
рым связан некоторый элемент управления. Также возможна ситуация, когда ис-
точник данных, с которым будет связан элемент управления, не известен в период
разработки. Наконец, иногда необходимо связать элемент управления с массивом
или набором, экземпляр которого разрешается создавать только в период выполне-
ния. В этих случаях следует выполнять связывание данных программными сред-
ствами- Для этого воспользуйтесь свойством DataBindings элемента управления,
которое является экземпляром класса Control Bindings Collection, Установив соответ-
ствуюший член набора DataBindings, вы сможете добавить, удалить или сбросить
сведения о связанном источнике данных в период выполнения.
Для связывания свойств с источником данных служит метод DataBindings.Add.
При вызове этого метода создается связь с источником данных и добавляется к на-
бору DataBindings, Метод Add принимает три параметра: имя свойства (типа String),
которое нужно связать с данными, источник данных (объект) и имя члена объекта
источника данных, с которым связывают это свойство. Следующий пример демон-
стрирует связывание свойства Text элемента управления TextBox с полем Customer!
D таблицы Customers, хранимой в объекте DataSet с именем DataSetl:
Visual Basic .NET
TextBox1.DataBindings.Add("Text", DataSetl.Customers, "CustomerlD")
Visual C#
TextBoxl.DataBindings.Add("Text", DataSetl.Customers, "CustomerlD");
В некоторых случаях необходимо связать объекты, имеющие только один член
данных, такой, как наборы и массивы — при этом в третьем параметре необходимо
передать пустую строку. Именно так, например, связывают свойство элемента упра-
вления с массивом:
Visual Basic .NET
Dim myStrings(3) As String
myStrings(Q) = "A"
myStrings(l) = "String"
myStrings(2) = "Array"
TextBoxl.DataBindings.Add("Text", myStrings, "")
Visual C#
String[] myStrings = new String[3];
myStrings[0] = "A";
myStrings[1] = "String";
myStrings[2] = "Array";
TextBox1.DataBindings.Add("Text", myStrings, "");
Чтобы удалить связь с источником данных из элемента управления, вызовите
метод DataBindings, Remove. Этот метод принимает в качестве параметра объект
Binding, который получают из свойства DataBindings. Следующий пример показыва-
ет, как удалить сведения об источнике данных, связанном со свойством Text объек-
та Label:
Visual Basic .NET
Label"!. DataBindings.Remove{Label!. DataBindings("Text"})
Visual C#
Label!. DataBindings. Remove( Label"!. DataBindings[ "Text" ]);
Вызвав метод DataBindings.Clear, вы удалите все связи с источниками данных у
элемента управления:
Visual Basic .NET
Label!.DataBindings.Clear()
Visual C#
Label!.DataBindings.Clear();
Управление потоком данных
Управление просмотром записей и обновлением элементов управления, связанных
с данными, осуществляется на уровне источника данных при помощи объекта
Currency Manager.
Примечание В этом случае источник данных ссылается на одно- или двухмерное
хранилище данных, такое, как объект DataTable, DataView, массив или набор.
Объект DataSet, содержащий несколько объектов DataTable, способен поддерживать
несколько источников данных.
Объект Currency Manager «следит» за положением текущей записи в источнике
данных. Приложение может использовать несколько источников данных одновре-
менно, при этом каждый из них поддерживает собственный объект Currency Manager.
Поскольку форма способна отображать содержимое нескольких источников дан-
ных одновременно, любая форма управляет связанными с ними объектами Currency
Manager посредством главного объекта — BindingContext. Этот объект упорядо-
чивает объекты Currency Manager, связанные со всеми источниками данных, и пре-
доставляет к ним доступ. Так, свойство BindingContext формы позволяет управлять
положением текущей записи в любом источнике данных. Чтобы получить доступ к
объекту Currency Manager для некоторого источника данных, вызовите свойство
BindingContext, передав ссылку на объект этого источника данных, например:
Visual Basic .NET
Me.BindingContext(DataSet!.Customers)
Visual C#
this.BindingContext[DataSet1.Customers]
Для перемещения между записями устанавливают свойство Position соответству-
ющего объекта BindingContext, как показано ниже:
Visual Basic .NET
Этот пример предполагает наличие таблицы Customers в
объекте Dataset с именем DataSetl, содержащимся в текущей форме.
Сделать первую запись источника данных текущей.
Me. BindingContext(DataSet1.Customers).Position = О
Переместить текущую записи на одну позицию вперед,
Me.BindingContext(DataSet1.Customers).Position += 1
Переместить текущую запись на одну позицию назад,
Me.BindingContext(DataSet1.Customers).Position -= 1
Сделать пятую запись источника данных текущей.
Me.BindingContext(DataSet1.Customers).Position = 4
Перейти к последней записи.
Me.8indingContext(DataSet1.Customers). Position -
DataSetl.TablesC'Custorners").Rows.Count - 1
Visual C#
// Этот пример предполагает наличие таблицы Customers в
// объекте Dataset с именем DataSetl, содержащимся в текущей форме.
// Сделать первую запись источника данных текущей,
this.BindingContext[DataSet1.Customers].Position = 0;
// Переместить текущую записи на одну позицию вперед,
this.BindingContext[DataSetl.Customers].Position ++;
// Переместить текущую запись на одну позицию назад,
this.BindingContext[DataSetl.Customers].Position —;
// Сделать пятую запись источника данных текущей,
this. BindingContext[DataSet1.Customers].Position - 4;
// Перейти к последней записи,
this.BindingContext[DataSet1.Customers].Position =
DataSetl.Tables["Customers"].Rows.Count - 1;
> Перемещение по записям источника данных, связанного с формой
Чтобы перейти к заданной записи, установите свойство Position соответствующего
члена объекта BindingContext.
Поскольку в .NET Framework значение свойства Position не может быть меньше
нуля или больше верхней границы набора, при попытке выбрать запись за переде-
лами источника данных ошибка не возникает — такая команда попросту игнориру-
ется. Тем не менее следует добавить к приложению кол, уведомляющий пользова-
телей (возможно, посредством сообшений) о достижении границ источника дан-
ных. Следующий пример демонстрирует применение событий Position Changed объ-
екта CurrencyManager для деактивации кнопок перехода между записями по дости-
жении границ источника данных. Как и в предыдущем примере, доступ к объекту
CurrencyManager здесь осуществляется через свойство BindingContext объекта Form.
Visual Basic .NET
1 Объявить обработчик события PositionChanged.
Public Sub OnPositionChanged(ByVal sender As Object, ByVal e As __
System.EventArgs)
1 Проверить, не установлен ли CurrencyManager на первую запись.
If Me.BindingContext(DataSet1, "Customers").Position = 0 Then
' Если да, деактивировать кнопку перехода на одну запись назад,
BackButton.Enabled = False
Else1
в противном случае - активировать эту кнопку.
BackButton.Enabled = True
End If
' Проверить, не установлен ли объект CurrencyManager на последнюю запись.
If Me.BindingContext(DataSet1.Customers).Position =
DataSet1.Tables("Customers"),Rows.Count -1 Then
' Если да, деактивировать кнопку перехода на одну запись вперед,
ForvjardButton. Enabled = False
Else
в противном случае - активировать эту кнопку.
ForwardButton.Enabled = True
End If
End Sub
1 He забудьте подключить событие к его обработчику. Для этого
' поместите в конструктор объекта Form следующую строку.
AddHandler Me.BindingContext(DataSet1.Customers).PositionChanged,
AddressOf Me.OnPositionChanged
Visual C#
// Объявить обработчик события PositionChanged.
public void OnPosit'.onChanged(object sender, System. EventArgs e)
I
// Проверить, не установлен ли CurrencyManager на первую запись.
if (this.BindingContext[DataSet1.Customers].Position == 0)
// Если да, деактивировать кнопку перехода на одну запись назад,
BackButton.Enabled = false;
else
// в противном случае - активировать эту кнопку.
BackButton.Enabled = true;
// Проверить, не установлен ли объект CurrencyManager на последнюю запись,
if (this.BindingContext[DataSet1.Customers].Position ==
DataSetl.Tables["Customers"].Rows.Count -1)
// Если да, деактивировать кнопку перехода на одну запись вперед.
ForwardButton.Enabled = false;
else
// в противном случае - активировать эту кнопку.
ForwardButton. Enabled = true;
// He забудьте подключить событие к его обработчику. Для этого
// поместите в конструктор объекта Form следующую строку,
this. BindingContext[DataSet1. Customers]. PositionChanged += new
EventHandler(this.OnPositionChanged):
Сложное связывание данных
Ряд элементов управления, таких, как ListBox, СотЬоВохмли DataGrid, разрешается
связать с несколькими записями одновременно, Такое связывание назынается
сложным, а элементы управления, использующие сложное связывание, обычно при-
меняют для отображения нескольких доступных для выбора записей. Чтобы создать
элемент управления, использующий сложное связывание, установите свойство
DalaSource элемента управления, поддерживающего такой тип связывания:
Visual Basic .NET
DataGricll.DataSource = DataSetl .Customers
Visual C#
DataGrid"!. DataSource = DataSetl. Customers;
В период разработки это можно сделать, установив значение свойства DataSource
в окне Properties.
Такие элементы управления, как ListBox, Checked List Box и ComboBox, способны
отображать несколько записей одновременно, их можно привязать не более чем к
одному полю. Для этих элементов управления необходимо записать в свойство
Display Member значение типа String, представляющее имя поля, с которым нужно
связать это свойство, например:
Visual Basic .NET
ComboBoxl. DataSource = DataSetl. Customers
ComboBoxl.DisplayMember - "CustomerlD"
Visual C#
ComboBoxl. DataSource = DataSetl .Customers;
ComboBoxl.DisplayMember = "CustomerlD";
Фильтрация и сортировка данных
После заполнения объекта DataSet обычно работают с подмножеством его данных,
загруженных в память; такое подмножество выделяют при помощи объекта Data-
View. Можно сказать, что этот объект выступает в роли фильтра для объекта Data-
Table, выбирающего из объекта DataTable некоторые данные и предоставляющего
их элементам управления, связанным с этим объектом DataTable. Объект DaiaView
поддерживает методы для сортировки и фильтрации данных, а также позволяет об-
новлять представляемый им объект DataTable.
Создание объектов DataView
Чтобы создать объект DataView, необходимо передать ссылку на объект DataTable,
для которого он будет выполнять фильтрацию содержимого, например:
Visual Basic .NET
Dim myDataView As New DataView(myDataTable)
Visual C#
DataView myDataView = new DataView{myDataTable);
Показанный код создает объект DataView, представляющий данные объекта
myDataTable. Чтобы задать критерии фильтрации и/или упорядочения данных, сле-
дует установить соответствующие свойства объекта DataView. Можно создать объект
DataView, не связанный с объектом DataTable, но в этом случае DataView остается
недоступен для связывания, пока вы не установите его свойство Table. Это делается
так:
Visual Basic .NET
Dim myDataView As New DataView()
myDataView.Table - myDataTable
Visual C#
DataView myDataView = new DataViewO;
myDataView.Table = myDataTable;
Создать объект DataView и связать его с элементами управления допустимо и в
период разработки. Для этого перетащите объект DataView с вкладки Data панели
Toolbox в окно дизайнера и установите значение его свойства Table через окно
Properties. Далее, чтобы связать созданный объект DataView, достаточно установить
свойство DataBindings (также через окно Properties).
Фильтрация и сортировка содержимого DataSet
Объекты DataView позволяют выполнять фильтрацию и сортировку данных, кото-
рые они представляют, при этом критерии фильтрации и сортировки разрешается
изменять в период выполнения. При изменении критериев фильтрации или упоря-
дочения объекта DataView обновляются все связанные с ним элементы управления.
Чтобы упорядочить данные, установите свойство Sort, записав в него строку, ин-
терпретируемую как определение правил сортировки данных. Зачастую такая стро-
ка содержит имя поля, по которому выполняется сортировка. Вот пример:
Visual Basic .NET
myDataView.Sort = "CustomerlD"
Visual C#
myDataView.Sort = "CustomerlD";
Чтобы задать упорядочение по нескольким полям, разделите их имена запяты-
ми, например:
Visual Basic .NET
myDataView.Sort = "State. City"
Visual C#
nyDataView.Sort = "State, City";
По умолчанию строки упорядочиваются по возрастанию. Чтобы упорядочить
поле по убыванию, добавьте к нему ключевое слово DESC:
Visual Basic .NET
В этом примере строки упорядочиваются, прежде всего, по убыванию
значения поля State. Далее выполняется сортировка по возрастанию
значения поля City, поскольку это задано по умолчанию.
niyDataView.Sort = "State DESC, City"
Visual C#
// В этом примере строки упорядочиваются, прежде всего, по убыванию
// значения поля State. Далее выполняется сортировка по возрастанию
// значения поля City, поскольку это задано по умолчанию.
TiyDataView.Sort = "State DESC, City";
Чтобы задать критерий фильтрации данных, запишите в свойство RowFiller стро-
ку, интерпретируемую как выражение, которое определяет подмножество записей.
Например, можно выбрать только строки с заданным значением в некотором поле:
Visual Basic .NET
myDataView.flowFilter = "City - 'Seattle'"
Visual C#
rnyDataView.RowFilter = "City = 'Seattle'";
Выражения, записываемые в Row Filter, должны подчиняться синтаксису SQL:
строковые литералы необходимо заключать в одинарные кавычки, а даты — между
символов «#».
Для более сложных выражений применяют логические операторы AND, OR и
NOT:
Visual Basic .NET
myDataView.RowFilter =
rnyDataView. RowFilter =
myDataView.RowFilter -
Visual C#
myDataView.RowFilter -
myDataView.RowFilter =
nyDataView.RowFilter =
"City = 'Seattle' AND State = TWA'"
"City = 'Seattle' OR State = 'WA'"
"City = 'Des Moines' AND (NOT State = *1A')
"City = 'Seattle' AND State = 'WA'";
"City = 'Seattle' OR State = 'WA'";
"City = 'Des Moines' AND (NOT State - 'IA')
Допускаются также арифметические операторы, конкатенация и операторы
сравнения:
Visual Basic .NET
myDataView.RowFilter = "Length >= 10 AND Height < 4"
myDataView.RowFilter = "CityState = City + ' W A ' "
myDataView.RowFilter = "Price * 1.086 <= 500"
Visual C#
myDataView.RowFilter = "Length >= 10 AND Height < 4";
myDataView.RowFilter = "CityState = City + ' W A ' 1 ' ;
myDataView.RowFilter = "Price * 1.086 <= 500";
Операторы IN и LIKE служат для поиска заданных строк:
Visual Basic .NET
myDataView.RowFilter = "City IN ('Seattle1, 'Tacoma', Blaine')"
' Символ "*" является знаком подстановки при сравнении строк. Он заменяет
1 любой одиночный символ, а "%" заменяет любую группу символов.
myDataView.RowFilter = "City LIKE 'Se*t%e'"
Visual C#
rryDataView.RowFilter = "City IN('Seattle1, 'Tacoma1, Blaine')";
// Символ "*" является знаком подстановки при сравнении строк. Он заменяет
// любой одиночный символ, а "%" заменяет любую группу символов.
rnyDataView.RowFilte^ - "City LIKE 'Se*t%e'";
Свойство DataVtew.RowState также позволяет выполнять фильтрацию объектов
DataRow на основе их состояния; возможные значения этого свойства перечислены
в таблице 6-5.
Таблица 6-5. Значения свойства RowState
Значение Описании
Unchanged Отображает немодифицированные строки
Added Отображает строки, добавленные со времени последнего обновления
DataSet
Deleted Отображает строки, удаленные со времени последнего обновления
DataSet
OriginalRows Отображает исходные версии строк, включая немодифицированные
и удаленные
CurrentRows Отображает все текущие строки, включая добавленные, измененные
и не модифицированные
ModifiedCurrent Отображает текущую модифицированную версию исходных данных
Modified Original Отображает исходную версию (если данные модифицированы,
является эквивалентом ModifiedCurrent)
У этого свойства может быть несколько значений одновременно, Например, ус-
тановив его в Added и Deleted, вы получите только добавленные и удаленные строки.
Модификация данных через объект DataView
Объект DataView поддерживает три свойства, разрешающие или запрещающие мо-
дификацию данных, которые он представляет (таблица 6-6).
Таблица 6-6. Свойства класса DataView, связанные с модификацией данных
Свойство Описание
AllowDetete Если это свойство установлено в True (true), Data View позволяет удалять
строки из представляемого им объекта DataTable
AllowEdit Если это свойство установлено в True (true), посредством DataView вы
сможете модифицировать строки представленного им объекта DataTable
AllowNew Если это свойство установлено в True (true), объект DalaView позволяет
добавлять строки к представленному им объекту DataTable
По умолчанию DataView позволяет произвольно модифицировать объект Data-
Table, который он представляет. Чтобы получить объект DataView, доступный толь-
ко для чтения, либо запретить удаление или вставку строк, установите соответству-
ющие свойства в false.

Теги: .NET

Статьи по теме:

Генерация исключений
Декларативная защита, основанная на ролях
События жизненного цикла формы
Ресурсы и ресурсные сборки
Карринг (currying)
Проверка на уровне формы
Активация и деактивация команд меню
Стыковка и фиксация элементов управления
Извлечение типизированных данных с помощью объекта DataReader
Анти-паттерны в действии или Самые популярные ошибки программистов
Настройка трассировочных переключателей
Модификаторы доступа к типам
Оптимизация средствами компилятора
Извлечение и обновление данных с помощью объектов DataAdapter и DataSet
Модификаторы доступа для вложенных типов
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Связывание, просмотр и фильтрация данных. Регион сайта: Москва и Санкт-Петербург