Hilfestellung zu C# Klasse

Gast #3999045
Lesenswert?
• ▲
▼
Für eine bessere Übersichtlichkeit in meiner Applikation möchte ich 
Klassen erstellen, die in jedem Fenster (Form) verwendet werden kann.
Zum Beispiel sollen alle Funktionalitäten in der ChartPlot Klasse 
abgelegt werden. In der jetzigen Applikation habe ich zwei Fenster 
(Form).
Im Fenster 1 sowie im Fenster 2 wird ein ChartPlot benutzt. die 
Objektnamen sind unterscheidlich chartPlot1 und chartPlot2. In dem 
Fenster 1 habe ich bisher alle Funktionen für den chartPlot1 
bereitgestellt. Diese sollen auch für den chartPlot2 benutzt werden. Was 
müsste die Klasse implementiert werden, das wenn ich eine Instanz von 
der Klasse chartPlot anlege auch auf das Objekt chartPlot1 sowie auf das 
Objekt chartPlot2 zugreifen kann?

Fenster 1:
1
public System.Windows.Forms.DataVisualization.Charting.Chart chartPlot1;


Fenster 2:
1
public System.Windows.Forms.DataVisualization.Charting.Chart chartPlot2;
#3999062
Lesenswert?
• ▲
▼
Programmierer schrieb:
> Zum Beispiel sollen alle Funktionalitäten in der ChartPlot Klasse
> abgelegt werden.

Ich sehe prinzipiell drei Möglichkeiten:

1) Du leitest ein eigenes Control ("MyChartPlot") von ChartPlot ab, dass 
diese Klasse um die von Dir benötigte Funktionalität erweitert. Dann 
kannst Du in allen Fenstern das MyChartPlot anstelle des regulären 
ChartPlot verwenden.

2) Du erstellst eine Hilfsklasse, der du eine ChartPlot Instanz 
übergeben kannst. Die Hilfsklasse kann dann verschiedene Dinge mit dem 
ChartPlot anstellen (Es konfigurieren, Daten einfügen etc.).

3) Du erweiterst die bestehende Klasse ChartPlot mit Extension Methods. 
Damit kannst Du der Klasse zusätzliche Funktionalität verpassen.

Da ich nicht genau weiß, was Du vorhast, kann ich Dir nicht sagen, was 
für Dich der sinnvollste Weg wäre...
Gast #3999071
Lesenswert?
• ▲
▼
Ich habe eine Anwendung mit zwei Fenstern. In jedem Fenster habe ich ein 
chartPlot eingefügt zur Visualisierung von Daten.

Im ersten Fenster Form1 habe ich bisher Methoden implementiert, für die 
Initialisierung, Zeichnen, Skalierung von Achsen. Diese Funktionen 
sollen nun in einer eigenen Klasse enthalten sein. Nur durch eine 
Instanzierung soll auf diese Methoden zugegriffen werden können.
jede Form hat im Designer nun diese Zeilen enthalten:

Form1:
1
public System.Windows.Forms.DataVisualization.Charting.Chart chartPlot1;

Form2:
1
public System.Windows.Forms.DataVisualization.Charting.Chart chartPlot2;
#3999077
Lesenswert?
• ▲
▼
Na, dann versuch es doch mal mit Weg 1).

Erstelle eine Klasse MyChartPlot und lasse die vom ChartPlot erben.
Dann baust die Funktionen aus der Form dort ein.
Wenn du dein Projekt dann das erste mal kompilierst, taucht dein 
MyChartPlot nun in der Forms-Designer Toolbox als neues Control auf.
Dann kannst du das alte ChartPlot rauswerfen, und dein Control dafür 
einfügen.
Gast #3999142
Lesenswert?
• ▲
▼
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Runtime.InteropServices;
6
using System.Net;
7
using System.Windows.Forms.DataVisualization.Charting;
8

9
namespace Tool
10
{
11
    public class MyChartPlot : ChartPlot
12
    {
13
        public void Init()
14
        {
15

16
        }
17
    }
18
}

