Forum: PC-Programmierung Hilfestellung zu C# Klasse


von Programmierer (Gast)


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;

von Borislav B. (boris_b)


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...

von Programmierer (Gast)


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;

von Borislav B. (boris_b)


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.

von Programmierer (Gast)


Lesenswert?

Vielen Dank für deine Hilfe!

Wenn ich den Weg 1 umsetze, müsste ich in meiner C# Applikation zunächst 
ein neues Element vom Namen Schnittstelle hinzugügen?

von Borislav B. (boris_b)


Lesenswert?

Nein, keine Schnittstelle. Eine neue Klasse muss es sein.

von Programmierer (Gast)


Lesenswert?

Ok, eine Klasse habe ich nun angelegt. Wie läuft das nun mit dem Erben 
von chartPlot in der Klasse ab?

von Borislav B. (boris_b)


Lesenswert?

Programmierer schrieb:
> Ok, eine Klasse habe ich nun angelegt. Wie läuft das nun mit dem Erben
> von chartPlot in der Klasse ab?

Etwa so:
1
public class MyChartPlot : ChartPlot

: Bearbeitet durch User
von Programmierer (Gast)


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?)

von Borislav B. (boris_b)


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...

: Bearbeitet durch User
von Programmierer (Gast)


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.

von Programmierer (Gast)


Lesenswert?

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

von Borislav B. (boris_b)


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.

von Programmierer (Gast)


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?

von Borislav B. (boris_b)


Lesenswert?

Wenn du die immer in deinem Chart brauchst, könntest du sie z.B. im 
Constructor deiner Klasse erezugen.

Ungetesteter Pseudocode:
1
public MyChartPlot()
2
{
3
 this.ChartAreas.Add(new ChartArea...
4
 this.Legends.Add(new legend...
5
 usw.
6
}

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Fehlermeldung:
Ein Diagrammelement mit dem Namen 'ChartArea1' ist bereits in 
'ChartAreaCollection' vorhanden.

Funktioniert nicht!

von Programmierer (Gast)


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();

von Borislav B. (boris_b)


Lesenswert?

Programmierer schrieb:
> Fehlermeldung:
> Ein Diagrammelement mit dem Namen 'ChartArea1' ist bereits in
> 'ChartAreaCollection' vorhanden.
>
> Funktioniert nicht!

Warum willst du auch zwei Areas mit dem gleichen Namen hinzufügen? 
Tztztz ;-)

: Bearbeitet durch User
von Programmierer (Gast)


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?

von Programmierer (Gast)


Lesenswert?

Korrektur:
1
public MyChartControl()
2
{
3
  ChartArea chartAreaTest = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
4
5
  this.ChartAreas.Add(chartAreaTest);
6
}

von Programmierer (Gast)


Lesenswert?

Wenn man weiß wie es geht ist es immer einfach. Es muss mit Sicherheit 
in der Klasse von MyChartControl liegen.
Da müsste man das ganze beeinflussen können. Aber nur wie?

von Borislav B. (boris_b)


Lesenswert?

Programmierer schrieb:
> Wie kann ich die automatisch generierte Zeile beeinflussen?

Das Chart Control generiert beim Erstellen automatisch eine ChartArea, 
eine Legende etc.

Wenn du die nicht haben willst, kannst du sie ganz einfach im Designer 
löschen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.