Verwenden des WebForms ReportViewer-Steuerelements
Zum Anzeigen von Berichten, die auf einem Berichtsserver bereitgestellt werden oder sich im lokalen Dateisystem befinden, können Sie das ReportViewer-Steuerelement in WebForms verwenden, um die Berichte in einer Webanwendung zu rendern.
Verwenden des ReportViewer-Steuerelements in einer Webanwendung
Erstellen Sie eine neue Microsoft ASP.NET-Website mit Microsoft C# oder Microsoft Visual Basic.
- Oder -
Öffnen Sie eine bestehende ASP.NET-Website, und fügen Sie ein neues Webformular hinzu.
Suchen Sie im Fenster Toolbox in der Gruppe AJAX-Erweiterungen das ScriptManager-Steuerelement, und ziehen Sie es auf die Entwurfsoberfläche des Webformulars.
Wenn die Toolbox nicht sichtbar ist, können Sie über das Menü "Ansicht" darauf zugreifen, indem Sie "Toolbox" auswählen.
Suchen Sie in der Toolbox das ReportViewer-Steuerelement, und ziehen Sie es auf der Entwurfsoberfläche unter das ScriptManager-Steuerelement.
Das als „reportViewer1“ bezeichnete ReportViewer-Steuerelement wird dem Formular hinzugefügt.
Nachdem das Steuerelement dem Formular hinzugefügt wurde, wird das Smarttag "ReportViewer-Aufgaben" angezeigt, in dem Sie aufgefordert werden, einen Bericht auszuwählen. Wenn der Bericht, den Sie anzeigen möchten, auf einem Berichtsserver bereitgestellt wird, wählen Sie in der Dropdownliste "Bericht auswählen" die <Option "Serverbericht>" aus. Sobald die <Option "Serverbericht>" ausgewählt ist, werden zwei weitere Eigenschaften angezeigt: Berichtsserver-URL und Berichtspfad. Die Berichtsserver-URL entspricht der Adresse des Berichtsservers, und der Berichtspfad entspricht dem vollen Pfad zu dem Bericht, den Sie rendern möchten.
Wenn Sie einen Bericht im lokalen Modus anzeigen möchten, wählen Sie entweder die Option "Neuen Bericht entwerfen" aus, um den Berichts-Designer zu starten, oder wählen Sie einen Bericht aus, der bereits Teil des vorhandenen Projekts ist. Nachdem Sie einen Bericht ausgewählt haben, müssen Sie den Namen der RDLC-Berichtsdatei in die ReportPath-Eigenschaft des ReportViewer-Steuerelements eingeben. Diese Eigenschaft wird im Bereich Eigenschaften unter dem Knoten LocalReport angezeigt.
Beim Rendern des Berichts können Sie eines oder mehrere Elemente auf der ReportViewer-Symbolleiste ausblenden. Beispielsweise können Sie die Druckschaltfläche ausblenden. Legen Sie die folgenden ReportViewer-Eigenschaften im Bereich Eigenschaften auf FALSE fest, um Symbolleistenelemente auszublenden.
ShowBackButton
ShowExportControls
ShowFindControls
ShowPageNavigationControls
ShowPrintButton
ShowRefreshButton
ShowZoomControl
Anzeigen von Berichten im Remoteverarbeitungsmodus
Im folgenden Beispiel wird veranschaulicht, wie ein Bericht gerendert wird, der auf einem Berichtsserver bereitgestellt wird. In diesem Beispiel wird der Bericht für Auftragsdetails, der im AdventureWorks2022
-Projekt für Beispielberichte enthalten ist, verwendet.
Da im Beispiel eine integrierte Windows-Authentifizierung verwendet wird, müssen Sie zuerst den Identitätswechsel aktivieren. Hierzu fügen Sie folgende Zeile in die web.config-Datei ein:
<!-- Web.config file. -->
<identity impersonate="true"/>
Hinweis
Der Identitätswechsel ist standardmäßig deaktiviert.
C#
protected void Page_Init(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Set the processing mode for the ReportViewer to Remote
reportViewer.ProcessingMode = ProcessingMode.Remote;
ServerReport serverReport = reportViewer.ServerReport;
// Set the report server URL and report path
serverReport.ReportServerUrl =
new Uri("https://<Server Name>/reportserver");
serverReport.ReportPath =
"/AdventureWorks Sample Reports/Sales Order Detail";
// Create the sales order number report parameter
ReportParameter salesOrderNumber = new ReportParameter();
salesOrderNumber.Name = "SalesOrderNumber";
salesOrderNumber.Values.Add("SO43661");
// Set the report parameters for the report
reportViewer.ServerReport.SetParameters(
new ReportParameter[] { salesOrderNumber });
}
}
VB.NET
Imports Microsoft.Reporting.WebForms
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Init(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Init
If Not Page.IsPostBack Then
'Set the processing mode for the ReportViewer to Remote
reportViewer.ProcessingMode = ProcessingMode.Remote
Dim serverReport As ServerReport
serverReport = reportViewer.ServerReport
'Set the report server URL and report path
serverReport.ReportServerUrl = _
New Uri("https://<Server Name>/reportserver")
serverReport.ReportPath = _
"/AdventureWorks Sample Reports/Sales Order Detail"
'Create the sales order number report parameter
Dim salesOrderNumber As New ReportParameter()
salesOrderNumber.Name = "SalesOrderNumber"
salesOrderNumber.Values.Add("SO43661")
'Set the report parameters for the report
Dim parameters() As ReportParameter = {salesOrderNumber}
serverReport.SetParameters(parameters)
End If
End Sub
End Class
Anzeigen von Berichten im lokalen Verarbeitungsmodus
Das folgende Beispiel veranschaulicht, wie ein Bericht gerendert wird, der Teil der Windows-Anwendung ist und nicht auf einem Berichtsserver bereitgestellt wird.
So fügen Sie einen Verkaufsauftragsdetailbericht zu einer Website hinzu
Öffnen Sie die Website, zu der der Bericht hinzugefügt werden soll.
Aktivieren Sie im Menü Website die Option Vorhandenes Element hinzufügen.
Wechseln Sie zu der Position, an der das Projekt für AdventureWorks-Beispielberichte installiert ist.
Der Standardspeicherort lautet C:\Programme\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports.
Wählen Sie die Datei "Sales Order Detail.rdl" und dann die Schaltfläche "Hinzufügen " aus.
Die Datei Sales Order Detail.rdl sollte jetzt ein Teil des Projekts sein.
Klicken Sie mit der rechten Maustaste auf die Datei „Sales Order Detail.rdl“ im Projektmappen-Explorer, und wählen Sie Umbenennen aus. Benennen Sie den Bericht in Sales Order Detail.rdlc um, und drücken Sie die EINGABETASTE.
Wenn Projektmappen-Explorer nicht sichtbar ist, können Sie sie über das Menü "Ansicht" öffnen, indem Sie Projektmappen-Explorer auswählen.
Im folgenden Codebeispiel wird ein Dataset für die Verkaufsauftragsdaten erstellt und anschließend der Verkaufsauftragsdetailbericht im lokalen Modus gerendert.
C#
protected void Page_Init(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Set the processing mode for the ReportViewer to Local
reportViewer.ProcessingMode = ProcessingMode.Local;
LocalReport localReport = reportViewer.LocalReport;
localReport.ReportPath = "Sales Order Detail.rdlc";
DataSet dataset = new DataSet("Sales Order Detail");
string salesOrderNumber = "SO43661";
GetSalesOrderData(salesOrderNumber, ref dataset);
ReportDataSource dsSalesOrder = new ReportDataSource();
dsSalesOrder.Name = "SalesOrder";
dsSalesOrder.Value = dataset.Tables["SalesOrder"];
localReport.DataSources.Add(dsSalesOrder);
GetSalesOrderDetailData(salesOrderNumber, ref dataset);
ReportDataSource dsSalesOrderDetail = new ReportDataSource();
dsSalesOrderDetail.Name = "SalesOrderDetail";
dsSalesOrderDetail.Value = dataset.Tables["SalesOrderDetail"];
localReport.DataSources.Add(dsSalesOrderDetail);
// Create the sales order number report parameter
ReportParameter rpSalesOrderNumber = new ReportParameter();
rpSalesOrderNumber.Name = "SalesOrderNumber";
rpSalesOrderNumber.Values.Add("SO43661");
// Set the report parameters for the report
localReport.SetParameters(
new ReportParameter[] { rpSalesOrderNumber });
}
}
private void GetSalesOrderData(string salesOrderNumber,
ref DataSet dsSalesOrder)
{
string sqlSalesOrder =
"SELECT SOH.SalesOrderNumber, S.Name AS Store, " +
" SOH.OrderDate, C.FirstName AS SalesFirstName, " +
" C.LastName AS SalesLastName, E.Title AS " +
" SalesTitle, SOH.PurchaseOrderNumber, " +
" SM.Name AS ShipMethod, BA.AddressLine1 " +
" AS BillAddress1, BA.AddressLine2 AS " +
" BillAddress2, BA.City AS BillCity, " +
" BA.PostalCode AS BillPostalCode, BSP.Name " +
" AS BillStateProvince, BCR.Name AS " +
" BillCountryRegion, SA.AddressLine1 AS " +
" ShipAddress1, SA.AddressLine2 AS " +
" ShipAddress2, SA.City AS ShipCity, " +
" SA.PostalCode AS ShipPostalCode, SSP.Name " +
" AS ShipStateProvince, SCR.Name AS " +
" ShipCountryRegion, CC.Phone AS CustPhone, " +
" CC.FirstName AS CustFirstName, CC.LastName " +
" AS CustLastName " +
"FROM Person.Address SA INNER JOIN " +
" Person.StateProvince SSP ON " +
" SA.StateProvinceID = SSP.StateProvinceID " +
" INNER JOIN Person.CountryRegion SCR ON " +
" SSP.CountryRegionCode = SCR.CountryRegionCode " +
" RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " +
" LEFT OUTER JOIN Person.Contact CC ON " +
" SOH.ContactID = CC.ContactID LEFT OUTER JOIN" +
" Person.Address BA INNER JOIN " +
" Person.StateProvince BSP ON " +
" BA.StateProvinceID = BSP.StateProvinceID " +
" INNER JOIN Person.CountryRegion BCR ON " +
" BSP.CountryRegionCode = " +
" BCR.CountryRegionCode ON SOH.BillToAddressID " +
" = BA.AddressID ON SA.AddressID = " +
" SOH.ShipToAddressID LEFT OUTER JOIN " +
" Person.Contact C RIGHT OUTER JOIN " +
" HumanResources.Employee E ON C.ContactID = " +
" E.ContactID ON SOH.SalesPersonID = " +
" E.EmployeeID LEFT OUTER JOIN " +
" Purchasing.ShipMethod SM ON SOH.ShipMethodID " +
" = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" +
" S ON SOH.CustomerID = S.CustomerID " +
"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)";
SqlConnection connection = new
SqlConnection("Data Source=(local); " +
"Initial Catalog=AdventureWorks; " +
"Integrated Security=SSPI");
SqlCommand command =
new SqlCommand(sqlSalesOrder, connection);
command.Parameters.Add(
new SqlParameter("SalesOrderNumber",
salesOrderNumber));
SqlDataAdapter salesOrderAdapter = new
SqlDataAdapter(command);
salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder");
}
private void GetSalesOrderDetailData(string salesOrderNumber,
ref DataSet dsSalesOrder)
{
string sqlSalesOrderDetail =
"SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " +
" SOD.UnitPrice, CASE WHEN " +
" SOD.UnitPriceDiscount IS NULL THEN 0 " +
" ELSE SOD.UnitPriceDiscount END AS " +
" UnitPriceDiscount, SOD.LineTotal, " +
" SOD.CarrierTrackingNumber, " +
" SOD.SalesOrderID, P.Name, P.ProductNumber " +
"FROM Sales.SalesOrderDetail SOD INNER JOIN " +
" Production.Product P ON SOD.ProductID = " +
" P.ProductID INNER JOIN " +
" Sales.SalesOrderHeader SOH ON " +
" SOD.SalesOrderID = SOH.SalesOrderID " +
"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " +
"ORDER BY SOD.SalesOrderDetailID";
using (SqlConnection connection = new
SqlConnection("Data Source=(local); " +
"Initial Catalog=AdventureWorks; " +
"Integrated Security=SSPI"))
{
SqlCommand command =
new SqlCommand(sqlSalesOrderDetail, connection);
command.Parameters.Add(
new SqlParameter("SalesOrderNumber",
salesOrderNumber));
SqlDataAdapter salesOrderDetailAdapter = new
SqlDataAdapter(command);
salesOrderDetailAdapter.Fill(dsSalesOrder,
"SalesOrderDetail");
}
}
VB.NET
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Reporting.WebForms
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Init(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Init
If Not Page.IsPostBack Then
'Set the processing mode for the ReportViewer to Local
reportViewer.ProcessingMode = ProcessingMode.Local
Dim localReport As LocalReport
localReport = reportViewer.LocalReport
localReport.ReportPath = "Sales Order Detail.rdlc"
Dim dataset As New DataSet("Sales Order Detail")
Dim salesOrderNumber As String = "SO43661"
'Get the sales order data
GetSalesOrderData(salesOrderNumber, dataset)
'Create a report data source for the sales order data
Dim dsSalesOrder As New ReportDataSource()
dsSalesOrder.Name = "SalesOrder"
dsSalesOrder.Value = dataset.Tables("SalesOrder")
localReport.DataSources.Add(dsSalesOrder)
'Get the sales order detail data
GetSalesOrderDetailData(salesOrderNumber, dataset)
'Create a report data source for the sales
'order detail data
Dim dsSalesOrderDetail As New ReportDataSource()
dsSalesOrderDetail.Name = "SalesOrderDetail"
dsSalesOrderDetail.Value = _
dataset.Tables("SalesOrderDetail")
localReport.DataSources.Add(dsSalesOrderDetail)
'Create a report parameter for the sales order number
Dim rpSalesOrderNumber As New ReportParameter()
rpSalesOrderNumber.Name = "SalesOrderNumber"
rpSalesOrderNumber.Values.Add("SO43661")
'Set the report parameters for the report
Dim parameters() As ReportParameter = {rpSalesOrderNumber}
localReport.SetParameters(parameters)
End If
End Sub
Private Sub GetSalesOrderData(ByVal salesOrderNumber As String, _
ByRef dsSalesOrder As DataSet)
Dim sqlSalesOrder As String = _
"SELECT SOH.SalesOrderNumber, S.Name AS Store, " & _
" SOH.OrderDate, C.FirstName AS SalesFirstName, " & _
" C.LastName AS SalesLastName, E.Title AS " & _
" SalesTitle, SOH.PurchaseOrderNumber, " & _
" SM.Name AS ShipMethod, BA.AddressLine1 " & _
" AS BillAddress1, BA.AddressLine2 AS " & _
" BillAddress2, BA.City AS BillCity, " & _
" BA.PostalCode AS BillPostalCode, BSP.Name " & _
" AS BillStateProvince, BCR.Name AS " & _
" BillCountryRegion, SA.AddressLine1 AS " & _
" ShipAddress1, SA.AddressLine2 AS " & _
" ShipAddress2, SA.City AS ShipCity, " & _
" SA.PostalCode AS ShipPostalCode, SSP.Name " & _
" AS ShipStateProvince, SCR.Name AS " & _
" ShipCountryRegion, CC.Phone AS CustPhone, " & _
" CC.FirstName AS CustFirstName, CC.LastName " & _
" AS CustLastName " & _
"FROM Person.Address SA INNER JOIN " & _
" Person.StateProvince SSP ON " & _
" SA.StateProvinceID = SSP.StateProvinceID " & _
" INNER JOIN Person.CountryRegion SCR ON " & _
" SSP.CountryRegionCode = SCR.CountryRegionCode " & _
" RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " & _
" LEFT OUTER JOIN Person.Contact CC ON " & _
" SOH.ContactID = CC.ContactID LEFT OUTER JOIN" & _
" Person.Address BA INNER JOIN " & _
" Person.StateProvince BSP ON " & _
" BA.StateProvinceID = BSP.StateProvinceID " & _
" INNER JOIN Person.CountryRegion BCR ON " & _
" BSP.CountryRegionCode = " & _
" BCR.CountryRegionCode ON SOH.BillToAddressID " & _
" = BA.AddressID ON SA.AddressID = " & _
" SOH.ShipToAddressID LEFT OUTER JOIN " & _
" Person.Contact C RIGHT OUTER JOIN " & _
" HumanResources.Employee E ON C.ContactID = " & _
" E.ContactID ON SOH.SalesPersonID = " & _
" E.EmployeeID LEFT OUTER JOIN " & _
" Purchasing.ShipMethod SM ON SOH.ShipMethodID " & _
" = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" & _
" S ON SOH.CustomerID = S.CustomerID " & _
"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)"
Using connection As New SqlConnection( _
"Data Source=(local); " & _
"Initial Catalog=AdventureWorks; " & _
"Integrated Security=SSPI")
Dim command As New SqlCommand(sqlSalesOrder, connection)
Dim parameter As New SqlParameter("SalesOrderNumber", _
salesOrderNumber)
command.Parameters.Add(parameter)
Dim salesOrderAdapter As New SqlDataAdapter(command)
salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder")
End Using
End Sub
Private Sub GetSalesOrderDetailData( _
ByVal salesOrderNumber As String, _
ByRef dsSalesOrder As DataSet)
Dim sqlSalesOrderDetail As String = _
"SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " & _
" SOD.UnitPrice, CASE WHEN " & _
" SOD.UnitPriceDiscount IS NULL THEN 0 " & _
" ELSE SOD.UnitPriceDiscount END AS " & _
" UnitPriceDiscount, SOD.LineTotal, " & _
" SOD.CarrierTrackingNumber, " & _
" SOD.SalesOrderID, P.Name, P.ProductNumber " & _
"FROM Sales.SalesOrderDetail SOD INNER JOIN " & _
" Production.Product P ON SOD.ProductID = " & _
" P.ProductID INNER JOIN " & _
" Sales.SalesOrderHeader SOH ON " & _
" SOD.SalesOrderID = SOH.SalesOrderID " & _
"WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " & _
"ORDER BY SOD.SalesOrderDetailID"
Using connection As New SqlConnection( _
"Data Source=(local); " & _
"Initial Catalog=AdventureWorks; " & _
"Integrated Security=SSPI")
Dim command As New SqlCommand(sqlSalesOrderDetail, _
connection)
Dim parameter As New SqlParameter("SalesOrderNumber", _
salesOrderNumber)
command.Parameters.Add(parameter)
Dim salesOrderDetailAdapter As New SqlDataAdapter(command)
salesOrderDetailAdapter.Fill(dsSalesOrder, _
"SalesOrderDetail")
End Using
End Sub
End Class