1. Построение приложений с привязанными данными в Windows Forms

Обработка редактирования данных в сетке

в этом методе есть закомментированная

Как производить обработку редактирования в сетке, будет зависеть от следующих моментов:

Как уже упоминалось, при работе со столбцом текстовых полей, пользователь может начать редактирование ячейки, поместив на нее фокус ввода, мышью или с помощью стрелок, либо нажав F2, когда указатель мыли находится в ячейке. Если пользователь затем начнет вводить символы, текущее содержимое ячейки будет переписано. Переход фокуса на другую ячейку завершает процесс редактирования. Первое, что происходит при редактировании и может потребовать обработки, — это запуск события CellParsing. Как и его аналог CellFormatting, Это событие дает вам возможность при редактировании перехватить значение, введенное в ячейку, чтобы либо самостоятельно сохранить его, либо преобразовать в какое-другое значение перед его сохранением. Если ячейка привязана к данным, а источник данных поддерживает редактирование объектов данных в коллекции, данные будут автоматически сброшены в нижележащий источник данных. Однако если ячейка является кнопочной или ссылочной ячейкой, вы во всяком случае не сможете редактировать ее содержимое, потому что такие ячейки не поддерживают редактирование. Если ячейка является ячейкой комбинированного поля, редактирование производится выбором значения из выпадающего списка, либо путем ввода поверх текущего выбранного значения, если в свойстве DisplayStyle Ячейки установлено ComboBox. При этом по завершении редактирования значение ячейки будет изменено, что приведет к тем же результатам, что и ввод значения в ячейку текстового поля. Если сетка находится в виртуальном режиме, вам потребуется обработать событие CellValuePushed, Чтобы перехватить введенное значение и сделать с ним все, что нужно.

Набор данных заполнен соответствующей схемой и данными

b на xml документе при

Как только набор данных заполнен соответствующей схемой и данными, он передается конструктору XmlDataDocument. На XML-документе при помощи метода SelectNodes Производится запрос XPath, и этот метод возвращает список узлов XML, который затем итерируется для формирования простого отображения имен заказчиков. Относительно XmlDataDocument Необходимо понять ту важную его особенность, что он может загружать и хранить массу XML-содержания, которое не экспонируется через свойство DataSet, И это дополнительное содержание доступно через обычную объектную модель документа базового класса XmlDocument. Так что вы могли бы загрузить документ, который содержит данные, соответствующие схеме набора данных, который вы хотите экспонировать для привязки, и документ мог бы содержать еще группу других узлов, не соответствующих схеме. Те части XML-документа, которые соответствуют схеме набора данных, были бы добавлены к набору данных, но те части, что ей не соответствуют, были бы просто заключены в объектную модель базового класса XmlDocument И были доступны посредством обычной XML-навигации по документу. Поэтому, если вам нужно переходить от работы с данными как реляционными к работе с ними как с объектной иерархией XML и обратно, одним из первых кандидатов на применение будет XmlDataDocument. В этом случае вы также используете тот факт, что конструктор XmlDataDocument Может принимать в качестве параметра набор данных, и в этом случае XmlDataDocument Будет поддерживать внутреннюю ссылку на него вместо конструирования своего собственного набора данных. Следующий код демонстрирует создание набора данных из реляционного источника, после чего конструируется XmlDataDocument И используется объектная модель XML для выполнения операций над данными.

Специфические для провайдера средства

вообще говоря вам нужно выработать

Если вам требуется подключить специфические для провайдера средства, такие, как обработка XML в SQL Server, то вам нужно будет работать с классами, специфическими для провайдера, а не с интерфейсами или обобщенными классами. Вообще говоря, вам нужно выработать единообразный подход в программировании объектов провайдеров, а не прибегать в одних случаях к интерфейсам, а в других — к специфическим для провайдера классам. Вы должны будет решить, какой подход является наилучшим, исходя из потребностей вашего приложения и той степени, в какой ваш код должен быть переносим на различные платформы. В качестве простого примера работы со специфическим провайдером следующий код показывает, как открыть соединение с базой данных SQL Server и исполнить команду для заполнения DataSet При помощи SqlDataAdapter: Более подробно о той магии, что происходит в этом методе Fill, Я буду рассказывать позднее. В данный момент я хочу дать лишь общий обзор. Когда вам нужно загрузить в память все данные, используйте набор данных, чтобы в клиенте или среднем ярусе можно было работать с ним как с целым. Каждый управляемый провайдер реализует также другое средство извлечения данных от запроса, называемое считывателем данных. Например, управляемый провайдер SQL Server реализует класс с именем SqlDataReader. Вы можете рассматривать считыватель данных как быстрый, перемещающийся только вперед потоковый указатель, который можно использовать для итерации по результатам запроса. Имеются средства привязки считывателя данных к элементам управления Windows Forms посредством компонента BindingSource, Но я бы не рекомендовал такого рода методику, поэтому не буду касаться ее деталей. Привязка считывателя данных к элементам управления Windows Forms приводит к сильному сопряжению яруса представления и яруса данных. Если это очень небольшое приложение, и вы ищете самый быстрый способ обеспечить представление данных пользователю, то это будет приемлемо. Однако в полномасштабных приложениях для бизнеса этого следует избегать. Использование считывателей данных в ярусе представления потенциально держит соединение открытым дольше, чем это необходимо, ограничивая масштабируемость, а также тесно сопрягает клиент со схемой данных в ярусе данных. Однако считыватели данных являются быстрейшим средством итерации по строкам, возвращаемым от запроса, поэтому вы, возможно, захотите их использовать, если собираетесь сбрасывать результаты запроса в коллекцию рабочих объектов, а не применять наборы данных. Позднее в этом приложении я покажу такой пример.

