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)
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.
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.
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.
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).
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)); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.