Geschäftsdaten mit SharePoint und .NET aufbereiten

Seite 2: Steuerelemente

Inhaltsverzeichnis

Visual Studio 2010 enthält die in .NET 3.5 SP1 eingeführte Steuerelemente-Bibliothek, die sich in der Assembly System.Web.DataVisualization befindet. Hier gibt es zwei grundlegende Steuerelemente: Chart und ChartArea. Chart ist ein Container, der Daten und deren Darstellung umfasst. Die Daten können fest in den Markup-Code der Application Page integriert (<series>) oder durch Datenbindung verknüpft werden. Dabei stellt eine Serie eine Menge von Datenpunkten dar. Die Darstellung erfolgt in Elementen vom Typ <asp:ChartArea>, die in der Vorlage <chartareas> zu platzieren sind, etwa folgendermaßen:

<asp:Chart ID="myChart" runat="server" Width="700" Height="600" Palette="Excel">
<series></series>
<chartareas>
<asp:ChartArea Name="myChartArea">
<AxisX Title="Projekt Titel" />
<AxisY Title="Umsatz" />
</asp:ChartArea>
</chartareas>
</asp:Chart>

Zur Darstellung sind zumindest eine Serie und ein Darstellbereich nötig. Die Bindung kann deklarativ oder per Code erfolgen. Im deklarativen Teil verweist das Attribut DataSourceID auf die Datenquelle, zum Beispiel vom Typ SqlDataSource. Allerdings ist im Code trotzdem festzulegen, welche Spalten der Quelle der X- und der Y-Achse zugehören.

Die Bindung im Code zeigt das folgende Listing, wobei der Abruf der Daten über eine Liste mit dem Namen Financials erfolgt. Die Basisklasse LayoutsPageBase der Application Page sichert den Bezug zu SharePoint durch die Anwendung des Sicherheitsmodells und die Bereitstellung von Basisobjekten wie SPWeb. Eine Abfrage mittels SPQuery schränkt die Auswahl der Spalten auf Angaben ein, die für die Darstellung nötig sind. Dann werden die Listendaten in eine ADO.NET-DataTable konvertiert, um eine direkte Bindung zu ermöglichen:

using System; 
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Data;

namespace KPILight.Layouts.KPILight
{
public partial class Dashboard : LayoutsPageBase
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SPQuery query = new SPQuery();
query.ViewFields = @"<FieldRef Name='Title'/>
<FieldRef Name='Revenue'/>
<FieldRef Name='Costs'/>";
SPList finList = Web.Lists["Financials"];
SPListItemCollectionPosition colPos;
DataTable dt = finList.GetDataTable(query,
SPListGetDataTableOptions.None,
out colPos);
myChart.DataBindTable(dt.DefaultView, "Title");
}
}
}
}

Abbildung 2 zeigt das Ergebnis. Um diese Darstellung zu erreichen, ist das Steuerelement passend in die Application Page einzubinden. Gegenüber einer "normalen" Seite kommt noch die Registrierung des Steuerelements <asp:Chart> hinzu.

Das fertige Chart, die erste Komponente eines Dashboards (Abb. 2)

Das folgende Listing zeigt das komplette Markup der Anwendungsseite. Weitere Anregungen und Beispiele für die Gestaltung lassen sich dem Codeplex-Projekt entnehmen.

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register TagPrefix="SharePoint"
Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities"
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp" Namespace="System.Web.UI"
Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral,
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="asp"
Namespace="System.Web.UI.DataVisualization.Charting"
Assembly="System.Web.DataVisualization, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Dashboard.aspx.cs"
Inherits="KPILight.Layouts.KPILight.Dashboard"
DynamicMasterPageFile="~masterurl/default.master" %>

