Création d'un graphique à partir d'une datagrid

Soyez le premier à donner votre avis sur cette source.

Snippet vu 24 762 fois - Téléchargée 31 fois

Contenu du snippet

Voici une petite fonction qui permet de mettre sous forme graphique les données contenues dans une DataGrid. J'ai développé ce code dans le cadre d'un projet où je devais attaquer une base SQL et afficher des données sous forme de tableau (DataGrid). Je devais ensuite les faire apparaître sous forme graphique.

Le graphique obtenu est du type "camembert", mais il suffit de modifier la propriété "objChart.Type" pour obtenir toute sorte de graph. Les paramètres d'entrée de la fonction sont le titre du graph, et la DataTable qui correspong à la propriété DataSource de la DataGrid.

N'hésitez surtout pas à me faire part de vos critiques, même négatives (et oui, c'est comme ça qu'on avance).

Ah oui, au fait, il faut avoir au préalable ajouter le référence Microsoft Office XP Web Components.

Source / Exemple :


Imports System.IO  'pour le FilInfo
Imports OWC10      'pour les objets grahiques

Private Sub CreerGraph(ByVal strTitre As String, ByVal dTable As System.Data.DataTable)

        Dim objCSpace As New ChartSpaceClass
        Dim objChart As ChChart
        Dim objSeries As OWC10.ChSeries
        Dim strCategory As String
        Dim strValue As String
        Dim strFileName As String
        Dim intI, intJ As Integer
        Dim file_gif As FileInfo

        'S'il n'y a pas d'enregistrements da,s le DataGrid, inutile de créer le graph (on aurait un graph tout blanc : aucun intérêt)
        If dTable.Rows.Count <> 0 Then

            PictureBox1.Visible = True
            objChart = objCSpace.Charts.Add(0)
            'Type du graph (ici camembert 3D)
            objChart.Type = ChartChartTypeEnum.chChartTypePie3D

            'Titre et légendes
            objChart.HasTitle = True
            objChart.Title.Caption = strTitre
            objChart.HasLegend = True
            objChart.Legend.Border.DashStyle = OWC10.ChartLineDashStyleEnum.chLineSolid
            objChart.Legend.Position = OWC10.ChartLegendPositionEnum.chLegendPositionRight
            'Les données du graph correspondent au contenu de la Datatable qui est affiché dans un DataGrid
            For Each dRow As DataRow In dTable.Rows
                strCategory &= DataGrid1.Item(intI, 0) & ","
                strValue &= DataGrid1.Item(intI, 1).ToString.Replace(",", ".") & ","
                intI += 1
            Next
            objSeries = objChart.SeriesCollection.Add(0)
            'Mise en forme des datas dans le graph
            objSeries.SetData(ChartDimensionsEnum.chDimCategories, ChartSpecialDataSourcesEnum.chDataLiteral, strCategory)
            objSeries.SetData(ChartDimensionsEnum.chDimValues, ChartSpecialDataSourcesEnum.chDataLiteral, strValue)

            strFileName = "C:\graph.gif"
            file_gif = New FileInfo(strFileName)
            'Si le fichier existe déjà, ça signifie qu'on a déjà associé le graph à la PictureBox
            'Cette partie permet d'actualiser le graph avec les datas (si elles ont changé)
            If file_gif.Exists Then
                'On libère les ressources liées au fichier
                PictureBox1.Image.Dispose()
                file_gif.Delete()
            End If
            'Export du graph au format gif pour l'assigner à la propriété Image de la PictureBox
            objCSpace.ExportPicture(strFileName, , 400, 300)
            PictureBox1.Visible = True
            PictureBox1.Image = Image.FromFile(strFileName)
        Else
            PictureBox1.Visible = False
        End If
    End Sub

A voir également

Ajouter un commentaire

Commentaires

babina11
Messages postés
6
Date d'inscription
dimanche 11 mars 2012
Statut
Membre
Dernière intervention
22 juin 2012

bonsoir ,j'ai un petit probleme au niveau de l'importation des donnees de datagrid dans un graph.
mon prob est que dans la ligne dé (y) je doit avoir (l'annee),par exemple 2012,alors que lors de l’exécution je trouve 2000(j'ai b1 verifier avec ma base mé tt é juste)
et a la ligne d (x) une valeur calculé (vm),voici mon code et j'aime bien que vous pouvez m'aider:
Imports MySql.Data.MySqlClient
Imports MySql.Data
Imports System.Windows.Forms.DataVisualization.Charting

