Visual Basic, .NET, ASP, VBScript
 

   
 
Описание для автора не найдено
 
     
   
 

Использование True DBgrid при создании приложений для управления базами данных на Visual Studio.Net (часть 1)

 

Введение

 

С большим интересом прочитал статью Макса Грибкова «Использование True DBgrid при создании приложений для управления базами данных на Visual Basic 6.0». Большое спасибо автору за содержательный материал. Сам я тоже использую True DBgrid, но, как оказалось, немного в другом стиле. А это сделало статью еще более интересной.

Однако не могу согласиться с утверждением автора о том, что переходить на платформу .NET  еще рано. «В сегодняшней жизни чтобы стоять на месте, надо бежать, а чтобы продвигаться вперед, надо бежать еще быстрее.» - не помню, кто сказал, но ведь так оно и есть. Никто не заставляет отказываться от Visual Basic 6.0, но раз появился .NET, надо успеть вовремя «вскочить на подножку».

 

True DbGrid.Net и FlexGrid.Net

 

Вот и фирма ComponentOne тоже не отстает от жизни, и выпустила программу ComponentOne Studio.Net, в состав которой входят обновленные компоненты True DbGrid и FlexGrid. Надо сразу сказать, что указанные компоненты подверглись кардинальной переработке. Во-первых, компоненты имеют совершенно новую объектную модель, соответствующую объектной модели NET.Framework. Во-вторых, теперь поддерживаются новые механизмы доступа к данным. В-третьих, настройка таблиц теперь осуществляется с помощью нового визуального дизайнера.

