Forum: PC-Programmierung C# Datagridview


von Basti (Gast)


Lesenswert?

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

von Borislav B. (boris_b)


Lesenswert?

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)

von Sinuswechselanwalt (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

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.

von Sinuswechselanwalt (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

Okay gerne warte ich

von Sinuswechselanwalt (Gast)


Lesenswert?

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

von SinuswechselanwaltMitAlzheimer (Gast)


Lesenswert?

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

von Basti (Gast)


Lesenswert?

Vielen Dank für die Hilfe

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.