Visual Basic, .NET, ASP, VBScript
 

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

Использование 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 SaveLayout(ByVal filename As String)

Public Sub SaveLayout(ByVal stream As System.IO.Stream)

 

Восстановление настроек:

 

C#

object.LoadLayout(String filename)

object.LoadLayout(System.IO.Stream stream)

 

VB.NET

Public Sub LoadLayout(ByVal filename As String)

Public Sub LoadLayout(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 вплоть до конкретной ячейки.

 

Заключение (окончательное).

 

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

 
     

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