Использование 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 в файл на диске и восстановление
этих настроек;
- и
др…
Если
будет потребность и время, обо всем этом я еще напишу. Но сначала я хочу
дождаться выхода следующей части статьи Макса Грибкова.