Laden...

Achsenbeschriftung beim Chart fehlerhaft (Minimum & Maximum-Werte bringen Fehler)

Erstellt von Delfis vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.375 Views
D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren
Achsenbeschriftung beim Chart fehlerhaft (Minimum & Maximum-Werte bringen Fehler)

Hallo liebe C#-Nutzer,

ich möchte in einem Chart eine Funktion grafisch darstellen. Leider will die Beschriftung der x-Achse nicht so, wie ich das will. Zum einen wird bei der Definition von Mimimum- und Maximum-Wert die Fehlermeldung ausgeworfen:

Fehlermeldung:
Fehler CS0266 Der Typ "decimal" kann nicht implizit in "double" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden (möglicherweise fehlt eine Umwandlung).

Ergänze ich die Zeilen um ein Convert.ToDouble, so wird die x-Achse weder mit dem angegebenen Intervall, z. B. X_min=1 und X_max=2 beschriftet noch der Graph dargestellt. Schreibe ich hier direkt 1 und 2, wird der Graph richtig dargestellt, d. h. bei ...Points.AddXY(f2.X_min) und ...PointsAddXY(f2.X_max) werden die Typdeklarationen ohne Fehlermeldung akzeptiert.
Was muss ich ändern?


       private void funktionDarstellenMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            chart1.Series.Clear();
            chart1.Series.Add(new Series("Funktionsgraph"));
            chart1.Series[0].Points.AddXY(f2.X_min, 0);               //Hier wird die Variable akzeptiert
            chart1.Series[0].Points.AddXY(f2.X_max, 10);            //Hier wird sie auch akzeptiert
            chart1.Series[0].Color = Color.Black;
            chart1.Series[0].BorderWidth = 3;
            chart1.Series[0].ChartType = SeriesChartType.Line;
            chart1.Legends[0].Position = new ElementPosition(25, 10, 40, 20);
            chart1.Legends[0].BackColor = Color.LightGray;
            chart1.Legends[0].BorderWidth = 1;
            chart1.Legends[0].BorderColor = Color.Black;
            chart1.ChartAreas[0].AxisX.Minimum = f2.X_min;         // HIER WIRD GEMECKERT
            chart1.ChartAreas[0].AxisX.Maximum = f2.X_max;        //HIER WIRD AUCH GEMECKERT
            chart1.ChartAreas[0].AxisX.Title = "x-Achse";
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Near;
            chart1.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Arial", 8);
            chart1.ChartAreas[0].AxisY.Maximum = 11;
            chart1.ChartAreas[0].AxisY.Title = "y-Achse";
            chart1.ChartAreas[0].AxisY.TitleAlignment = StringAlignment.Far;
            chart1.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Arial", 8);
            chart1.BackColor = Color.LightGray;
            chart1.ChartAreas[0].BackColor = Color.LightBlue;

        } 

Danke!

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo liebe C#-Nutzer,

eine Lösung habe ich gefunden und würde nun gerne wissen, ob diese üblich ist oder welche sinnvoller wäre?
Zunächst einmal fiel mir auf, dass die Variablen f2.X_min und f2.X_max mit 0 belegt waren. Offensichtlich scheint es nicht dasselbe zu sein, wenn das Programm nach der Rückkehr zur aufrufenden Form in zwei privaten Programmteilen die neue Form identisch aufruft, um sich Variablenwerte zu holen:


        private void AchsenkalibrierungToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Form2 f2 = new Form2();
            DialogResult result = f2.ShowDialog();
            ...
  
        private void funktionDarstellenMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
           ...
 

Also habe ich zwei public-Variablen zu Beginn definiert und sie nach der Rückkehr aus Form2 mit den Werten belegt, die dann beim Aufbau der Grafik in der eigenen Routine die gewünschten Werte enthalten:


    public partial class Form1 : Form
    {
        public double X_min, X_max;
        public Form1()
        {
            InitializeComponent();
            
        }
...
        private void AchsenkalibrierungToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Form2 f2 = new Form2();
            DialogResult result = f2.ShowDialog();

            if (result == DialogResult.OK)
            {
                funktionDarstellenMenuItem.Enabled = true; 
                X_min = Convert.ToDouble(f2.X_min);
                X_max = Convert.ToDouble(f2.X_max);
            }
            
        }
        private void funktionDarstellenMenuItem_Click(object sender, EventArgs e)
        {
            chart1.Series.Add(new Series("Funktionsgraph"));
            chart1.Series[0].Points.AddXY(X_min, 0);
            chart1.Series[0].Points.AddXY(X_max, 10);
            chart1.Series[0].Color = Color.Black;
            chart1.Series[0].BorderWidth = 3;
            chart1.Series[0].ChartType = SeriesChartType.Line;
            chart1.Legends[0].Position = new ElementPosition(25, 10, 40, 20);
            chart1.Legends[0].BackColor = Color.LightGray;
            chart1.Legends[0].BorderWidth = 1;
            chart1.Legends[0].BorderColor = Color.Black;
            chart1.ChartAreas[0].AxisX.Minimum = X_min;
            chart1.ChartAreas[0].AxisX.Maximum = X_max;
            chart1.ChartAreas[0].AxisX.Title = "x-Achse";
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Near;
            chart1.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Arial", 8);
            chart1.ChartAreas[0].AxisY.Maximum = 11;
            chart1.ChartAreas[0].AxisY.Title = "y-Achse";
            chart1.ChartAreas[0].AxisY.TitleAlignment = StringAlignment.Far;
            chart1.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Arial", 8);
            chart1.BackColor = Color.LightGray;
            chart1.ChartAreas[0].BackColor = Color.LightBlue;
        }

Danke!

3.003 Beiträge seit 2006
vor 6 Jahren

Niemals Felder als public kennzeichnen, das ist ganz schlechter Stil. Ich sehe hier auch gar keine Notwendigkeit, sie überhaupt öffentlich zugreifbar zu machen.


private double _xMin;
private double _xMax;

[Artikel] C#: Richtlinien für die Namensvergabe beachten, du tust uns beim Lesen, und dir selbst, wenn du in einem halben Jahr das Projekt nochmal durchschaust, einen großen Gefallen.

Zweitens: der Codebehind einer Form ist ausschließlich zur Implementierung von Oberflächenlogik gedacht. Man könnte zwar bei dem von dir geposteten Code argumentieren, dass das alles tatsächlich noch UI ist, aber ich habe da so meine Zweifel, dass das auch beim kompletten Code so ist.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
523 Beiträge seit 2008
vor 6 Jahren

Offensichtlich scheint es nicht dasselbe zu sein, wenn das Programm nach der Rückkehr zur aufrufenden Form in zwei privaten Programmteilen die neue Form identisch aufruft, um sich Variablenwerte zu holen

Das liegt daran, dass Du mit zwei unterschiedlichen Instanzen von Form2 arbeitest, da Du in beiden Methoden eine neue Instanz von Form2 erstellst:

Form2 f2 = new Form2();

So nervig das auch ist, aber beschäftige Dich erstmal mit den Grundlagen von C# 😉

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo LaTino und hyperserf,

mit dem Attribut "public" hatte ich über das Ziel hinausgeschossen, das ist mir klar, denn "private" gilt an dieser Stelle klassenweit, ist geändert. Ansonsten stehe ich wie gesagt noch am Anfang und lerne, indem ich mithilfe des Visual C# 2013-Buches, Internet und diesem Forum beginne, ein erstes Programm zu schreiben. Das bitte ich bei der Beantwortung meiner Fragen zu berücksichtigen.

Danke!

Gruß
Thomas