C# Datagridview

Gast #3824364
Hallo allerseits,

ich habe ein kleines Problem bei C# und hoffe das mir hier jemand helfen 
kann.

Es geht um die DatagridView option bei C# im Windows Form Modus. Ich 
habe ein String. Dieser heißt Data2 und hat folgendes Format/Aussehen:

122345 Hersteller Verwendung

Diese drei Begriffe (Zahl eine Herstellername und eine Verwendung) sind 
jeweils mit einem "Tab" getrennt (\t). Das Gaznze ist also eine 
eingeleseen Tab separierte Textdatei mit mehreren hunder Reihen.

Nun würde ich gerne diese Textdatei in einer Tabelle mit Hilfe der 
Datagridview anzeigen lassen. Nur leider weiß ich nicht wie ich den 
String in die Datagridview bekomme. Kann mir dabei jemand behilflich 
sein?

Hier ein QUellcodeauszug der auch Funktioniert:
private void Convert_Click(object sender, EventArgs e)
        {
            string Data = richTextBox1.Text;
            string Data2 = Data.Replace(';', '\t');
        }

Über Hilfe würde ich mich freuen.

Grüße
Basti
Zuerst mal würde ich den String aufsplitten (string.split(...)), so dass 
du die einzelnen Daten bekommst. Diese würde ich dann in die geeigneten 
Datentypen konvertieren (z.B. die Zahl mit Int32.Parse(..) parsen).

Die kannst du dann einfach deiner View hinzufügen (entsprechend 
konfigurierte Columns vorrausgesetzt:

table.Rows.Add(datum1, datum2, datum3, ...);

(oder so ähnlich)
Gast
1. Schreibe eine Klasse mit Id, Hersteller und Verwendung.

2. Teile jeden String in seine 3 Bestandteile auf (String.Split wie von 
Boris schon erwähnt); könnte/sollte man im Konstruktor der Klasse 
machen.

3. Erzeuge eine Liste aus Instanzen der genannten Klasse.

4. Binde die/das DataGridView an die Liste (DataSource).

Ob du Databinding verwenden willst, bleibt dir überlassen, aber ohne 1-3 
ist es Murks.
Gast
Vielen Dank schonmal für die Hilfe

Den String Data2 teile ich also auf. Das habe ich wie folgt gemacht.

DataTable dt = new DataTable();
            string[] tableData = Data2.Split("\t".ToCharArray(), 
StringSplitOptions.RemoveEmptyEntries);

Das \t ist dazu da, dass das System erkennt das die Trennung mit Tab 
gemacht wird.

Das Binden mache ich dann mit:

dataGridView1.DataSource = tableData;

Aber wie erkennt das System wieviel Reihen es geben wird, also Column, 
bzw. wie Teilt er die Werte auf die Reiehen auf? Das ist der Part den 
ich noch nicht so recht begriffen habe.
Gast
Sinuswechselanwalt schrieb:
> Sinuswechselanwalt

> Aber wie erkennt das System wieviel Reihen es geben wird, also Column,
> bzw. wie Teilt er die Werte auf die Reiehen auf? Das ist der Part den
> ich noch nicht so recht begriffen habe.

Per Reflection. Ich würde eine Klasse erstellen; wenn du ein paar 
Minuten wartest, schreibe ich ein kleines Beispiel. Ist aber simpel.
Gast
DataEntry.cs
1
class DataEntry
2
  {
3
    public DataEntry(string combinedData)
4
    {      
5
      // Keine Parameter für Split: Whitespace als Separator (incl. Tab).
6
      var strings = combinedData.Split();
7

8
      if(strings.Length != NumStrings) throw new ArgumentException("Falsche Anzahl von Strings im Datensatz.");
9

10
      // Exception, wenn id nicht int.
11
      SetData(Int32.Parse(strings[0]), strings[1], strings[2]);
12
    }
13

14
    public DataEntry(int id, string hersteller, string verwendung)
15
    {
16
      SetData(id, hersteller, verwendung);
17
    }
18

19
    private void SetData(int id, string hersteller, string verwendung)
20
    {
21
      Id = id;
22
      Hersteller = hersteller;
23
      Verwendung = verwendung;
24
    }
25

26
    // Einfache Methode, die Name der Spalten in einem Control festzulegen (wenn sie nicht den
27
    // Propertynamen entsprechen)
28
    [System.ComponentModel.DisplayName("Blabla")]
29
    public int Id
30
    {
31
      get { return _id; }
32
      private set
33
      {
34
        if(value < 0) throw new ArgumentException("Id darf nicht kleiner als 0 sein.");
35

36
        _id = value;
37
      }
38
    }
39

40
    [System.ComponentModel.DisplayName("Hersteller")]
41
    public string Hersteller
42
    {
43
      get { return _hersteller; }
44
      private set
45
      {
46
        if(value == null) throw new ArgumentNullException("Hersteller");
47

48
        if(value.Length < MinCharsHersteller) throw new ArgumentException("Herstellername zu kurz.");
49

50
        _hersteller = value;
51
      }
52
    }
53

54
    [System.ComponentModel.DisplayName("Verwendung")]
55
    public string Verwendung
56
    {
57
      get { return _verwendung; }
58
      private set
59
      {
60
        if(value == null) throw new ArgumentNullException("Verwendung");
61

62
        _verwendung = value;
63
      }
64
    }
65

66
    private const int NumStrings = 3;
67
    private const int MinCharsHersteller = 2;
68
    private int _id; // Aufpassen mit der Größe; evtl. String verwenden.
69
    private string _hersteller;
70
    private string _verwendung;    
71
  }

Verwendung
1
private List<DataEntry> _daten;
2
private const int MinLineLength = 10;
3
private const string DatafilePath = @"d:\_temp\data.txt";
4

5
...
6

7
// Vorsicht, Exception möglich (Dateifehler, ...).
8
var lines = File.ReadAllLines(DatafilePath);
9

10
if(lines.Any(line => line.Length < MinLineLength))
11
    throw new InvalidOperationException("Ungültige Zeile gefunden.");
12

13
_daten = lines.Select(line => new DataEntry(line)).ToList();
14

15
dataGridView.DataSource = _daten;

So in der Art, nur als Beispiel. Musst du entsprechend anpassen (und 
auch besser andere Namen wählen, nicht so ein komisches Denglish wie ich 
oben).
Gast
Bevor du dich vergeblich abmühst: Ich habe dummerweise nicht gefragt, 
welche Version von C# und .NET du verwendest. Lambdas und Linq (z.B. 
Select(line => ...) gibt es seit C# 3.0. Wenn du eine ältere Version 
benutzt, kannst du stattdessen einfach explizit Schleifen schreiben, 
z.B.

_daten = new List<DataEntry>();

// ...


foreach(var line in lines)
{
  _daten.Add(new DataEntry(line));
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.