Public Class vmpararticle
Dim ds As DataSet = New DataSet()
Dim da As MySqlDataAdapter = New MySqlDataAdapter()
Dim con As MySqlConnection = New MySqlConnection("Data Source=localhost;Database=pfe;User ID=root;Password=root;")

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If TextBox1.Text "" Or TextBox2.Text "" Or TextBox3.Text = "" Then
MsgBox("vérifier vos parapetres")
Else
Dim con As MySqlConnection = New MySqlConnection("Data Source=localhost;Database=pfe;User ID=root;Password=root;")
Dim sql As MySqlCommand = New MySqlCommand("SELECT wo_part,sum(wo_qty_rjct)as quantite,sum(wo_qty_rjct*wo_yield_pct )as vm,year(wo_ord_date)as annee from wo_mstr where wo_ord_date<wo_due_date and wo_part like'%" + TextBox1.Text + "%' and wo_mstr.wo_status='" + TextBox3.Text + "' and year(wo_mstr.wo_ord_date)='" + TextBox2.Text + "'group by wo_part", con)
Dim dt As New DataTable
Dim ds As DataSet = New DataSet()

Dim DataAdapter1 As MySqlDataAdapter = New MySqlDataAdapter()

con.Open()

DataAdapter1.SelectCommand = sql

DataAdapter1.Fill(ds, "Product")

DataGridView2.DataSource = ds

DataGridView2.DataMember = "Product"
End If
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text "" Or TextBox2.Text "" Or TextBox3.Text = "" Then
MsgBox("vérifier vos parapetres svp")
Else
Dim ChartArea1 As ChartArea = New ChartArea() ' Créer ChartArea (zone graphique)
Dim Legend1 As New Legend() ' Créer legende
Dim series1 As New Series() 'Créer data serie (qui contiendront les DataPoint)
Dim chart1 = New Chart 'Créer un Chart

Dim annee As Integer
annee = 2012

Dim conn As MySqlConnection
conn = New MySqlConnection()
conn.ConnectionString = "Data Source=localhost;Database=pfe;User ID=root;Password=root;"

Dim sqlProducts As String = "SELECT wo_part,sum(wo_qty_rjct)as quantite,sum(wo_qty_rjct*wo_yield_pct )as vm,year(wo_ord_date)as annee from wo_mstr where wo_ord_date<wo_due_date and wo_part like'%" + TextBox1.Text + "%' and wo_mstr.wo_status='" + TextBox3.Text + "' and year(wo_mstr.wo_ord_date)='" + TextBox2.Text + "'group by wo_part"
Dim da As New MySqlDataAdapter(sqlProducts, conn)
Dim ds As New DataSet()
da.Fill(ds, "Products")
'ajouter la chart a la form
Me.Controls.Add(chart1)

ChartArea1.Name = "ChartArea1"
chart1.ChartAreas.Add(ChartArea1)
Legend1.Name = "Legend1"
chart1.Legends.Add(Legend1)
'Positionner le controle Chart
chart1.Location = New System.Drawing.Point(80, 350)
chart1.Name = "Chart1"
'On indique d'afficher ces Series sur le ChartArea1
series1.ChartArea = "ChartArea1"

series1.Legend = "Legend1"
series1.Name = "Series1"
' Ajouter les series à la collection Series du chart
chart1.Series.Add(series1)
' Dimensionner le Chart
chart1.Size = New System.Drawing.Size(800, 200)
chart1.TabIndex = 0
chart1.Text = "Chart1"

chart1.Series("Series1").XValueMember = "vm"
chart1.Series("Series1").YValueMembers = "annee"

chart1.DataSource = ds.Tables("Products")
End If

End Sub
outghouliast
Messages postés
2
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
16 août 2007

Merci Mr ce code
en fait j'ai tt essayé mais on m'a dit que ces dépendances n'existent peut etre pas surtout pour les références web.

si par hasard t'aura des éclaircissements je serai trés reconnaissant en les ayant de ta part.

merci
cs_drahcir
Messages postés
745
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
15 septembre 2009
4
Salut OUTGHOULIAST, ce bout de code a été développé avec visual studio 2003, il s'agit donc de vb.net...

Il te manque certainement des dépendances en vb6, à toi de voir si tu peux l'adapter.

Bon courage.
outghouliast
Messages postés
2
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
16 août 2007

Bonjour j'ai essayé de tester ton cofde mais ça marche pas
j'ai un visual studio 6.0 et j trouve pas la reference Microsoft office web...
en plus les déclaration des types:
System.Data.DataTable
OWC10.ChSeries
... et bien d'autres

surement j'ai du oublié un truc à faire
je ne suis en fait qu"un débutant
merci de m'avoir éclairci ces points
encore merci pour la collaboration
koutb
Messages postés
21
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
17 mai 2008

salut,
moi j'ai le meme problémé que elliot une idée merci

strCategory &= DataGrid1.Item(intI, 0) & "," ????

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.