2012-10-19 22 views
7

Ich bin auf einer Mission, ein Candlestick-Diagramm mit MSChart in einem Windows-Formular zu machen. Es ist mir bereits gelungen, ein 3D-Balkendiagramm ohne Probleme zu erstellen. Aber nach einer langen Suche im Internet, Microsoft Quellcode (WinSamples) und viel Kopfschütteln kann ich nicht den richtigen Weg finden, ein Candlestick-Diagramm zu erstellen.Candlestick mehrere Y-Werte

Was mir helfen könnte, ist ein klares Beispiel für das Hinzufügen einer Serie zu dem Diagramm mit mehreren Y-Werten oder einer Korrektur meines Codes (wenn ich laufe, wird nichts debuggt, außer für die Legendenbeschriftung).

Ein Bonus wäre, dass das Beispiel auf OleDB basiert (meine Werte sind in einer Access-Datenbank).

Also meine Frage: Wenn Sie Erfahrung mit dem Erstellen eines Candlestick-Diagramms in C# in einer Windows-Form haben, können Sie mir einen Hinweis geben oder (noch besser) können Sie mir einen C# -Code zur Verfügung stellen?

Hier ist meine aktuelle (nicht funktioniert) Code:

using System.Windows.Forms.DataVisualization.Charting; 
public partial class CandleStick : Form 
{ 
    public CandleStick() 
    { 
     InitializeComponent(); 
    } 

    private void CandleStick_Load(object sender, EventArgs e) 
    { 
     GrafiekLaden(); 
    } 

    public void GrafiekLaden() 
    { 

     Koers k = new Koers(); 
     // This method fills up a list, the data comes from my database 
     // it contains Date, High, Low, Open, Close 
     k.meerdereOphalen(); 

     Series price = new Series(); 
     chart1.Series.Add(price); 

     // Set series chart type 
     chart1.Series["price"].ChartType = SeriesChartType.Candlestick; 

     // Set the style of the open-close marks 
     chart1.Series["price"]["OpenCloseStyle"] = "Triangle"; 

     // Show both open and close marks 
     chart1.Series["price"]["ShowOpenClose"] = "Both"; 

     // Set point width 
     chart1.Series["price"]["PointWidth"] = "1.0"; 

     // Set colors bars 
     chart1.Series[0]["PriceUpColor"] = "Green"; 
     chart1.Series[0]["PriceDownColor"] = "Red"; 

     for (int i = 0; i < k.Lijst.Count; i++) 
     { 
      // adding date and high 
      chart1.Series["price"].Points.AddXY(DateTime.Parse(k.Lijst[i].Datum), k.Lijst[i].Hoog); 
      // adding low 
      chart1.Series["price"].Points[i].YValues[1] = k.Lijst[i].Laag; 
      //adding open 
      chart1.Series["price"].Points[i].YValues[2] = k.Lijst[i].PrijsOpen; 
      // adding close 
      chart1.Series["price"].Points[i].YValues[3] = k.Lijst[i].PrijsGesloten; 
     } 
    } 

Antwort

11

Ihr Code fügt eine Series nicht genannt „Preis“, dann Referenzen sowohl Series["price"] und Series[0], die die gleiche Sache nicht schon, wenn andere Serie sein wird, existieren . Ich habe eine leicht modifizierte Version (fälschen DB-Daten mit einem List<>) ohne Probleme ausgeführt. Sie sollten überprüfen, ob die Daten aus Ihrer DB in Ordnung sind.

enter image description here

public partial class Form3 : Form 
{ 
    public Form3() 
    { 
     InitializeComponent(); 
    } 

    private void CandleStick_Load(object sender, EventArgs e) 
    { 
     GrafiekLaden(); 
    } 

    public void GrafiekLaden() 
    { 
     // fake the DB data with a simple list 
     List<dbdata> k = new List<dbdata> { 
      new dbdata("1/1/2012", 10f, 8f, 9f, 9.5f), 
      new dbdata("2/1/2012", 15F, 10F, 12F, 13F), 
      new dbdata("3/1/2012", 5F, 10F, 8F, 6F), 
      new dbdata("4/1/2012", 25F, 10F, 18F, 16F) 
     }; 

     Series price = new Series("price"); // <<== make sure to name the series "price" 
     chart1.Series.Add(price); 

     // Set series chart type 
     chart1.Series["price"].ChartType = SeriesChartType.Candlestick; 

     // Set the style of the open-close marks 
     chart1.Series["price"]["OpenCloseStyle"] = "Triangle"; 

     // Show both open and close marks 
     chart1.Series["price"]["ShowOpenClose"] = "Both"; 

     // Set point width 
     chart1.Series["price"]["PointWidth"] = "1.0"; 

     // Set colors bars 
     chart1.Series["price"]["PriceUpColor"] = "Green"; // <<== use text indexer for series 
     chart1.Series["price"]["PriceDownColor"] = "Red"; // <<== use text indexer for series 

     for (int i = 0; i < k.Count; i++) 
     { 
      // adding date and high 
      chart1.Series["price"].Points.AddXY(DateTime.Parse(k[i].Datum), k[i].Hoog); 
      // adding low 
      chart1.Series["price"].Points[i].YValues[1] = k[i].Laag; 
      //adding open 
      chart1.Series["price"].Points[i].YValues[2] = k[i].PrijsOpen; 
      // adding close 
      chart1.Series["price"].Points[i].YValues[3] = k[i].PrijsGesloten; 
     } 
    } 
} 

class dbdata 
{ 
    public string Datum; 
    public float Hoog; 
    public float Laag; 
    public float PrijsOpen; 
    public float PrijsGesloten; 
    public dbdata(string d, float h, float l, float o, float c) { Datum = d; Hoog = h; Laag = l; PrijsOpen = o; PrijsGesloten = c; } 
} 
+0

Vielen Dank! Es stellt sich heraus, dass meine Datenbank einige leere Werte zurückgegeben hat (behoben) UND mit Ihren zusätzlichen Tipps/Korrekturen habe ich es endlich geschafft, mein Candlestick-Diagramm zu erstellen. Du bist der beste! – Jens