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

Свойство AllowEdit

этот обработчик производит простые проверки

Свойство AllowEdit Извлекает или устанавливает соответствующее свойство инкапсулированной коллекции BindingList, Которое проверяет обработчик события щелчка мыши, чтобы решить, следует ли производить обработку редактирования. Этот обработчик производит простые проверки на попадание щелчка в прямоугольники, вычисленные и сохраняемые методом UpdateCoordinates, И если он видит, что щелчок произошел внутри одного из столбиков, то увеличивает или уменьшает его значение на 10 процентов в зависимости от того, какая кнопка произвела щелчок. Теперь нужно добавить соответствующую поддержку в элемент управления DataBoundBarChartControl, Чтобы обновлять соответствующий источник данных, если это необходимо, и управлять редактируемостью отдельных элементов управления BarChartControl. Модифицированные фрагменты кода элемента управления выделены в листинге 8.12 жирным шрифтом.

Для отслеживания информации, достаточной для изменения привязанного списка данных при изменениях внутри отдельного экземпляра BarChartControl, Было добавлено несколько новых элементов класса: Ссылка на сам привязанный список, чтобы избежать многократного разрешения этой ссылки через синхронизатор. Когда источник данных обновляется и вызывается метод UpdateDataBinding, Вы сохраняете ссылку на привязанный список и устанавливаете флаг, показывающий, является ли источник обновляемым, исходя из состояния либо флага IList. IsReadOnly, Либо свойства IBindingList. AllowEdit В зависимости от того, реализует ли источник данных интерфейс IBindingList. При добавлении каждого элемента управления BarCharControl К вашему списку Controls Инкапсулирующий элемент управления подписывается на его событие DataValueChanged И устанавливает его редактируемость в зависимости от редактируемости списка. Наконец, обработчик для события DataValueChanged Любого из инкапсулированных диаграммных элементов управления, используя объектную ссылку на отправителя и индекс измененного столбика, обращается обратно к этому элементу управления, извлекает изменившееся значение, находит соответствующий объект в привязанном списке данных по индексу, сохраняемому для этого элемента управления в Hashtable, И устанавливает значение соответствующего свойства этого объекта в зависимости от действительного типа значения.

Класс Sort Comparer

b когда класс b list

Класс SortComparer Обеспечивает базовую реализацию сравнения, которая должна использоваться с методом List.Sort. Класс SortComparer Позволяет конструировать экземпляр класса, специфицировав свойство объектов, которое будет сравниваться для определения отношений «равно», «больше» или «меньше», передаваемое в дескрипторе свойства, и значение из перечисления ListSortDirection. Когда класс List<T> Производит итерацию по списку, применяя внутренний алгоритм сортировки, он вызывает метод Compare, Передавая ему два объекта, с которыми он в данный момент работает в процессе сортировки. Реализация Compare Из листинга 9.4 пробует различные способы сравнения объектов. Сначала она извлекает значение специфицированного свойства каждого из объектов при помощи метода Getvalue Дескриптора свойства. Затем она проверяет, реализует ли объект, который представляют эти значения, интерфейс IComparer. Это стандартный интерфейс в. NET Framework. Он реализует метод CompareTo, Инкапсулирующий ту же логику, к которой мы стремимся — говоря конкретнее, если объект сам решает, что он равен другому переданному объекту, он возвращает О; если он больше, он возвращает 1; если он меньше, он возвращает —1. Если значения свойства не реализуют IComparer, Но метод Equals Значения говорит, что оно равно другому объекту, то Compare Возвращает О, сообщая о равенстве. Наконец, если ни одна из проверок не удалась, значения свойства преобразуются в строки и строковые представления сравниваются при помощи CompareTo, Который реализует класс String. Самое последнее, что делает метод — проверяет направление сортировки, и если оно указывает на нисходящую сортировку, он умножает возвращаемое значение на — 1, чтобы обратить смысл отношений больше/меньше. Чтобы производить сортировку из вашего класса BindingListview<T>, Вам необходимо предусмотреть переопределения всех относящихся к сортировке методов и свойств базового класса. Они показаны в листинге 9.5.

Объявление переменной типа List<T> Для сохранения несортированной коллекции при применении сортировки.

Изменение порядка столбцов

поскольку разные пользователи уделяют некоторым

