Autor Beitrag
gabele
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 19.03.10 18:39 
Hallo,
bin vollkommen neu hier und hoffe das ich dieses neue Thema an der richtigen Stelle erstellt habe.
Meine Frage dürfte für die meisten recht simpel sein.

Ich lese aus einer csv-Datei drei Messwerte aus und lege diese in einer double ArrayList ab. Nun möchte ich diese Werte in Form einer Tabelle ausgeben. Dafür habe ich meiner Oberfläche ein DataGridView hinzugefügt und als Datenquelle mein Objekt Messdaten ausgewählt. Danach erscheinen auch schon die angelegten Atrribute (Zeit,Frequenz,Puls) des Objektes Messdaten in der Tabelle als Spaltenheadertext.
Wie kann ich denn jetzt die Tabelle bzw. Spalten mit Werten füllen? Habe schon viel versucht, bekomme aber diese Daten einfach nicht in die Tabelle.
Ich hoffe das mir hier jemand helfen kann, danke!

Gruß
Fabian
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 19.03.10 19:12 
Hallo Fabian und :welcome:

Du benutzt viele Begriffe mehr oder weniger durcheinander: ArrayList, Tabelle, Objekt Messdaten, Spalten dort, wo du Zeilen meinst.

Erstens: Vergiss ArrayList; eine double-ArrayList gibt es sowieso nicht, weil ArrayList nur object speichern kann.

Zweitens: Tabelle ist schon mal nicht schlecht. Unter .NET heißt das Ding DataTable und besteht aus Spalten (Columns) und Zeilen (Rows). Was du "Attribute" nennst, sind Spalten. Definiere die Spalten nach den drei Messwerten und lege den Typ auf double fest. Lies die Datei zeilenweise ein und übertrage die Werte in jeweils eine Zeile, die mit NewRow erzeugt und mit Rows.Add hinzugefügt wird.

Drittens: Füge diese DataTable als DataSource an dein DataGridView an, und alle Daten werden angezeigt und können auch bearbeitet werden.

Alternativ: Du kannst eine eigene Klasse Messdaten (mit je einem Wert für Zeit,Frequenz,Puls) erstellen. Eine List<Messdaten> ist genauso als DataSource geeignet.

Ich hoffe, ich habe jetzt nicht zu viele Informationen gegeben. Aus der SDK-Doku/MSDN/Hilfe brauchst du zu den Stichworten noch die erforderlichen Erläuterungen und Beispiele.

Gruß Jürgen

PS. Zu WinForms gehört das DataGridView. Dein eigentliches Problem ist die Verarbeitung der Daten, also wäre Datenbanken oder Basistechnologien besser.
gabele Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 19.03.10 20:07 
Hallo Jürgen,
zunächst mal vielen Dank für die schnelle Antwort.
Hab leider nicht alles verstanden, was du versucht hast mir zu erklären.
Was du mir als Alternative vorgeschlagen hast (das mit der List<Messdaten> und den Werten Zeit,Frequenz, Puls) habe ich schon. Benutze diese Klasse auch schon als DataSource, wodurch auch die Spaltennamen auch schon stimmen. Ist wohl leider bei meiner Schilderung nicht richtig rüber gekommen.
Die Daten bekomme ich allerdings immer noch nicht in die Tabelle. Versuch die Daten schon mit messwert.tabelle.add(m.HerzFrequenz) irgendwie hineinzubekommen. Wo kann ich denn den Datentyp der Tabelle festlegen, bzw. kann man vielleicht nur Strings übergeben?
Könntest du mir bitte nocheinmal helfen?

Danke schon mal nach Berlin aus em tiefen Schwarzwald.

Gruß Fabian
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 19.03.10 20:39 
Ganz einfach:
ausblenden C#-Quelltext
1:
2:
List<Messwert> messdaten = new List<Messwert>();
messdaten.Add( new Messwert(a, b, c) );

Das bedeutet: Du benötigst einen Konstruktor der Klasse Messwert, der die drei Werte entgegennimmt. Es geht natürlich auch auf dem Standardweg:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
List<Messwert> messdaten = new List<Messwert>();
Messwert current = new Messwert();
current.HerzFrequenz = a;
current.Puls = b;
current.Zeit = c;   // Achtung: eine Zeitdauer sollte ein TimeSpan sein, kein double!
messdaten.Add(current);

Als DataSource darf nicht Messwert verwendet werden, sondern messdaten (nämlich die Liste).

Für Add wird immer ein Objekt der zugrundeliegenden Klasse benötigt, nicht ein einzelner Wert. Das ist einer der Gründe, warum ein Versuch mit messwert.tabelle.add(m.HerzFrequenz) ziemlich daneben ist.

Ich habe den Eindruck, dass du dich zunächst mit Klassen, Objekten und Eigenschaften befassen musst. Damit ich beim nächsten Mal nicht mehr ins Blaue hinein antworten muss, bitte ich dich, etwas von deinem Code anzugeben, nämlich die Definition der Klasse und die Zusammenarbeit mit der Liste.

