Теперь, когда я кратко изложил основные принципы создания простых отчетов, давайте перейдем к более сложным вопросам. Подобно тому, как создаются строго типизированные наборы DataSets со своими атрибутами и методами, можно создать строго типизированные отчеты. По своему существу все отчеты, созданные с помощью Crystal Reports и Visual Studio .NET, составляют класс строго типизированных отчетов в качестве побочного продукта самого процесса разработки. Чтобы в этом убедиться, щелкните по кнопке Show All Files (Показать все файлы) в Solution Explorer, перейдите по иерархическому дереву к CustomersBasic.rpt и убедитесь в существовании файла класса, созданного Visual Studio .NET. Я могу создать экземпляр этого класса в программе и назначить его атрибуту ReportSource объекта CrystalReportViewer, содержащегося в моей форме. Для этого я добавлю следующую строку текста программы к событию формы Load (установив атрибут ReportSource формы cvwMain в None в первом окне Properties).
cvwMain.ReportSource = New CustomersBasic()
Подобно строго типизированным наборам DataSets, которые используют разработчик компонентов DataSet, строго типизированные отчеты также имеют соответствующий разработчик компонентов. Если щелкнуть по палитре компонентов Components окна Toolbox в Visual Studio .NET, появится объект под названием ReportDocument. Перетащив его на свою форму, вы увидите имя класса вашего отчета в раскрывающемся списке Name диалогового окна Choose a ReportDocument. Выберите его и щелкните по кнопке OK. Вы получите исполняемый доступный экземпляр класса вашего отчета. Переименуйте этот объект в cbsMain (cbs является префиксом CustomersBasic) и замените следующей строкой текста программы в событии формы Load:
cvwMain.ReportSource = cbsMain
Если вы сейчас снова запустите приложение, то ваш отчет запустится, как и прежде. Этот запуск отличается от предыдущего тем, что, не ссылаясь на конкретный файл, находящийся в конкретном физическом месте, ReportViewer обращается непосредственно к объекту, который может выступать в качестве экземпляра, полученного из соответствующего класса в сборке приложения, внешней сборке или, как вы увидите далее, в XML Web Service.
Dim tbCurrent As CrystalDecisions.CrystalReports.Engine.Table Dim tliCurrent As CrystalDecisions.Shared.TableLogOnInfo For Each tbCurrent In cbsMain.Database.Tables tliCurrent = tbCurrent.LogOnInfo With tliCurrent.ConnectionInfo .ServerName = "localhost" .UserID = "ReportUser" .Password = "msdn" .DatabaseName = "Northwind" End With tbCurrent.ApplyLogOnInfo(tliCurrent) Next tbCurrent |