Fehlermeldung:
Fehler  1  Der Typ- oder Namespacename "ChartPlot" konnte nicht gefunden 
werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
#3999156
Lesenswert?
• ▲
▼
Der Fehler ist ja eher trivialer Natur. Die Meldung sagt ja auch schon 
alles: du must den Namespace "usen", aus dem die ChartPlot Klasse kommt. 
Sonst weiß der Kompiler nicht, was du meinst.
Versuch mal einen Rechtsklick auf das "ChartPlot". Visual Studio sollte 
dir dann automatisch Hilfe ("Auflösen") anbieten, um das Using für dich 
einzufügen.

Ich hatte jetzt aber nicht vor, das Programm für dich zu schreiben.
Eigne dir erst mal ein paar Grundlagen an (C# Tutorials sollte es ja zu 
Hauf geben). Dann sollten solche grundlegenden Problemchen auch kein 
Problem mehr für dich darstellen...
Gast #3999172
Lesenswert?
• ▲
▼
Meine Klasse sieht jetzt mal so aus:
1
namespace Tool
2
{
3
    public class MyChartPlot : Chart
4
    {
5
        public MyChartPlot()
6
        {
7
            // ChartArea RTT
8
            ChartAreas["Chart"].AxisX.Interval = 1.0;
9
         }
10
     }
11
}

Wenn ich in meiner zweiten Form eine Instanz
1
MChartPlot _Plot = new MyChartPlot();
erzeuge, dann erscheint diese Meldung:
Ein Diagrammelement mit dem Namen 'Chart' konnte in 
'ChartAreaCollection' nicht gefunden werden.
#3999191
Lesenswert?
• ▲
▼
Programmierer schrieb:
> Wenn ich in meiner zweiten Form eine InstanzMChartPlot _Plot = new
> MyChartPlot();

Warum fügst du den Chart nicht einfach im Designer deiner Form hinzu?
Manuell im Code anlegen solltest du ihn nicht.

Programmierer schrieb:
> Ein Diagrammelement mit dem Namen 'Chart' konnte in
> 'ChartAreaCollection' nicht gefunden werden.

Joar, in deinem Constructor greifst du auf ChartAreas["Chart"] zu. Die 
ChartAreas sind aber natürlich am Anfang leer. Eine Chart Area namens 
"Chart" gibt es also nicht...

Programmierer schrieb:
> Wie kan eine Verknüpfung zwischen public
> System.Windows.Forms.DataVisualization.Charting.Chart chartPlot2;
> und der Klasse MyChartPlot hergestellt werden?

Ändere doch einfach den Datentyp von 
System.Windows.Forms.DataVisualization.Charting.Chart in deine 
MyChartPlot Klasse. (Musst du vermutlich an zwei stellen im Designer.cs 
anpassen).
Vorher aber unbedingt den Bug in deinem Konstruktur fixen, sonst lässt 
sich die Form nicht mehr mit dem Designer öffnen.
Gast #3999659
Lesenswert?
• ▲
▼
Das mit MyChartPlot Klasse funktioniert. Allerdings habe ich nur Zugriff 
auf die Methoden und Eigenschaften von Chart und nicht auf ChartAreas, 
Legend sowie Series.Wenn ich das Steuerelement in der Toolbox auf meine 
Form ziehe, dann sehe ich nur eine Instanz von chartArea1. Ich benötige 
in dem ChartPlot noch ein chartArea2, Legend und Series.

1
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
2
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
3
System.Windows.Forms.DataVisualization.Charting.Legend legend = new System.Windows.Forms.DataVisualization.Charting.Legend();
4
System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
5
System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();

Wie könnte man diese Objekte in dieser Klasse integrieren?
Gast #3999742
Lesenswert?
• ▲
▼
Sobald ich das Element auf meine Form ziehe, wird automatisch diese 
Zeile eingefügt:

System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = 
new System.Windows.Forms.DataVisualization.Charting.ChartArea();
Gast #3999761
Lesenswert?
• ▲
▼
So funktioniert es auch nicht:
1
public MyChartControl()
2
{
3
  ChartArea chartAreaTest = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
4

5
  this.ChartAreas.Add(chartAreaTop);
6
}
7

8
Sobald ich das Element auf die Form ziehe erscheint diese Zeile:
9
[c]
10
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = 
11
new System.Windows.Forms.DataVisualization.Charting.ChartArea();

Wie kann ich die automatisch generierte Zeile beeinflussen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren