Использование True DBgrid при создании приложений для управления базами данных
на Visual Studio.Net (часть 6, заключительная)
Введение.
В предыдущих статьях мы с вами
рассмотрели все основные возможности True DBgrid.NET и FlexGrid.NET.
Конечно же, мы рассмотрели далеко не все возможности, хотя то, что осталось и
используется на практике гораздо реже.
Тем временем была опубликована
вторая часть статьи Макса Грибкова. К счастью получилось именно так, что данная
статья перекликается с ней.
Мы рассмотрим:
- сохранение и восстановление
параметров таблиц;
- экспорт содержимого таблиц в
файлы разного формата;
- печать содержимого таблиц;
- дополнительные возможности
навигации в таблице;
- вкратце упомянем о других
программах C1, используемых совместно с True DBgrid.NET и FlexGrid.NET.
Сохранение на диске
параметров True DBgrid и восстановление параметров из файла.
Когда открывается форма с установленной
на ней True DBgrid.NET,
параметры таблицы (например ширина колонок) устанавливаются такими, какими они
были установлены в design time. Но пользователи бывают
капризные, и им требуется настройка «под себя». Для таких случаев предусмотрена
возможность сохранения параметров True DBgrid.NET и восстановления этих настроек.
Сохранение настроек:
C#
object.SaveLayout(String filename)
object.SaveLayout(System.IO.Stream
stream)
VB.NET
Public Sub (ByVal
filename As String)
Public Sub (ByVal
stream As
System.IO.Stream)
Восстановление
настроек:
C#
object.LoadLayout(String filename)
object.LoadLayout(System.IO.Stream
stream)
VB.NET
Public Sub (ByVal
filename As String)
Public Sub (ByVal
stream As Stream)
Здесь filename – имя
файла (может включать полный путь), в котором сохраняются настройки. Расширение
файла можете установить любое по своему усмотрению.
stream – т.
называемый поток. На логическом уровне поток эквивалентен файлу, но более гибок
в реализации (и более сложен). Данные из потока могут храниться не только в
файле, но например, в базе данных или в оперативной памяти. Данные в потоке
также могут кэшироваться.
Продемонстрируем сказанное
примером:
Во-первых, нужно подключить
соответствующее пространство имен:
using System.IO;
В конструкторе формы создаем
поток. Поскольку чтение-запись диска – «дорогостоящая» операция, поток
переместим в буфер, находящийся в оперативной памяти, а запись на диск отложим
до закрытия формы:
Поскольку потоки нужны в нескольких
процедурах, объявляем переменные уровня модуля:
FileStream fsFile;
BufferedStream fsBuffer;
Теперь само создание потоков (в
конструкторе):
//создаем файловый поток
fsFile=new
FileStream("Sets.grd",FileMode.OpenOrCreate,FileAccess.ReadWrite);
//кешируем файловый поток в оперативной
памяти
fsBuffer=new BufferedStream(fsFile);
В процедуре загрузки формы
восстанавливаем параметры:
private void Form1_Load(object
sender, System.EventArgs e)
{
try
{
//если все
нормально, устанавливаем для TrueDBGrid сохраненные параметры
c1TrueDBGrid1.LoadLayout(fsBuffer);
}
catch
{
//в случае
ошибки устанавливаем исходные данные
}
}
Теперь устанавливаем процедуру
сохранения параметров там, где нам надо, например, при изменении ширины
колонки:
private void c1TrueDBGrid1_ColResize(object
sender, C1.Win.C1TrueDBGrid.ColResizeEventArgs e)
{
c1TrueDBGrid1.SaveLayout(fsBuffer);
}
Таких обработчиков может быть
столько, сколько нужно программисту.
И, наконец, при закрытии формы
сохраняем все на диске:
private void Form1_Closed(object
sender, System.EventArgs e)
{
//передаем данные из
буфера в файл
fsBuffer.Close();
//записываем файл на
диск и закрываем его
fsFile.Close();
}
Теперь файл настроек можно увидеть
в рабочем каталоге приложения:
Рис
1.
Экспорт содержимого True DBgrid.
Сначала хочу высказать свое личное
мнение. На мой взгляд, в подобных контролах такие функции излишни. Способов
взять данные в одном источнике и сохранить их в другом существует огромное
множество, в том числе и более простых и изящных. Ну да ладно, посмотрим, как
это делает True DBgrid.NET.
Кроме того, обратите внимание, что
я не рассматриваю «импорт». Фактически это то же самое, что и связывание с
данными. Все эти вопросы подробно описаны у Макса Грибкова.
Итак, первая процедура экспорта:
C#
public void ExportTo()
public void ExportTo( string
filename )
VB.NET
Public Sub ExportTo()
Public Sub ExportTo(ByVal filename
As String)
Процедура без параметров
предварительно покажет стандартный диалог выбора файла.
Тип сохраняемого файла в этом
случае определяется по его расширению. Поддерживается два типа файлов:
- *.xls;
- *.rtf
True DBgrid.NET может сохранять файлы и в виде «плоского текста». Для
этого служат следующие методы:
C#
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum
selector)
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum
selector, String delim)
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum
selector, String delim, String prefix)
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum
selector, String delim, String prefix, String suffix)
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum
selector, String delim, String prefix, String suffix, Boolean columnheader)
C1TrueDBGrid.ExportToDelimitedFile
(String filename, RowSelectorEnum selector,
String delim, String prefix, String suffix, Boolean columnheader, string encoding)
VB.NET
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As
RowSelectorEnum)
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As
RowSelectorEnum, ByVal
delim As String)
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As RowSelectorEnum, ByVal
delim As String, ByVal prefix As String)
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As
RowSelectorEnum, ByVal
delim As String, ByVal prefix As String, ByVal suffix As
String)
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As
RowSelectorEnum, ByVal
delim As String, ByVal prefix As String, ByVal suffix As
String, ByVal headers As Boolean)
Public Sub
ExportToDelimitedFile(ByVal filename As String, ByVal selector As
RowSelectorEnum, ByVal
delim As String, ByVal prefix As String, ByVal suffix As
String, ByVal headers As Boolean, ByVal encoding As String)
Аргументы методов:
Наименование аргумента
|
Описание
|
pathname
|
Полный путь к выходному файлу
|
delim
|
Строка - разделитель записей
|
selector
|
Строка – разделитель строк таблицы
|
prefix
|
Строка, которая будет использоваться как префикс для
каждой записи
|
suffix
|
Строка, которая будет использоваться как суффикс для
каждой записи
|
columnheader
|
Булева переменная. Если она равна true,
в выходной файл первой строкой будут выведены заголовки столбцов
|
encoding
|
Вид кодировки
|
Аргумент selector принимает
значения перечисления RowSelectorEnum:
AllRows
|
Выводятся все строки
|
SelectedRows
|
Выводятся только выбранные строки
|
CurrentRow
|
Выводится только текущая строка
|
Это еще не все. Существует еще
несколько методов экспорта:
- ExportToExcel;
- ExportToHTML;
- ExportToPDF;
- ExportToRTF
Синтаксис всех этих методов
одинаков:
C#
C1TrueDBGrid.
ExportToXXX(String filename)
VB.NET
Public Sub ExportToXXX(ByVal
filename As String)
Печать содержимого True DBgrid.
На мой личный взгляд и эта
возможность является избыточной. Я предпочитаю использовать для печати отчетов
другие средства. Например, фирма ComponetOne включила в ComponetOne
Studio.NET новый контрол Reports (взамен
VsView) и дизайнер отчетов.
Для распечатки содержимого True DBgrid.NET служит класс PrintInfo, содержащийся непосредственно в компоненте.
Расположим на форме кнопку
«Печать». Ее обработчик:
private void button1_Click_1(object
sender, System.EventArgs e)
{
//устанавливаем шрифт отчета
Font fnt= new Font(c1TrueDBGrid1.PrintInfo.PageHeaderStyle.Font.Name,
c1TrueDBGrid1.PrintInfo.PageHeaderStyle.Font.Size, FontStyle.Italic);
c1TrueDBGrid1.PrintInfo.PageHeaderStyle.Font
= fnt;
//заголовок отчета
c1TrueDBGrid1.PrintInfo.PageHeader
= "Employees";
//устанавливаем
повтор заголовков колонок на каждой странице
c1TrueDBGrid1.PrintInfo.RepeatColumnHeaders = true;
//отображаем номера
страниц
c1TrueDBGrid1.PrintInfo.PageFooter = "Страница: \\p";
//при печати сохраняем цвета таблицы
c1TrueDBGrid1.PrintInfo.UseGridColors
= true;
//выводим отчет
в окно предварительного просмотра
c1TrueDBGrid1.PrintInfo.PrintPreview();
}
Запускаем приложение и нажимаем
кнопку «Печать»
Рис
2.
Конечно же, в таком виде не очень
эстетично, но все настраивается…
Дополнительные
возможности навигации по таблицам БД.
С момента появления контролов типа
Data, Adodc и др.
Программисты, их использующие разделились на два лагеря: одни прячут такой
контрол «с глаз долой», другие же, наоборот, располагают его на самом видном
месте. Из моего цикла целых три статьи были посвящены компонентам доступа к
данным. Как вы помните, ни один из новых компонентов не имеет визуального
интерфейса. Но ComponetOne не забыла и о тех, кто не представляет себя без интерфейса
«в стиле Access» и предоставляет компонент DbNavigator.
Рис
3.
(на скриншоте я специально
отобразил все кнопки, какие только можно..)
Хотя данный компонент и очень
похож на Data, Adodc и др, он
сам по себе с базой данных работать не может. DbNavigator
«пристегивается» к компонентам c1ExpressTable или c1DataSet и работает примерно так, как заводная рукоятка у двигателя,
позволяя вручную проворачивать коленвал. А говоря программистким языком
«предоставляет компонентам c1ExpressTable или c1DataSet визуальный интерфейс»
В
упрощенном виде схема использования DbNavigator выглядит так:
Рис
4.
В своей
первой статье Макс Грибков писал о недостатках компонента TDataLite. Его
«наследник», DbNavigator многих из этих
недостатков лишен. Его интерфейс полностью настраиваем, в том числе все
надписи, сообщения и всплывающие подсказки можно выполнить хоть по-русски, хоть
на суахили и т. д. Настраиваются все параметры шрифтов, стандартные пиктограммы
на кнопках можно заменить своими, сами кнопки имеют два стиля (Standard и Flat). Кроме
того, все нажатия на кнопки, и другие события можно перехватывать, а это
значит, что они в полной власти программиста. Как и в True
DBgrid.NET многие события «парные».
При
использовании DbNavigator (по крайней мере совместно с True
DBgrid.NET) настройки DbNavigator и настройки
самой True DBgrid.NET «перекрывают» друг друга. То есть, если например, в
самом DBgrid.NET удаление
записи запрещено, а в DbNavigator разрешено, то запись можно удалить. Фактически, разрешения
на операции с данными этих контролов работают по принципу логического «ИЛИ».
Данное свойство нигде не документировано, обнаружено экспериментально, так что
за полную достоверность вывода поручиться не могу.
Другие
компоненты ComponetOne и их совместное с True DBgrid использование.
Теперь
буквально в двух словах о других полезных компонентах от C1 для работы с
данными.
Выше я
уже написал об ограниченных возможностях табличных контролов при печати и
экспорте их содержимого. Для этого существует ряд дополнительных компонентов,
сильно облегчающих жизнь программисту. Следует сразу сказать, что в .NET версии
набор компонентов совсем другой по сравнению с ActiveX. Данные компоненты
могут применяться как совместно с табличными, так и самостоятельно.
1.
Компонент С1Report
Об этом
компоненте я уже упоминал. Он служит для построения отчетов и вывода их на
печать. ComponentOne Studio.NET содержит собственно компонент С1Report и графический
конструктор отчетов.
Рис 5.
Главное окно C1ReportDesigner
Первое,
что бросается в глаза при работе с C1ReportDesigner – он как брат-близнец похож на конструктор отчетов Access. Мало
того, имеется возможность импорта готовых отчетов непосредственно из файлов *.mdb.
Рис 6. Пиктограмма
компонента С1Report.
Компонент
С1Report не имеет видимого интерфейса и предназначен для интеграции
отчетов, созданных с помощью с C1ReportDesigner с приложениями.
2.
Компоненты C1PrintDocument и
C1PrintPreview
Бывает и
такое, что даже генераторов отчетов не хватает. Например, C1ReportDesigner (как
впрочем и Crystal Reports) привязан к конкретному принтеру и параметрам
страницы. А документ надо масштабировать, поворачивать (книга-альбом) и т. д. В
таких случаях приходит на помощь C1PrintDocument, хотя сразу хочу предупредить: это довольно сложно.
Рис 7.
Пиктограмма компонента C1PrintDocument.
C1PrintDocument
предоставляет программисту всю процедуру подготовки документа и непосредственно
печати. Правда придется самому писать много кода.
C1PrintPreview – это
графический интерфейс для C1PrintDocument, позволяющий просмотреть документ перед печатью и
выполнить с ним кое-какие действия.
Рис 7.
Форма с установленным компонентом C1PrintPreview
3.
Компоненты C1PdfDocument и
C1XLBook
И снова
об экспорте. Для этого имеется еще два компонента C1PdfDocument и C1XLBook.
Рис
8.
C1PdfDocument
предназначен для создания документов в формате *.pdf. В отличие от экспорта
методами True DBgrid, здесь все надо делать
«своими руками» т. е. писать код. C1PdfDocument
предоставляет обширную объектную модель, включающую методы работы как с
текстом, так и с графикой.
C1XLBook
предоставляет программисту объектную модель Microsoft Excel. В отличие
от методов True DBgrid, C1XLBook
позволяет работать с таблицами Excel
вплоть до конкретной ячейки.
Заключение
(окончательное).
Когда
полгода назад я написал первую часть статьи, еще не знал, что из этого выйдет.
Получилось так, что материал оказался слишком большим, и пришлось порой
«наступать на горло собственной песне». Еще раз хочу напомнить, я не претендую
на полноту изложения. Тем не менее, судя по почте, цикл статей оказался многим
полезен. Так что желаю всем дальнейших успехов.