Механизм привязки данных (DataBinding), страница 15

Последние две строки являют пример явного вызова обработчика события CurrentChanged синхронизатора позиций customersSource (он имеет тип BindingSource). Мы хотим программным способом выделить первую строку таблицы (Position = 0) и запустить цепь событий, происходящих в обработчике customersSource_CurrentChanged. Самого обработчика еще нет, но мы вскоре создадим его. Сейчас важно понять, что при выделении строки в таблице клиентов надо обратиться к Web-сервису и запросить его заказы.

Рассмотрим код метода SetBinding. Он должен включить механизм привязки данных (DataBinding) и настроить синхронизацию элементов формы с текущей строкой таблицы клиентов (в памяти), а значит и с выбранной строкой в DataGridView слева. Синхронизаторы позиций типа BindingSource хорошо работают для DataGridView. Мы также создадим и настроим их внутри метода SetBinding.

Для успеха в этом мероприятии вам надо найти (в папке курса) файл с таблицей клиентов Customers.xml и поместить его в папку Data текущего проекта. Не спутайте ее с папкой другого проекта, там тоже есть папка Data, но в нее вы уже положили файл с таблицей заказов.

private void SetBinding ()

{

ds = new DataSet();

ds.ReadXml("../../Data/Customers.xml");

customersSource = new BindingSource();

customersSource.DataSource = ds;

customersSource.DataMember = "Customers";

customersSource.CurrentChanged += new EventHandler(customersSource_CurrentChanged);

ordersSource = new BindingSource();

ordersSource.DataMember = "Orders";

tCustomerID.DataBindings.Add("Text", customersSource, "CustomerID", true);

tAddress.DataBindings.Add("Text", customersSource, "Address", true);

tCity.DataBindings.Add("Text", customersSource, "City", true);

tRegion.DataBindings.Add("Text", customersSource, "Region", true);

tPostalCode.DataBindings.Add("Text", customersSource, "PostalCode", true);

tCountry.DataBindings.Add("Text", customersSource, "Country", true);

tPhone.DataBindings.Add("Text", customersSource, "Phone", true);

tFax.DataBindings.Add("Text", customersSource, "Fax", true);

gridCustomers.AutoGenerateColumns = false;

gridCustomers.Columns.Add("CustomerID", "CustomerID");

gridCustomers.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

gridCustomers.CellPainting +=

new DataGridViewCellPaintingEventHandler (gridCustomers_CellPainting);

gridCustomers.DataSource = customersSource;

gridOrders.AutoSizeColumnsMode =

DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader;

gridOrders.DataSource = ordersSource;

}

Большинство строк кода этого метода вам должно быть понятно. Мы читаем набор данных, состоящий из одной таблицы клиентов и осуществляем привязку данных (как Complex, так и Simple DataBinding). Обратие внимание на строку, где создается обработчик события CellPainting. Вы помните, что ячейки таблицы клиентов должны иметь нестандартный вид? мы добьемся этого в обработчике события CellPainting. Этой же цели служат и другие установки свойств gridCustomers, которые вы здесь видите. Установки можно было бы произвести в режиме дизайна, но таким образом я заостряю на них ваше внимание. Важной является установка свойства AutoSizeMode (в значение Fill).

Приступим к разработке кода метода FillDictionary. Он должен создать и заполнить таблицу соответствий (ассоциативный массив flags) между именем страны и изображением ее флага. Имя страны клиента мы выудим из поля Country таблицы клиентов, а картинку из таблицы отображений Dictionary<String, Bitmap> flags. Особенности поиска ресурсов, внедренных в сборку (то есть, непосредственно в файл exe нашего проекта) достаточно подробно описаны в MSDN. Из всех ресурсов мы отфильтровываем только картинки типа (gif), и имена их файлов. Немного ниже мы обсудим, как создать внедряемые ресурсы. Сейчас мы считаем, что они уже присутствуют в нашей сборке. Важно запомнить, что выудить саму картинку из ресурсов можно с помощью метода GetManifestResourceStream. Имена же всех внедренных ресурсов добываются с помощью метода GetManifestResourceNames класса Assembly.