Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von jodahush
Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Kaum zu Glauben, ich habe es hinbekommen.
Vielen Dank für deine Unterstützung.

Hier meine Lösung
So fülle ich den Chart:


            //DS is the total Dirsize
            for (int i = 0; i < DirNames.Count; i++)
            {

                try
                {
                    // if (DirSz[i]>0)
                    {//MaxV
                        int PerSz = 0;
                        if (DirSz[i] > 0)
                        {
                            long PercSize = (DirSz[i] * 100 / (MaxV));
                            PerSz = Convert.ToInt32(PercSize);
                        }
                        //index name prozentwert
                        AddLVItem(i, DirNames[i], PerSz, DirSz[i] / 1024 / 1024);

                        //FillChart
                        //Loop through DirNames and DirSizes
                        MySeries.Points.Add(DirSz[i]);
                        MySeries.Points[i].LegendText = DirNames[i];

                    }
                }
                catch (Exception e)
                {
                   
                    MessageBox.Show(e.ToString());                        //throw;
                }
            }
Und so zeige ich die Pie Legendentext an wenn ich auf das Chart klicke.


 private void chart1_MouseClick(object sender, MouseEventArgs e)
        {
            int clkdGraphPoint;
            string clkdGraphSeries = null;


            System.Windows.Forms.DataVisualization.Charting.HitTestResult result = chart1.HitTest(e.X, e.Y);
            try
            {

                clkdGraphPoint = result.PointIndex;
                if (clkdGraphPoint ≥ 0)
                {
                    clkdGraphSeries = result.Series.Points[clkdGraphPoint].LegendText;
                    StatusLabel1.Text = (clkdGraphSeries);
                    textBox1.Text = Path.GetFullPath(LastRoot + @"\" + clkdGraphSeries);
                }
                else
                {
                    StatusLabel1.Text = ("nix da!");
                }

            }
            catch (Exception)
            {

                StatusLabel1.Text = ("No valid area on chart");
                //throw;
            }
        }

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Danke.
Der Name ist blöd, hab ich bei vielen CopyPaste Aktionen irgendwo hergenommen. Da kommt jetzt was anderes hin.

Also so:
name der serie
Series MySeries = this.chart1.Series.Add(textBox1.Text);
MySeries.ChartType= SeriesChartType.Pie;
in der Schleife
//FillChart
//Loop through DirNames and DirSizes
MySeries.Points.Add(DirSz);
MySeries.Name = DirNames;

Ergebnis schon besser, allerdings zeigt die Legende nur points an

Entsprechend klappt auch der MausClick nicht mehr richtig.
Scheint das mit dem name nicht richtig zu sein: MySeries.Name = DirNames;

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Danke schön.
Tja, die Northwind database hätte ich auch gerne genutzt/das Bsp. nachgebaut. Scheint aber auch nicht zu gehen. Man kann jetzt nur die Access DB nutzen, oder?

Gut, zur Frage: Wie kann ich das BarChart als Pie darstellen.

Als Balken Chart klappt das ganze, auch soweit, dass ich interaktiv auf die Balken klicken kann und das Label sehe. Allerdings scheitere ich beim Pie (unabhängig davon sehe ich die Darstellung des Pie mittlerweile eher kritisch, weil die Anzahl der Items oft zu hoch ist. Trotzdem würde ich es gerne verstehen.).


                        Series series = this.chart1.Series.Add(DirNames[i]);
                        chart1.Series[i].ChartType = SeriesChartType.Pie;
                        series.Points.Add(DirSz[i]);
Bei diesem Beispiel führt die zweite Zeile dazu dass ich nur ein Collection Element sehe (also einen Vollkreis, kein PieChart). Es sollten aber mehrere sein. Wie gesagt, als Balkenchart klappt das ganze (ohne Zeile 2)

Die Series verstehe ich nicht. Series Serie ist eine neue Serie, zu der ich Elemente hinzufüge. Ich kann die series aber nicht als Pie definieren, sondern nur die addierten series Elemente.
Nach meiner Denke würde man mit chart1.Series auch den Typ bestimmen können. Ist aber nicht möglich. Man kann nur die Collection hinzufügen.
Der Collection (Series) kann man einen Typ verpassen - was für mich unlogisch erscheint, da ich am Ende ein Chart erzeugen könnte bei dem jede Collection ein eigener Typ ist, wobei das zu einem Laufzeit Fehler führt.

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Ich habe mich mit dem Chart rumgeschlagen und dachte ich hätte die Lösung. (Zumindest für den Chart, nicht für den Wait Cursor)
Tatsächlich klappte sie in einem Projekt mit Balkenchart.
siehe hier:


        private void chart1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            int clkdGraphPoint;
            string clkdGraphSeries = null;

            System.Windows.Forms.DataVisualization.Charting.HitTestResult result = chart1.HitTest(e.X, e.Y);
            try
            {

                clkdGraphPoint = result.PointIndex;
                if (clkdGraphPoint > 0)
                {
                    clkdGraphSeries = result.Series.Name;
                    StatusLabel1.Text = (clkdGraphSeries);
                }
                else
                {
                    StatusLabel1.Text = ("nix da!");
                }

            }
            catch (Exception)
            {
                
                StatusLabel1.Text=( "No valid area on chart");
                //throw;
            }
        }