Переупорядочение столбцов является встроенной функцией сетки, которая позволяет пользователям изменять порядок отображения столбцов в сетке во время выполнения. Поскольку разные пользователи уделяют некоторым столбцам больше внимания, чем другим, пользователи часто просят, чтобы у них была возможность самим устанавливать порядок отображаемых столбцов. Хотя такую возможность можно было бы поддерживать программно, удаляя столбцы из сетки и затем вставляя их в новой позиции, это потребовало бы в общем случае утомительного написания большого объема кода. Поэтому разработчики группы Windows Client были настолько любезны, что позаботились о встроенной функции переупорядочения в самом элементе управления сетки. В дополнение к общим свойствам и поведению, которые можно конфигурировать через контекстную закладку, есть масса других свойств и событий, конфигурацию которых можно задавать на этапе проектирования в окне Properties. Установка любого из этих свойств генерирует соответствующий код в методе InitializeComponent Неполного класса для формы, создаваемого конструктором. Что особенно важно, в окне Properties можно конфигурировать любые свойства привязки данных. Возможно, вы захотите устанавливать при помощи этого окна стили, поскольку вы сразу можете видеть результаты этих установок в конструкторе и убедиться, что получается именно то, что вам нужно. Более подробно стили обсуждаются в конце этой главы. Она работает следующим образом. Если свойство AllowUserToOrderColumns Установлено в True И пользователь захватывает и тянет мышью заголовок столбца, сетка позволяет перетащить и сбросить столбец в позицию, где он хочет его разместить. Столбцы справа от позиции сброса будут сдвинуты на одну позицию вправо, а столбцы, окружающие первоначальную позицию перемещаемого столбца, сомкнутся после того, как столбец будетперемещен. Рис. 6.6 показывает это в процессе выполнения. В данном случае захвачен и перемещается влево столбец QuantityPerUnit. Перетаскиваемый заголовок столбца обозначается серым прямоугольником соответствующего размера. Когда вы перемещаете курсор к одной из сторон другого столбца, граница между этим столбцом и смежным с ним темнеет, показывая, куда будет помещен перетаскиваемый столбец после того, как вы отпустите кнопку мыши.

Единообразная спецификация источников и компонентов данных

если вы при указании источника

Важно, чтобы спецификация источников и компонентов данных была Единообразной для всех элементов управления на форме. Если вы при указании источника используете для разных элементов управления разные типы ссылок, то вы не получите синхронизированного обновления элементов управления при изменении текущего выбора на форме. Если бы вы не захотели придерживаться данного правила и специфицировали привязку текстовых полей так, как было показано выше, то для того, чтобы синхронизация текстовых полей и сетки не нарушилась, необходимо было бы соответствующим образом специфицировать источник и компонент данных для сетки. Нужно модифицировать обработчик события загрузки формы: Рекомендуется все же устанавливать источник данных на списочном уровне и избегать составных компонентов данных . Исключением является случай, когда дело касается привязки к сложному объекту, содержащему единственный сложный дочерний объект. Возьмем, к примеру, объект Customer И его свойство Address. Свойство Address Содержит экземпляр сложного типа со свойствами City, State И т. д. для этого экземпляра. В этом случае можно было бы для привязки к адресной информации одиночного объекта Customer Использовать составной компонент данных. Для привязки к свойству City Можно установить в качестве источника данных объект Customer, Но в качестве компонента специфицировать Address.City. Если вы внесете это изменение в дополнение к изменениям для текстовых полей, показанным в листинге 3.5, и запустите приложение, то при выборе в сетке различных строк текстовые поля будут синхронно обновляться, как раньше. Поскольку теперь для источников данных специфицирована в точности одна и та же ссылка на объект, для всех элементов управления будет создан только один синхронизирующий объект. В то время как устаревший элемент управления DataGrid Мог быть привязан к набору данных и мог отображать иерархическую навигацию по содержащимся в наборе таблицам, сетка DataGridView Предназначена для одновременной привязки только к одиночному списку. Если установить для свойства DataSource Сетки DataGridView Набор данных и не специфицировать таблицу в свойстве DataMember, Сетка останется пустой.

Вы вызываете GetltemProperties с нулевым параметром

вообще говоря это зависит от

Если вы вызываете GetltemProperties С нулевым параметром, то получаете обратно описатели свойств для элементов данных списка. Зачем же нужен этот параметр? Вообще говоря, это зависит от того, какая коллекция реализует интерфейс, но в случае DataView Вы можете использовать его для получения дескрипторов свойств родственных таблиц. Если таблица, оболочкой которой является DataView, Имеет отношение К другой таблице, в возвращаемой для псевдотаблицы коллекции будет дескриптор свойства, представляющего отношение, которое экспонирует дочерние строки в другой таблице. Если вы передадите этот дескриптор свойства методу GetltemProperties Псевдотаблицы, то получите обратно дескрипторы свойств для родственной псевдотаблицы.

Метод GetListName Возвращает просто имя списка, который будет возвращаться методом GetltemProperties. Поведение DataView Здесь таково, что если вы передадите методу весь массив дескрипторов, соответствующий возвращаемой GetltemProperties Коллекции, то получите имя таблицы. Если у вас есть сложный контейнер коллекций, подобный DataSet, Вы можете возвращать имена других коллекций в контейнере, когда передаются их дескрипторы свойств. Этот метод на самом деле не применяется нигде, кроме старого элемента управления DataGrid, Где он используется для отображения имен дочерних списков при навигации по иерархической коллекции коллекций. Ниже приводится простая реализация ITypedList В BindingList, Которая сортирует дескрипторы свойств.