<asp:Content ID="PageHead"
ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
<asp:Chart ID="myChart" runat="server" Width="850" Height="400"
Palette="Excel">
<series></series>
<chartareas>
<asp:ChartArea Name="myChartArea">
<AxisX Title="Monat" />
<AxisY Title="Umsatz und Kosten" />
</asp:ChartArea>
</chartareas>
</asp:Chart>
</asp:Content>
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle"
runat="server">
Mein Dashboard
</asp:Content>
<asp:Content ID="PageTitleInTitleArea"
ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea"
runat="server">
</asp:Content>

Neben den Minimalformen für Datenquelle (Series) und Darstellungsbereich (ChartArea) bieten die Charts weitere Attribute:

  • Annotations für Bemerkungen zu einzelnen Werten
  • BorderSkin zur Gestaltung des Randbereichs
  • Legends zur Erläuterung der verwendeten Farben und Muster
  • Titles für die Beschriftung der Achsen und des Steuerelements

Zudem stehen insgesamt 35 Chart-Typen zur Auswahl. Abbildung 3 zeigt einige typische Beispiele, die unter [1] näher beschrieben sind.

Typische Chart-Beispiele (Abb. 3)

Das direkte Binden einer Tabelle an ein Chart-Steuerelement funktioniert sehr schnell, reicht aber nur für einfache Fälle aus. Stammen die Daten aus mehreren Quellen oder stehen sie nur in komplexer Form zur Verfügung, sind weitere Schritte nötig. Dazu gibt es den Zugriffsprovider Linq-To-SharePoint, dessen Prinzip in "ASP.NET Extensibility" [2] beschrieben ist.

Zudem bleiben die Grafiken mit der beschriebenen Methode statisch. Sind interaktive oder bewegliche Elemente gewünscht, lässt sich das Konzept auf Silverlight erweitern. Wie dies funktioniert, beschreibt der Artikel "Silberstreifen am Horizont" [3]. Allerdings müssen die zu Grunde liegenden Daten dann auch in Echtzeit verfügbar sein. Das ist, zumindest beim Zugriff auf ein normales Line-of-Business-System wie SAP, nur schwer umzusetzen. Zudem kann der Datenzugriff bei großen Datenmengen viel Zeit in Anspruch nehmen. Dabei ist zu beachten, dass der Zugriff über das SharePoint-Objektmodell (SPList, SPListItem) und Linq-To-SharePoint komfortabel, aber am langsamsten ist. Schneller gehen Abfragen über die Abfragesprache CAML oder den direkten Zugriff auf eine SQL-Datenbank.

Allein schon die Kombination aus SharePoint Foundation, Business Connectivity Services und Chart-Steuerelementen auf Application Pages erhöht die Produktivität bei der Entwicklung von Reporting-Funktionen. So können Anwender mit wenigen Handgriffen attraktive Auswertungen erstellen, um Geschäftskennzahlen zu visualisieren. Sämtliche Komponenten sind frei verfügbar und es fallen keine Lizenzkosten an – diese Variante ist daher für kleine und mittelständische Unternehmen attraktiv. Alternativ kann man prüfen, ob nicht auch Drittanbieter-Tools wie Nintex Analytics die Anforderungen an Auswertungen und Charts für geringe Lizenzkosten erfüllen können, da das Programmieren von Charts und Reports letztlich immer in einem Softwareentwicklungsprojekt mündet – mit den bekannten Vor- und Nachteilen.

Bernd Pehlke
ist zertifizierter SharePoint Developer und ITPro sowie MCPD ASP.NET Developer 3.5 und MCPD Windows Developer 3.5. Er arbeitet als SharePoint Consultant und Technologieberater mit Fokus auf Microsoft-Technologien bei Computacenter.

  1. Krause, Jörg; Langhirt, Christian; Sterff, Alexander; Pehlke, Bernd; Döring, Martin: "SharePoint 2010 as a Development Platform", Apress 2010
  2. Krause, Jörg: "Pro ASP.NET Extensibility", Apress 2009
  3. Krause, Jörg: "Silberstreifen am Horizont", SharePoint-Sonderheft 2009

(rl)