Программирование в AD0.NET

это приложение концентрирует внимание только

При программировании в AD0.NET данные могут принимать разнообразные формы и поступать из разнообразных источников. Это приложение концентрирует внимание только на двух источниках данных: реляционных данных, поступающих из базы данных вроде Mirosoft SQL Server, и коде XML, поступающем из файла или потока. Разумеется, эти две категории не являются взаимоисключающими. В SQL Server имеется масса функций для генерирования и потребления XML, a SQL Server 2005 имеет собственный тип данных для сохранения XML. Вы можете также загрузить XML в DataSet И работать с ним, как с реляционными данными, и вы можете передавать реляционные данные в XmlDataDocument И работать с ними как с XML-документом. Вы можете также загрузить XML и произвести итерацию по узлам документа, чтобы извлечь данные, которые вы помещаете в рабочие объекты, используя затем последние для привязки данных. Код, который вы пишете для реляционных и для XML-данных, сильно отличается, как и способы, которыми вы можете использовать их в привязке данных. Это приложение сосредоточено на различных способах извлечения данных в рабочие единицы или наборы данных, которые вы можете использовать в своих приложениях Windows Forms для представления этих данных, и на том, как принять любые сделанные обновления и сбросить их обратно в нижележащее хранилище данных. Поскольку это весьма насыщенная тема, я собираюсь сделать некоторые предположения относительно вашей подготовки. Во-первых, я предполагаю, что вы понимаете основные концепции, стоящие за сохранением данных в базе данных и исполнением запросов для их извлечения и обновления. Во-вторых, я буду считать, что у вас имеются некоторые элементарные знания о сохранении данных в XML, о структуре документа и о типах узлов, которые он может содержать. Вам, разумеется, не нужно быть экспертом в этих областях, но у вас должна быть некоторая подготовка, достаточная хотя бы для того, чтобы понимать терминологию и знать об элементарных процессах и возможностях этих технологий.

Привязка данных вида ведущий-детализация

например у клиента может быть

Зачастую приходится иметь дело с коллекциями данных, в которых имеет место отношение «родительский-дочерний». Например, у клиента может быть коллекция размещенных им заказов, а заказ может описываться коллекцией объектов OrderDetail, каждый из которых описывает отдельный пункт заказа. В подобной ситуации от вас часто требуется предоставить пользователю способ просмотра коллекции родительских объектов, а при выборе родительского объекта показывать только те дочерние объекты, что с ним связаны. Часто это реализуется, как две таблицы в одном наборе данных с отношениями внешнего ключа, устанавливающими связи между строками дочерней таблицы и соответствующей им строкой в родительской таблице. Обычный способ представления таких данных и навигации в них состоит в помещении коллекции родительских объектов в одну сетку и отображении дочерних объектов во второй сетке. Такое представление данных в Windows Forms легко реализуется при помощи элемента управления DataGridView И источников привязки. Для этого вам прежде всего потребуется источник данных, в котором установлены соответствующие отношения «родительский-дочерний». Обычно это источник данных с двумя таблицами и установленным родительско-дочерним отношением между ними. Вы можете сделать это вручную средствами ADO. NET, или же конструктор наборов данных сделает это автоматически, когда вы в конструкторе добавите в набор данных две связанные таблицы. Вы можете также организовать привязку «ведущий-дета — лизация», используя специальные объекты. Для этого каждый родительский объект должен иметь свойство, обеспечивающее доступ к списку относящихся к нему дочерних объектов.