Gruß Jürgen
gabele Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 20.03.10 14:05 
Hallo Jürgen,

ja ich weiß das ich noch schwierigkeiten mit der objetorientierten Programmierung habe. Muss aber das Projekt für meine Studienarbeit vorantreiben.
Das mit der List <Messwert> anlegen habe ich schon genau so gemacht wie du gesagt hast.
Hier der Quellcode der Datei Messdaten.cs:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
class Messdaten
  {
    private List<Messwert> messwerte = new List<Messwert>();

    public List<Messwert> einlesen(string pfadName)
    {
      StreamReader myReader = new StreamReader(pfadName);
      string tempValues;
      string[] messValues = new string[3];
      
      while (true)
      {
        tempValues = myReader.ReadLine();
        if (tempValues == null//Prüfen ob keine weiteren Messdaten vorhanden sind
        {
          break;
        }
        if (tempValues.StartsWith("X")) //Tabellenbeschreibeungen ausfiltern
        {
          continue;
        }
        Messwert mw = new Messwert();
        messValues = tempValues.Split(';');
        mw.XWert = Convert.ToDouble(messValues[0]);
        mw.HerzFrequenz = Convert.ToDouble(messValues[1]);
        mw.Puls = Convert.ToDouble(messValues[2]);
        messwerte.Add(mw);
        
      }
      return messwerte;
    
      
    }
    public List<Messwert> Messwerte
    {
      get
      {
        return messwerte;
      }
      set
      {
        messwerte = value;
      }
    }


Und hier möchte ich die Tabelle irgendwie mit den Daten füllen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private void buttonMessdatenEinlesen_Click(object sender, EventArgs e)
    {
      messdaten.Messwerte = messdaten.einlesen(textBoxMessdatenPfad.Text);
      Messwert m = new Messwert();
      
      /*dataGridView1.Columns.Add("Zeit", "Zeit");
      dataGridView1.Columns.Add("Herzfrequenz", "Herzfrequenz");
      dataGridView1.Columns.Add("Puls", "Puls");
      dataGridView1.
      //messwertTabelle.Add(messdaten.Messwerte);
      //messdaten.Messwerte[0];*/

          }

Hoffe du hast jetzt einen besseren überblick und kannst mir konkreter helfen.
Danke!
Gruß Fabian
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 20.03.10 14:43 
Hallo Fabian,

in der Tat, ich hätte mir eine Reihe von Erläuterungen sparen können. Ich hätte es nicht viel anders gemacht (nur bei ein paar Kleinigkeiten). Der Rest sollte so gehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void buttonMessdatenEinlesen_Click(object sender, EventArgs e)
{
    messdaten.Messwerte = messdaten.einlesen(textBoxMessdatenPfad.Text);
    dataGridView1.AutoGenerateColumns = true;     // nicht unbedingt erforderlich  
    dataGridView1.DataSource = messdaten.Messwerte;
}

Alles andere sollte automatisch gehen.

Zu den "Kleinigkeiten":

1. Folgendes möchte ich fast als Quatsch bezeichnen:
ausblenden C#-Quelltext
1:
messdaten.Messwerte = messdaten.einlesen(textBoxMessdatenPfad.Text);					

Die Methode einlesen schreibt die Daten in die interne Liste messwerte und gibt sie gleichzeitig als Rückgabewert zurück. Dann weist du die zurückgegebene Liste wieder an messdaten.Messwerte, sodass sie dort nochmal eingetragen wird.

Vorschlag: Gib der Methode einen bool-Rückgabewert, ob das Einlesen erfolgreich war oder nicht. Wenn es funktionierte, bekommst du (wie in meiner o.g. letzten Zeile) die Messwerte jederzeit zur Verfügung gestellt.

2. Hier ist nur Deklaration nötig, keine Initialisierung:
ausblenden C#-Quelltext
1:
string[] messValues = new string[3];					

Durch das spätere String.Split wird messValues immer ein neues String-Array zugewiesen.

3. Statt StreamReader würde ich File.ReadAllLines benutzen. Das liest die gesamte Datei am Stück ein und erspart eine Reihe von Zusatzprüfungen; z.B. fehlt bei dir myReader.Close und Dispose.

4. Äußerst wichtig ist, Convert.ToDouble zu ersetzen durch double.TryParse. Gerade beim Einlesen aus Textdateien (und bei der Eingabe in Textboxen) können durch unzulässige Zeichen Fehler auftreten; diese sollten nicht zu einer Exception führen, sondern direkt abgefangen werden.

Ich glaube, du bist auf einem guten Weg; schönes Wochenende! Jürgen
gabele Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 20.03.10 15:29 
Hi Jürgen,
das dataGridView1.DataSource war die Lösung! Danke ebenfalls für die anderen Tipps und Hinweise!
Wünsche dir ebenfalls ein schönes Wochenende!

Gruß Fabian