Теперь о языках программирования. Работать с True DbGrid и FlexGrid можно с помощью любого из  языков .NET (C#, C++, VB.Net), причем код будет отличаться очень незначительно.

Если у вас еще нет ComponentOne Studio.Net, то пока можно использовать True DbGrid более старых версий (ActiveX). Они нормально работают с Visual Studio.Net (проверено на практике). Следует только помнить, что старые версии True DbGrid требуют соответствующих инструментов доступа к данным.

 

Начинаем работу с True DbGrid.Net и FlexGrid.Net

 

Подключить True DbGrid.Net и FlexGrid.Net к среде разработки можно разными способами (вплоть до программных). Но намой взгляд, наиболее удобно, если компоненты будут у вас «под рукой», на панели инструментов.

Щелкнем правой кнопкой мыши в любом месте панели инструментов и в появившемся контекстном меню выберем пункт Add Tab

 

 

Рис 1

 

Студия создаст на панели инструментов новую закладку, пока с пустым заголовком, и предложит ввести ее название. Я не стал оригинальничать и назвал новую закладку Component One.

Закладка пока пустая. Теперь щелкаем правой кнопкой мыши на ее заголовке, и выбираем в контекстном меню пункт Add\Remove Items… Появляется окно выбора компонентов:

 

 

Рис 2

 

Выбираем интересующие нас компоненты (выбирать все совсем не обязательно, можно ограничиться только необходимыми) и жмем OK. Выбранные компоненты появляются на нашей панели:

 

 

Рис 3.

 

Теперь отсюда компоненты можно перемещать на форму перетаскиванием. Часть из них невидимы в Runtime (в частности компоненты доступа к данным).

 

Компоненты ComponentOne для доступа к данным

 

Прежде чем отображать какие-либо данные, их необходимо извлечь из «места хранения». True DbGrid.Net и FlexGrid.Net полностью поддерживают стандартные механизмы доступа к данным ADO.NET, включенные в Framework. Вместе с тем, ComponentOne Studio.Net содержит и собственные компоненты, предназначенные для доступа к данным. Говорить о выборе конкретного способа получения данных сложно, все зависит от конкретной ситуации.

 

ComponentOne Studio.Net содержит две группы компонентов доступа к данным:

 

1.      ComponentOne DataObjects Express Edition (C1DataExpress) - включает в себя:

   - C1ExpressConnection;

   - C1ExpressTable;

   - C1ExpressView;

   Эти компоненты являются «облегченной» версией, и переназначены для быстрого построения приложения. По сравнению с профессиональной версией их функциональность ограничена. Пространство имен: C1.Data.Express.

 

2.      ComponentOne DataObjects Enterprise Edition (C1DataObjects) – являются профессиональной версией доступа к данным, и включают в себя:

            - C1DataTableSource;

            - C1DataSet;

            - C1DataSetLogic;

            - C1DataView;

            - C1SchemaDef;

            - C1SchemaRef;

            - C1TableLogic.

            Пространство имен: C1.Data.

 

Хотя среда разработки позволяет устанавливать (или удалять) каждый компонент по отдельности, при выборе одной из версий следует устанавливать все ее компоненты, иначе возможна их некорректная работа. Можно также установить обе версии одновременно.

Перечисленные компоненты могут применяться также с другими связанными с данными (data bound) компонентами интерфейса, в том числе и со стандартными компонентами Windows Forms.

 

Итак, наша задача распадается на два этапа:

1.      подключиться к источнику данных;

2.      отобразить полученные данные в табличном виде.

 

Давайте начнем продвигаться в направлении «от простого к сложному». Сначала рассмотрим простейший, но уже полностью функциональный пример, потом будем продвигаться дальше.

 

 

Построение приложения с использованием True DbGrid.Net и C1ExpressTable (и др. компонентов связи с данными)

 

 

О том, как создать форму и расположить на ней True DbGrid я рассказывать не буду...

Самым простым и минимально необходимым компонентом доступа к данным из комплекта c1 является C1ExpressTable. Он инкапсулирует два объекта:  Table – таблицу данных и коллекцию объектов Rowset, представляющих отдельные записи. Поскольку C1ExpressTable невидим в runtime, после помещения на форму он располагается на специальной панели:

 

 

               Рис 4

 

Теперь нам надо подключиться к базе данных. В окне Properties компонента C1ExpressTable можно увидеть, что он может быть подключен к БД двумя путями:

- ConnectionComponent – подключение к БД при помощи компонента      C1ExpressConnection

- ConnectionString – непосредственное подключение к БД.

 

Логика здесь такова: один C1ExpressConnection может обслуживать несколько C1ExpressTable. В таких случаях и следует его использовать. Если отображается одна таблица (представление) – можно обойтись без посредников. Давайте выберем второй вариант.

Выбираем в окне свойств строку ConnectionString, там появляется комбобокс. Если ваша студия уже подключена к БД при помощи Server Explorer, в комбобоксе уже будут соответствующие строки подключения. Нас они не интересуют, поэтому выбираем строку <New connection…>. Открывается до боли знакомый диалог построения строки подключения:

 

 

                                       Рис 5

 

Другие свойства C1ExpressTable не покажутся чем-то непонятным для того, кто хоть раз работал с контролами типа Data или Adodc в VB6.  Отмечу лишь некоторые особенности:

1.      C1ExpressTable в качестве источника данных кроме непосредственно таблиц и представлений БД могут выступать:

- команда (аналогично объекту command ADO)

- т.н. композитная таблица: фактически представление, только построенное с помощью C1ExpressTable.

 

2.      Как и в контролах типа Data или Adodc в C1ExpressTable при выборе таблицы или представления возвращаются ВСЕ поля, что бывает необходимо крайне редко. C1ExpressTable позволяет из возвращаемого набора полей исключить ненужные, а также изменить их порядок.

 

Для выполнения указанных действий необходимо выбрать свойство Fields. Откроется редактор полей.

 

 

                                                               Рис 6

 

Здесь поля можно удалять, добавлять, изменять порядок их следования. Обратите внимание на вторую кнопку сверху. Она вставляет в набор вычисляемое поле (Calculations). Имеется возможность установить для поля ограничения (Constraints). Я надеюсь, что читателю приходилось работать с программами типа Access, Crystal Reports или MS SQL Server, поэтому с вычисляемыми полями и ограничениями он разберется сам.

 

Композитная таблица. Для ее создания необходимо в свойстве DbTableName установить <Composite…>. Откроется окно построения композитной таблицы:

 

 

                                                   Рис 7.

 

Здесь опять же все предельно просто: вверху выбираются таблицы, внизу устанавливаются связи между ними.

 

Дальше опять по накатанному пути: устанавливаем свойство DataSource таблицы c1TrueDBGrid1 (расположенной на форме) в c1ExpressTable1 и обновляем поля таблицы. Готово! Приложение можно запускать.

 

                                       Рис 8

 

Теперь то что получилось будем облагораживать. Свойство Columns в стандартном окне свойств открывает окно редактирования свойств колонок таблицы. Оно практически идентично аналогичному окну DataGrid из Windows Form, но содержит гораздо больше свойств.

 

 

                                                               Рис 9

 

 

Свойства полей можно редактировать в этом окне. Однако ComponentOne создал специальный редактор таблиц, позволяющий устанавливать свойства в «визуальном» режиме.

 

Для вызова редактора полей необходимо поместить указатель мыши на таблицу и вызвать контекстное меню щелчком правой кнопки мыши. В появившемся контекстном меню следует выбрать пункт Design…

 

 

                                                                        Рис 10

 

На форме редактора справа расположен макет таблицы, а слева – окно свойств. Фактически здесь расположено не одно, а три окна свойств, которые переключаются с помощью кнопки с выпадающим меню (крайней слева на панели инструментов)

 

Меню содержит три пункта

 

 

Рис 11

 

1.                     Data columns – (соответствующее окно свойств можно увидеть на Рис 10). Здесь можно настроить каждую из колонок таблицы в отдельности. Настройку можно производить, как устанавливая соответствующие значения в окне свойств, так и «визуальными» методами на макете таблицы. Свойств очень много, об этом уже говорилось в статье Макса Грибкова.

2.                     Display columns – на мой взгляд название не совсем корректное. В основном в открывающемся окне свойств можно редактировать общие свойства таблицы: высоту строк, параметры шрифта, разрешать или запрещать изменять размеры колонок и строк, показывать/скрывать разделители строк и колонок и т.д. Здесь же редактируются стили таблицы.

3.                     Splits – Таблицу можно разделить на несколько панелей по горизонтали и по вертикали. Параметры каждой из панелей устанавливаются здесь. Чтобы разрешить отображение нескольких панелей, следует установить в True одно из свойств AllowHorizontalSplit или AllowVerticalSplit (или оба сразу). Эти свойства имеются в общем окне свойств таблицы, но их почему-то нет в дизайнере. Зато в дизайнере на панели инструментов имеются соответствующие кнопки.

 

 

Опять же, о том, как оформлять таблицу, писать не буду. Это дело вкуса каждого программиста (или его заказчика). True DBGrid.NET предоставляет для этого широчайшие возможности.

 

Теперь о других элементах доступа к данным из комплекта C1DataExpress.

 

О C1ExpressConnection я уже немного писал. Этот компонент инкапсулирует соединение с БД. С его свойствами, я надеюсь, у вас проблем не будет.

 

Нередко при отображении данных в таблице их необходимо предварительно отобрать по значению одного из полей и отсортировать. В этих случаях можно применять компонент C1ExpressView. В качестве источника данных C1ExpressView принимает C1ExpressTable, а сам, в свою очередь может являться источником данных для C1TrueDBGrid.

Фильтрация записей в C1ExpressView осуществляется установкой его свойства RowFilter. Свойство принимает выражение типа строки формата «Имя_поля=’Значение’», например:

 

      «City=’Москва’»

 

Несколько таких выражений можно объединять с помощью операторов AND и OR.

Кроме фильтрации по значению поля, C1ExpressView может фильтровать записи по их статусу (за подробностями могу только отправить к описанию ADO.NET). Для этого следует установить соответствующее значение свойства RowStateFilter. Свойство может принимать следующие значения:

 

Added

Добавленные строки

CurrentRow

Текущие строки, включая неизмененные, измененные и новые строки

Deleted

Удаленные строки

ModifiedCurrent

Текущие строки, исключая неизмененные и новые

ModifiedOriginal

Оригинальные строки БД, исключая неизмененные и удаленные

OriginalRows

Оригинальные строки БД, включая неизмененные и удаленные

Unchanged

Неизмененные строки

 

Сортировка записей осуществляется установкой свойства Sort. Здесь следует просто указать имя поля, по которому будет осуществляться сортировка. Допустимо вводить несколько имен полей, разделяя их запятой. Сортировка будет осуществляться в том же порядке, в каком введены поля.

Еще хочу сказать, что C1TrueDBGrid и сам умеет фильтровать и сортировать записи, и C1ExpressView необходим только если нужен предварительный (перед отображением) отбор и сортировка.

Итак: общая схема использования перечисленных компонентов:

                    

              

                           Рис 12

 

Реализация True DbGrid.Net и компонентов связи с данными на программном уровне.

 

Ну вот, скажете, писал программист, а ни одной строчки кода! Конечно же, все, о чем сказано выше, доступно из кода программ.

 

C#

 

      c1ExpressTable1.ConnectionString="Integrated Security=SSPI;Packet       Size=4096;Data Source=PROGRAMMER;Tag with column collation when      possible=False;Initial Catalog=Northwind;Use Procedure for       Prepare=1;Auto Translate=True;Persist Security       Info=False;Provider='SQLOLEDB.1';Workstation ID=PROGRAMMER;Use    Encryption for Data=False";

      c1ExpressTable1.DbTableName="Orders";

      c1TrueDBGrid1.DataSource=c1ExpressTable1;

 

VB.NET

 

      C1ExpressTable1.ConnectionString = "Integrated Security=SSPI;Packet     Size=4096;Data Source=PROGRAMMER;Tag with column collation when      possible=False;Initial Catalog=Northwind;Use Procedure for       Prepare=1;Auto Translate=True;Persist Security       Info=False;Provider='SQLOLEDB.1';Workstation ID=PROGRAMMER;Use    Encryption for Data=False"

      C1ExpressTable1.DbTableName = "Orders"

      C1TrueDBGrid1.DataSource = C1ExpressTable1

 

Как видите, код отличается только наличием у C# точки с запятой в конце строки. Точно так же доступны и другие свойства. Некоторые из свойств доступны только программно, например, количество записей.

 

Разместим на форме два элемента label и следующий код:

 

C#: label2.Text=c1ExpressTable1.DataTable.Rows.Count.ToString();

 

VB.Net: label2.Text=c1ExpressTable1.DataTable.Rows.Count.ToString()

 

 

 

Рис 13

 

Кроме того, имеется много событий. True DBGrid позволяет перехватывать события не только изменения содержимого ячейки и перехода к другой ячейке, но и такие события, как, например: начало редактирования в ячейке, окончание редактирования. События OnAddNew, OnUpdate, OnDelete «распадаются» на пары событий BeforeAddNew и AfterAddNew, BeforeUpdate  и AfterUpdate, BeforeDelete и AfterDelete. Эти события можно использовать, например, для предварительного контроля вводимых значений:

 

C#:

private void c1ExpressTable1_BeforeFieldChange

(object sender, C1.Data.FieldChangeEventArgs e)

{

      if (e.Field.Name == "Quantity")

      {

            if ((short)e.NewValue < 1)

                  e.NewValue = (short)1;

      }

      else if (e.Field.Name == "Discount")

      {

            if ((float)e.NewValue < 0 || (float)e.NewValue > 1)

            throw new ApplicationException("Скидка должна быть больше 0 но          меньше 1");

      }

}

 

private void c1ExpressTable1_BeforeEndEdit

(object sender, C1.Data.RowChangeEventArgs e)

{

      if ((short)e.Row["Quantity"] * (decimal)e.Row["UnitPrice"] > 100000)

      throw new ApplicationException("Слишком дорого!");

}

 

 

VB.Net:

Private Sub C1ExpressTable1_BeforeFieldChange _

(ByVal sender As Object, ByVal e As  C1.Data.FieldChangeEventArgs) Handles _

C1ExpressTable1.BeforeFieldChange

If e.Field.Name = "Quantity" Then

      If e.NewValue < 1 Then

            e.NewValue = 1

      End If

ElseIf e.Field.Name = "Discount" Then

      If e.NewValue < 0 Or e.NewValue > 1 Then

            Throw New ApplicationException("Скидка должна быть больше 0 но _ меньше 1")

      End If

End If

End Sub

 

Private Sub C1ExpressTable1_BeforeEndEdit _

(ByVal sender As Object, ByVal e As C1.Data.RowChangeEventArgs) Handles _

C1ExpressTable1.BeforeEndEdit

If e.Row("Quantity") * e.Row("UnitPrice") > 100000 Then

      Throw New ApplicationException("Слишком дорого!")

End If

End Sub

 

В примере из предыдущей статьи автор для обновления таблицы использовал таймер. Конечно же, такое решение имеет право на жизнь, но обширный набор событий, поддерживаемый True DBGrid, позволяет строить полностью «событийно управляемые» приложения. Особенно это актуально для многоуровневых многопользовательских приложений, т.к. позволяет синхронизировать между собой клиентов и снижать нагрузку на сеть, отсекая некорректные и ненужные данные.

 

Поля баз данных и колонки True DBGrid доступны в виде коллекций, к элементам которых можно обращаться как по индексу, так и по имени (например поля БД).

 

C#:

c1TrueDBGrid1.Columns[0].Caption="Область";

 

VB.Net

Me.C1TrueDBGrid1.Columns(0).Caption = "Область"

 

Выше я уже писал, что True DBGrid содержит два «типа» колонок: Data Columns и Display Columns. Приведенный только что код касается Data Columns. К Display Columns добраться немного сложнее. Таблицу True DBGrid можно разделить на несколько панелей (по умолчанию имеется только одна панель). На программном уровне это выглядит так: объект True DBGrid содержит коллекцию объектов Splits. В свою очередь, коллекция Display Columns является свойством объекта Splits.

 

C#

c1TrueDBGrid1.Splits[0,0].DisplayColumns[0].Style.BackColor=System.Drawing.Color.Blue;

 

VB.Net

Me.C1TrueDBGrid1.Splits(0, 0).DisplayColumns(0).Style.BackColor = System.Drawing.Color.Blue

 

Результат:

 

 

                                                               Рис 14

 

Такое построение объектной модели позволяет по-разному отображать одни и те же столбцы на разных панелях.

 

Оформление строк в TrueDbGgrid

Теперь о пожалуй самой «деликатесной» из предоставляемых True DBGrid «вкусностей» - контекстно-чувствительном форматировании. Как уже писал в своей статье Макс Грибков, True DBGrid предоставляет программисту возможность перехватывать событие прорисовки строк. Это предоставляет следующие возможности:

1.                     Замена значений из поля БД своими значениями. Например: довольно часто в базах данных используются логические поля. True DBGrid позволяет заменить в этом случае абстрактные True и False чем-нибудь более осмысленным, например «Оплачено» и «Не оплачено». Имеется также возможность вставки в ячейки таблицы разных картинок, опять же в зависимости от значения поля.

2.                     Форматирование ячеек таблицы в зависимости от их содержания. Контекстно-чувствительное форматирование может применятся:

                           - ко всей таблице;

                           - к отдельным панелям;

                           - к колонкам;

                           - к строкам;

                           - к отдельным ячейкам.

3.                     Изменение в зависимости от контекста таких параметров, как заголовки, всплывающие подсказки, и др.

 

Вначале о замене значений полей БД. Для этого служит коллекция ValueItems, которая, в свою очередь является свойством объекта Data Columns.

Итак, открываем дизайнер, и идем к окну свойств Data Columns. Там есть свойство ValueItems. У ValueItems есть коллекция Values, которая и содержит список замены. Щелкаем мышью на соответствующей строке страницы свойств и открывается редактор ValueItems

 

 

                                                   Рис 15

Здесь Value – значение, имеющееся в поле БД.

DisplayValue – значение, которое будет отображаться в таблице.

 

Для того, чтобы замена заработала, следует также установить свойство Translate в True.

Все то же самое можно сделать программно:

 C#

      C1.Win.C1TrueDBGrid.ValueItem vi;

      vi=new C1.Win.C1TrueDBGrid.ValueItem("True","Оплачено");

      c1TrueDBGrid1.Columns[9].ValueItems.Values.Add(vi);

      vi=new C1.Win.C1TrueDBGrid.ValueItem("False","Не оплачено");

      c1TrueDBGrid1.Columns[9].ValueItems.Values.Add(vi);

c1TrueDBGrid1.Columns[9].ValueItems.Translate=true;

 

VB.Net

      Dim vi As C1.Win.C1TrueDBGrid.ValueItem

      vi = New C1.Win.C1TrueDBGrid.ValueItem("True", "Оплачено")

      C1TrueDBGrid1.Columns(9).ValueItems.Values.Add(vi)

      vi = New C1.Win.C1TrueDBGrid.ValueItem("False", "Не оплачено")

      C1TrueDBGrid1.Columns(9).ValueItems.Values.Add(vi)

 C1TrueDBGrid1.Columns(9).ValueItems.Translate = True

 

На рисунке внизу можно посмотреть, как выглядит таблица до и после преобразования:

 

 

                           Рис 16.

 

Основу контекстно-чувствительного форматирования составляют так называемые стили. Стиль представляет собой совокупность параметров форматирования: фонт, цвет текста и цвет подложки, выравнивание, параметры границы ячейки, доступность ячейки для редактирования и др. Каждый стиль имеет свое имя, и программист в своем коде может оперировать стилями по их имени.

Коллекция Styles является свойством всей таблицы. Поэтому к ней можно обратиться только из окна свойств таблицы. Идем в это окно и нажимаем строчку свойства Styles. Открывается окно редактора стилей:

 

 

                                                               Рис 17.

 

Изначально True DBGrid содержит ряд предопределенных стилей. Их можно увидеть в левом окне редактора стилей. Их предназначение ясно из названий. Предопределенные стили нельзя удалить, но их можно редактировать. Предположим, что вас не устраивает стандартный стиль выделения записи в таблице. Берем стиль Selected и изменяем его свойства ForeColor и BackColor. Смотрим, что получилось:

 

                                                              

                                                               Рис 18.

Вот вам «прозрачный стиль выделения», реализованный, например, в последних версиях Excel.

Кроме предопределенных стилей, программист может создать сколько угодно своих стилей и использовать их для оформления таблицы. Для создания нового стиля следует в редакторе стилей нажать кнопку . Свойства пользовательского стиля устанавливаются здесь же.

Новый стиль можно создать и программно:

 

C#

      C1.Win.C1TrueDBGrid.Style st=new C1.Win.C1TrueDBGrid.Style();

      st.Name="Pays";

      st.ForeColor=System.Drawing.Color.Red;

st.BackColor=System.Drawing.Color.Yellow;

 

VB.Net

      Dim st As C1.Win.C1TrueDBGrid.Style

      st = New C1.Win.C1TrueDBGrid.Style

      st.Name = "Pays"

      st.ForeColor = System.Drawing.Color.Red

      st.BackColor = System.Drawing.Color.Yellow

 

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

Вот мы и подбираемся к самому интересному. Во время прорисовки таблицы в распоряжении программиста два события: FetchRowStyle и FetchCellStyle. Первое возникает перед прорисовкой строки, второе – перед прорисовкой каждой ячейки. Давайте займемся строкой целиком.

Прежде, чем применять контекстное форматирование, необходимо его разрешить, установив в True свойство FetchRowStyles.

Либо программно ( C#):

 

c1TrueDBGrid1.FetchRowStyles=true;

 

Давайте используем применение стиля к строке.

 

 

C#

      private void c1TrueDBGrid1_FetchRowStyle(object sender,           C1.Win.C1TrueDBGrid.FetchRowStyleEventArgs e)

      {

            if(c1TrueDBGrid1.Columns[9].CellValue(e.Row).ToString()=="True")

            {

                  e.CellStyle.ForeColor=System.Drawing.Color.Red;

                  e.CellStyle.BackColor=System.Drawing.Color.Yellow;

            }

}

 

VB.Net

            Private Sub C1TrueDBGrid1_FetchRowStyle(ByVal sender As Object, ByVal e _     As C1.Win.C1TrueDBGrid.FetchRowStyleEventArgs) Handles _ C1TrueDBGrid1.FetchRowStyle

        If C1TrueDBGrid1.Columns(9).CellValue(e.Row).ToString() = "True" Then

            e.CellStyle.ForeColor = System.Drawing.Color.Red

            e.CellStyle.BackColor = System.Drawing.Color.Yellow

        End If

    End Sub

 

Запускаем приложение и любуемся:

 

 

                                                               Рис 19

 

Вы уже наверное поняли, что из подобного кода доступно практически все параметры True DBGrid. И никто не запретит вам перехватывая события изменять, например, заголовки. Давайте же рассмотрим более интересный пример – управление всплывающими подсказками (ToolTips).

 

Нередко в таблицах баз данных содержатся поля типа “Notes” («Примечания»), либо что-то подобное. Такая информация обычно не является «оперативно необходимой» но занимает в таблице много места. Давайте сделаем такой трюк: само поле с примечаниями спрячем, а его содержимое будет выводиться в качестве всплывающей подсказки в соответствии с текущей строкой. Для эксперимента возьмем список сотрудников всемирно известной фирмы NorthWind.

 

Во-первых, свяжем нашу таблицу с таблицей Employees базы данных NorthWind и уберем «лишние» поля. Вниманме! Поле Notes мы из таблицы удалять не будем, но сделаем его невидимым.

Во-вторых, свойство CellTips таблицы необходимо установить в Floating или Anchored. Это можно сделать и программно:

 

C#:  c1TrueDBGrid1.CellTips=C1.Win.C1TrueDBGrid.CellTipEnum.Floating;

 

Теперь пишем код:

 

C#

      private void c1TrueDBGrid1_FetchCellTips(object sender,       C1.Win.C1TrueDBGrid.FetchCellTipsEventArgs e)

      {

                        e.CellTip=c1TrueDBGrid1.Columns["Notes"].CellValue(e.Row).ToString();

}

 

VB.Net

      Private Sub C1TrueDBGrid1_FetchCellTips(ByVal sender As Object, ByVal e _     As C1.Win.C1TrueDBGrid.FetchCellTipsEventArgs) Handles _ C1TrueDBGrid1.FetchCellTips

        e.CellTip = Me.C1TrueDBGrid1.Columns("Notes").CellValue(e.Row)

 End Sub

 

Снова запускаем наше приложение, и видим, что при перемещении курсора по строкам всплывает подсказка с требуемым примечанием:

 

 

                                                   Рис 20

 

В качестве заключения

Можно перевести дух… Статья была написана «на одном дыхании». Еще раз спасибо Максу Грибкову за вдохновение. Заодно хочу извиниться перед читателем за сумбурность изложения, особенно примеры. Хотя я и не претендую на полноту изложения, считаю нужным только «задать направления».

Написал я конечно далеко не все, что знаю, и о чем хотел написать. Еще остались:

- использование «профессиональных» средств доступа к данным и работа в «отсоединенном» режиме;

- вставка в таблицу «несвязанных» данных;

- фильтрация и сортировка записей средствами True DBGrid;

- объединение ячеек;

- вывод записей БД в многострочном режиме;

- встраивание контролов в ячейки True DBGrid. Здесь возможности поистине безграничны: можно даже в ячейку одного True DBGrid встроить другой True DBGrid;

- представление данных в иерархическом виде с раскрывающимися списками либо в виде «дерева»;

- печать отчетов непосредственно средствами True DBGrid;

- сохранение настроек True DBGrid в файл на диске и восстановление этих настроек;

- и др…

Если будет потребность и время, обо всем этом я еще напишу. Но сначала я хочу дождаться выхода следующей части статьи Макса Грибкова.

 

 

 
     

   
   
     
  VBNet рекомендует