nun habe ich hier aber ein Pie Chart und das ganze funzt nicht mehr

Vielleicht liegt es dran, wie ich das Chart gefüllt habe - selbst wenn ich ein Pie wähle wird es wieder ein BarChart


     public void BarExample()
        {
            this.chart1.Series.Clear();

            // Data arrays
            string[] seriesArray = { "Cat", "Dog", "Bird", "Monkey" };
            int[] pointsArray = { 2, 1, 7, 5 };

            // Set palette
            this.chart1.Palette = ChartColorPalette.EarthTones;

            // Set title
            this.chart1.Titles.Add("Animals");

            // Add series.
            for (int i = 0; i < seriesArray.Length; i++)
            {
                Series series = this.chart1.Series.Add(seriesArray[i]);
                series.Points.Add(pointsArray[i]);
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            BarExample();
        }

Möglicherweise muss ich die Chartelemente anders in das Chart reinschreiben. Ich habe es so gemacht:


  chart1.Series["DirSizes"].Points.AddXY(DirNames[i], DirSz[i]);
                    }

Thema: VS 2019 Comunity => .net 4.7
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

ja, was soll ich sagen. Ich habe immer das falsche Template ausgewählt :-(
Danke dafür. Jetzt geht es

Thema: VS 2019 Comunity => .net 4.7
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

upps, richtig: .NET 3.1 (3.7 gibts nicht) und .NET 5 wählen
Den SDK .net 4.7 habe ich heruntergeladen und installiert.


Aber was kann ich tun um 4.7 einzubinden?

Thema: VS 2019 Comunity => .net 4.7
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo zusammen,

ich geh im Moment einen Schritt vor und zwei zurück.
Ich habe auf meinem privaten Rechner VC2019 Comunity.
Wenn ich ein neues Projekt starte kann ich zwischen .net 3.7 und .net 5 wählen.
Das ist blöd, da nicht alle Steuerelemente von 4.7 verfügbar sind (ich wollte mit der Chart Komponente herumexperimentieren die aber bei .net 5 nicht da ist)

Im VS Installer habe ich die .net Entwicklungsumgebung mit 4.7 angekreuzt. Dennoch kann ich sie nicht auswählen.

Wenn ich in einem neuen Projekt die Program.cs ändere - von .net 5 auf 4.7, meckert die IDE.
In meinem vorigen Projekt (vom Arbeitsrechner) habe ich .net 4.7.2 genutzt und kann das auch auf dem privaten Rechner starten. D.h. irgendwo im Projekt kann man die config ändern.

Im Netz finde ich nichts passendes. Was kann ich tun?

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Ok, ich habe folgendes versucht:
Application.UseWaitCursor = true;
System.Windows.Forms.Cursor.Current = Cursors.WaitCursor;
und vice versa

Das ganze auf einer einfachen Form geklebt, mit zwei Buttons, funktioniert.
In der App habe ich es noch nicht hinbekommen.
Ich dachte mit
Application.UseWaitCursor = true;
sagt man der App - sie darf den Wait Cursor nutzen den ich dann mit Current ... ein und ausschalte.

Aber wenn ich Application.UseWaitCursor = true; in die Form Load setze sieht man die ganze zeit den Ladecursor.
In der Methode klappt es - nur manchmal! Komisch.
Ich probiere noch weiter rum.

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Vielen Dank.
Das ist schon sehr verzwickt.
Zuerst noch zum Cursor.
Warum macht MS die gleiche Klasse in verschiedene Module? Aber sei es drum.
Ich konnte deinen Code nutzen, aber der Cursor veränderte sich nicht.


using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using WinFormsCursor = System.Windows.Forms.Cursor;  //ich nehme an hier ist das using richtig
//using System.Windows.Media;
using System.Windows.Forms.DataVisualization.Charting;

//using System.Runtime.InteropServices;


namespace DirSize
{
    public partial class Form1 : Form
    {
        private static readonly HistoList histoList = new HistoList();
        private readonly HistoList Hi = histoList;
        private string myLastRoot;
        // private ListViewEx ListView1;

        public Form1()
        {
            InitializeComponent();


            LastRoot = "C:\\" + Path.DirectorySeparatorChar;
            textBox1.Text = Path.GetFullPath(LastRoot);
            Hi.AddToHist(LastRoot);//initial dir
        }
        private void ScanDirs(string dr)
        {
            
            {
                //Hier sollen die Directories u. Größe des Stammverzeichnisses rein

                var DirNames = new List<string>();
                var DirSz = new List<long>();
                // Set cursor as hourglass
                //Das liegt daran, daß in DataVisualization.Charting selber wieder eine Cursor-Klasse definiert ist.
                ////Du mußt also entweder jeweils den vollen Namensbereich beim Cursor angeben oder aber alternativ einen Aliasnamen vergeben, z.B.
                WinFormsCursor.Current = Cursors.WaitCursor; //beides compiliert funktioniert, aber der Cursor hat sich nicht verändert. Blieb auf Pfeil
                System.Windows.Forms.Cursor.Current = Cursors.WaitCursor; //zweite Methode
                //Cursor.Current = Cursors.WaitCursor;
                //if start scan, textbox entree will be the next root
                //History Liste
                if (Directory.Exists(dr))

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

das ist ja echt tricky.
Gerade experiementiere ich mit HitTest und versuche das:


 public static DataPoint GetPointAtMouse(Chart c, MouseEventArgs e)
 {
     var result = c.HitTest(e.X, e.Y);
     // If the mouse if over a data point
     if (result.ChartElementType == ChartElementType.DataPoint)
     {
         // Find selected data point
         var point = c.Series[0].Points[result.PointIndex];
         return point;
     }
     return null;
 }

Dazu brauche ich wohl :
using System.Windows.Forms.DataVisualization.Charting;

Sobald ich diese using direktive dazu setze, funktioniert Cursor.Current = Cursors.WaitCursor; nicht mehr. Wie kann denn sowas sein?

Thema: Chart1_click get series?
Am im Forum: GUI: Windows-Forms

Ich nutze einen PieChart in c#
Nun möchte ich bei DoppelClick auf ein Pie eine Referenz auf die Serie erhalten.

Ich habe folgenden Code gefunden:


        private void Chart1_Click(object sender, EventArgs e)
        {

            string[] pointData = e.PostBackValue.Split(',');
            // Add click event code here

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (DataPoint dp in this.Chart1.Series["YourSeriesName"].Points)
            {
                dp.PostBackValue = "#VALX,#VALY";
            }
        }

Leider klappt es nicht, weil DatePoint wohl nicht verfügbar ist.

Dann wollte ich System.Web.UI. zur using Liste hinzufügen, aber es ist nicht vorhanden.
Dann über Projekt / Verweis hinzufügen / Com : System.web; oder System.UI gesucht um ihn zuzufügen, aber auch dort nicht gefunden.

Wie macht man es denn richtig?

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

yep, danke an euch.
Zur IDE, soll man später alle Komponenten zur Laufzeit erstellen? Wäre mir zu aufwändig. Für die Oberfläche und zur Wiederbenutzung sind doch genau solche Sachen, wie auch die Code Snippets z.B. prop Tab Tab.


Aber prima, es läuft jetzt.
Und ja, ich habe schon die ersten Backups gestreut.
Blöd ist dabei nur, das man Code anscheinend nicht per mail verschicken kann weil da ein Virus drin sein könnte. Daher Backup in oneDrive

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

Also der Versuch eine ListViewEx in die Komponenten Toolbox einzubinden.

Neues Projekt
Vorhandenes Element hinzufügen
ListViewEx auswählen
ListViewEx.cs erscheint dann im ProjektmappenExplorer

In der Toolbox steht .... Nichts!
Dann habe ich folgenden Code in Form1.cs eingegeben und einmal gestartet:


using System.Windows.Forms;
using ListViewEmbeddedControls;

namespace TestLVex
{
    public partial class Form1 : Form
    {
        private ListViewEx ListView1;

        public Form1()
        {
            InitializeComponent();
        }


Dann plötzlich erscheint wie durch ein Wunder in meinem Test Program TestLVex in der Toolbox die ListViewEx komponente, die ich dann wie jede andere Komponente auf die Form ziehen kann.

Deklaration Listbox1 = new ListBoxEx oder sowas Fehlanzeige.
Irgendwie macht VS etwas intelligentes im Hintergrund, um die Komponente visual sichtbar zu machen, dass ich manuell nicht erkennen kann.

Über diesen Weg bekomme ich mein Programm wieder ans laufen, aber irgendwie muss ich wohl die "using" Geschichte noch besser verstehen.

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

Ich muss noch einen Schritt ausholen. Das reine Code klappt einigermaßen, aber die VS Umgebung ist für mich halt noch sehr kryptisch, zumal ich nur gelegentlich Programmiere.

Hintergrund:
Beim Rechnerupdate habe ich den größten Teil meiner C# Programme (repos auf c:\ ;-( )verloren.
DirSize war aber ziemlich nützlich, so wollte ich es nochmal anpacken.
Zum Glück habe ich noch ein Zip Archiv mit dem Code von DirSize2 (so nenne ich das Ding) gefunden.

Unzipen, VS öffnen, Starten => Dann hat VS den Namespace durch einen Platzhalter ersetzt. Ich habe versucht alle Platzhalter durch DirSize2 zu ersetzen aber irgendwann steckte ich dann auch bei zwei Fehlern in der Ressourcen Datei fest. Hier kann ich die Form1 nicht aufrufen, ohne Komponenten zu verlieren :-( Daher finde ich auch die Deklaration der ListViewEx nicht. Dein Hinweis scheint aber den Punkt zu adressieren.

Anderer Versuch alles neu machen. Methode für Methode per copy paste einsetzen. Auch dort blieb ich bei der ListViewEx Komponente hängen.

Eigentlich sollte ich jetzt zuerst mal probieren, in eine blanke Form, ListViewEx als Child von ListView zu installieren. Wie auch immer. Ich weiß nicht mehr wie ich es damals hinbekommen habe, daher muss ich nochmal von vorne einsteigen.

Ich habe daher den Code (als zip) angehängt. Da ist alles drin. Das Programm und die Komponente. Vielleicht gibt es bessere Wege hier zum Ziel zu kommen.

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

Okay danke, das werde ich morgen versuchen heute bin ich nicht mehr an dem Rechner.
Ich kann nicht die ganze Datei hochladen

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

Danke,
zumindest weiß ich dann woran es nicht liegt.

Hintergrund:
Es gab wohl eine Komponente auf Basis Listview, mit der man Schaltelemente (in meinem Fall hatte ich eine Progressbar genutzt) einbinden konnte. Den Code meines Programms habe ich noch am anderen Rechner gefunden, aber eben nicht das ganze Projekt. Jetzt habe Methode für Methode in ein neues leeres Projekt gesetzt.

Der Code für das Listview dazu war namespace ListViewEmbeddedControls. Dort findet man auch die relevante methode.

Ich denke ich muss ich ListViewEx als eigenes KontrollElement registrieren?

Thema: Namespace mit Klassen aus separater Datei nutzen
Am im Forum: Grundlagen von C#

Hallo zusammen,

ich habe seit langem wieder mal ein C# Projekt gestartet und hänge an den Basics.
Zuerst möchte ich nach Rechnertausch ein altes Programm von mir ("DirSize3") ans Laufen bekommen. Der Code unten ist richtig (lief ja schon mal) aber die aufgerufene Methode wird nicht gefunden.

In dem Fall geht es darum, einen namespace aus einer externen Datei zu nutzen.
Ich habe den Code für einen Listview in das man Controls einsetzen kann.
Die Datei heißt "ListViewEx.cs".

Zuerst mal muss sie in das Projekt. Habe das mit: (rechtsklick / hinzufügen / vorhandenes Element) gemacht. (Richtig? Geht es auch besser?)
In der Datei ist der Namespace "ListViewEmbeddedControls".

Wo muss ich jetzt welche using direktive reinschreiben, damit das Program im namespace DirSize3 den Inhalt von ListViewEx auch nutzt?
Bei Eingabe von using ListV.... gibt mir Intellisense schon den Namespace ListViewEmbeddedControls zurück.
Ich dachte soweit wäre es richtig, aber am Ende klappt es trotzdem nicht.

A


        private void AddLVItem(int key, string name, int value)
        {
            ListViewItem lvi = new ListViewItem();
            ProgressBar pb = new ProgressBar();

            lvi.SubItems[0].Text = name;
            lvi.SubItems.Add(value.ToString());

            listView1.Items.Add(lvi);
            pb.Value = value;

            listView1.AddEmbeddedControl(pb, 2, key);

        }

ber die Methode "AddEmbeddedControl" in ListViewEmbeddedControls ruft er nicht auf.


Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS1061 "ListView" enthält keine Definition für "AddEmbeddedControl", und es konnte keine zugängliche AddEmbeddedControl-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ "ListView" akzeptiert (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). DirSize3 C:\Users\abcd\source\repos\DirSize3\Form1.cs 210 Aktiv