Последние две строки являют пример явного вызова обработчика события 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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.