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

1 ... 7 8 9 [ 10 ]


public void Execute(object sender, EventArgs e)

Method.Invoke(Receiver, new object[] {} );

public readonly object Receiver; public readonly MethodInfo Method;

Данный класс просто предоставляет делегат EventHandler (метод Execute), который вызывает требуемый метод объекта-приемника. Этот пример обрабатывает два разных типа записей: записи из таблицы Customers и записи из таблицы Orders. Естественно, обработка опций для каждого из этих типов отличается. На рис. 32.25 показаны действия, доступные для записи Customer, а на рис. 32.26 - для записи Order.


Рис. 32.26. Действия, доступные для записи

Order

Получение выбранной записи

Последний элемент мозаики этого примера, который мы рассмотрим - как определить, какая запись из DataSet выбрана пользователем. Вы можете подумать, что это должно быть свойством DataGrid. Однако этот элемент управления в данном контексте недоступен. Информация о попадании, полученная в обработчике события MouseUp(), также может рассматриваться как средство обнаружения выбранной записи, но это помогает только при условии, что отображаются данные из единственной DataTable. Вспомним, как заполнялась экранная таблица:

dataGrid.SetDataBinding(ds, Customers );

Этот метод добавляет CurrencyManager к BindingContext, который представляет текущую DataTable в DataSet. Теперь DataGrid имеет два свойства - DataSource и DataMember, которые устанавливаются при вызове SetDataBinding(). DataSource в экземпляре ссылается на DataSet, а свойство DataMember ссылается на Customers.

Имея источник данных, член данных и контекст привязки формы, текущая запись может быть найдена с помощью следующего кода:

protected void dataGrid MouseUp(object sender, MouseEventArgs e)

Выполнить поверку попадания if(e.Button == MouseButtons.Right)

Найти строку, на которой щелкнул пользователь

DataGrid.HitTestInfo hti = dataGrid.HitTest(e.X, e.Y);

Проверить попадание в ячейку

if(hti.Type == DataGrid.HitTestType.Cell)

Найти DataRow, который соответствует ячейке, на которой щелкнул пользователь

После вызова dataGrid.HitTest() для вычисления места, на котором щелкнул пользователь, извлекается экземпляр BindingManagerBase:

BindingManagerBase bmb = this.BindingContext[dataGrid.DataSource,

dataGrid.DataMember];



Этот код использует DataSource и DataMember, принадлежащие DataGrid, для именования возвращаемого объекта. Все, что остается - найти запись, на которой щелкнул пользователь, и отобразить контекстное меню. Когда выполняется щелчок правой кнопкой мыши на записи, то обычно индикатор текущей записи не перемещается, однако это не хорошо. Указатель записи должен быть перемещен перед тем, как будет отображено всплывающее меню. Объект HitTestInfo включает номер записи, поэтому текущую позицию объекта BindingManagerBase можно изменить следующим образом:

bmb.Position = hti.Row;

Это изменяет индикатор ячейки и в то же время означает, что когда выполняется вызов в класс для получения Row, то возвращается текущая запись, а не та, что была выбрана перед этим:

DataRowView drv = bmb.Current as DataRowView; if(drv != null)

ContextDataRow ctx = drv.Row as ContextDataRow; if(ctx != null) ctx.PopupMenu(dataGrid,e.X,e.Y);

Поскольку DataGrid отображает элементы DataSet, объект Current внутри коллекции BindingManagerBase является DataRowView, что в предыдущем коде проверяется с помощью явного приведения. Если оно проходит успешно, то действительная строка, помещенная в оболочку DataRowView, может быть извлечена посредством еще одного приведения для проверки того, что это действительно ContextDataRow, после чего появится меню.

Обратите внимание, что в примере были созданы две таблицы - Customers и Orders, и между ними было определено отношение, так что когда пользователь щелкает на CustomerOrders, он видит отфильтрованный список заказов.

Когда пользователь выполняет щелчок, DataGrid изменяет DataMember с Customers на Customers.CustomerOrders; это обеспечивает то, что для показа извлекаемых данных используется правильный объект, определенный индексатором BindingContext.

Резюме

В настоящей главе были представлены некоторые методы отображения данных в классах .NET System.Windows.Forms, включая больше количество классов, которые можно исследовать самостоятельно. Также здесь использовались элементы управления DataGridView и DataGrid для отображения данных из множества разнообразных источников - таких как Array, DataTable или DataSet.

Поскольку не всегда нужно отображать данные в табличном виде, здесь также было рассмотрено, как связать столбец данных с отдельным элементом управления в пользовательском интерфейсе. Эти средства привязки .NET обеспечивают возможность легкой поддержки пользовательского интерфейса подобного рода, поскольку обычно она заключается всего лишь в привязке элемента управления к столбцу, а всю сложную работу выполняет .NET.

В следующей главе речь пойдет о выводе графики посредством GDI+.



1 ... 7 8 9 [ 10 ]

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