Bygg grafer med chart-kontroller
Förord
Jag hade behov av att bygga en liten men enkel chart i asp.net, två axlar och ett enkelt linjediagram tidigare idag. Så glad i hågen och full av tillförsikt hoppade jag ut på Google och gjorde ett par sökningar efter chartkontroller som skulle fungera för mig, men döm om min förvåning när jag inte inte hittade en bra gratis kontroll! Arg som ett bi testade jag igenom de fria kontroller jag hittat och de sög verkligen.
Spontan åtgärd
Jag tog på tankemössan och irrade runt en liten stund till på Google, där hittade jag den här sidan Inga fel tänkte jag och började konvertera C#-koden till vb.net i min codebehind, väl klar så testkörde jag och fick en massa lustiga fel, framför allt fick jag ”Access Denied” som för övrigt heter ”Det finns inte tillräckligt med resurser för att öppna en annan fil.” på svenska tack vare någon som uppenbarligen inte kan engelska så bra. Och då började jag tänka till och kom fram till att...
...vem vill ha tempfiler på servern?
Inte jag i alla fall och hade ett svagt minne av en funktion som hette ”Exportpicture” eller något liknande, så jag kollade upp vad funktionen hette och skrev om koden för att få ut bilden av min graf på webbsidan. Resultatet då kan man ju fråga efter, jodå det kommer här och är välkommenterat som tusan:
Instansiera Office Web Components
För det första så måste en referens till "Office Web Components" sättas i ditt projekt. Detta gör du genom (i VS.NET) att högerklicka på References i Solution Explorer och sedan välja ”Add reference”, ur listan som dyker upp väljer du COM och letar rätt på OWC som du sedan bockar för.Skapa en datatable och fyll den med data från Northwind, hur jag gjort för att fylla min datatable kan du se på
Dim dt As DataTable = GetDataTable("CustorderHist 'ALFKI'”)
' Skapa ett graf-objekt
Dim oMyGraph As New OWC10.ChartSpaceClass()
Dim i As Integer
Dim sX, sY As String
' Loopa alla rader i min datatable och bygg en X- respektive Y-axel i form av tabseparerade strängar
For i = 0 To dt.Rows.Count – 1
sX = sX & Chr(9) & dt.Rows(i).Item(0)
sY = sY & Chr(9) & dt.Rows(i).Item(1)
Next i
' Rensa upp lite
dt.Dispose()
' Fyll grafen
With oMyGraph
.Charts.Add(0)
.Charts(0).SeriesCollection.Add(0)
.Charts(0).SeriesCollection(0).SetData(OWC10.ChartDimensionsEnum.chDimCategories, Convert.ToInt32(OWC10.ChartSpecialDataSourcesEnum.chDataLiteral), sX)
.Charts(0).SeriesCollection(0).SetData(OWC10.ChartDimensionsEnum.chDimValues, Convert.ToInt32(OWC10.ChartSpecialDataSourcesEnum.chDataLiteral), sY)
' Skapa en memorystream för att hämta det minnesområde som mitt grafobjekt skapar en bild i,
' samtidigt passar vi på att skapa bilden där också
Dim ms As New System.IO.MemoryStream(CType(.GetPicture("gif", 500, 500), Byte()))
' Skapa ett bitmapobjekt baserat på våran memorystream
Dim bmp As New System.Drawing.Bitmap(ms)
' Spara ut bitmapobjektet till webbsidan som skall presentera grafen
bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif)
' Rensa efter oss
bmp.Dispose()
ms.Close
End With
oMyGraph = Nothing
0 Kommentarer