Benutzer mit den meisten Antworten
DataGridView Row hinzufügen von 3 for-Schleifen

Frage
-
Guten Tag,
ich habe gerade keine Idee mehr, wie es klappen könnte. Ich habe 3 for-Schleifen und möchte somit in 3 Columns eine neue Row hinzufügen. Jede Schleife soll ihr "Ergebnis" in eine Column schreiben.Das sind die for-Schleifen:
//1. Schleife für 1. Column XmlNodeList elemList = doc.GetElementsByTagName("title"); for (int i = 0; i < elemList.Count; i++) { dataGridView1.Rows.Add(elemList[i].InnerXml); } //2. Schleife für 2. Column XmlNodeList description = doc.GetElementsByTagName("description"); for (int i = 0; i < description.Count; i++) {
dataGridView.Rows.Add(description[i].InnerXml; } //3. Schleife für 3. Column for (int i = 0; i < items.Count; i++) { var encImg = (items[i].SelectSingleNode("enclosure").Attributes["url"].Value); }
Habt ihr Ideen? Vielen Dank,
Klaus
- Bearbeitet Klaus Günther Samstag, 17. August 2019 08:53 Codeänderungen
Antworten
-
Hi,
hier ein Vorschlag. Damit erhältst du erst einmal die gewünschten Daten. Das kannst du anpassen, z.B. könntest du statt der anonymen Klassen eine eigene Klasse definieren und ggf. mit weiteren Eigenschaften versehen. Dies liefert dir einfach nur eine Liste mit den gewünschten Informationen, die du dann noch in dein Grid verfrachten kannst:
using System; using System.Linq; using System.Xml.Linq; class Program { static void Main(string[] args) { // Xml-Daten verarbeiten... XElement xe = XElement.Load("https://www.ndr.de/podcast/podcast2974.xml"); var items = xe.Elements("channel") .Elements("item") .Select(itm => new { Description = itm.Element("description").Value.ToString(), Title = itm.Element("title").Value.ToString() }).ToList(); // Ergebnisse ausgeben... foreach (var item in items) { Console.WriteLine(item.Title); Console.WriteLine(item.Description); Console.WriteLine(); } Console.ReadKey(); } }
Gruß
- Bearbeitet K. Pater Sonntag, 18. August 2019 12:36
- Als Antwort markiert Klaus Günther Sonntag, 18. August 2019 13:59
-
Ändere von:
Path = itm.Element("enclosure type").Attribute("url").Value.ToString()
zu (also " type" löschen)
Path = itm.Element("enclosure").Attribute("url").Value.ToString()
dann sollte das gehen.
Und mit beiden Attributen:
var items = xe.Elements("channel") .Elements("item") .Select(itm => new { Description = itm.Element("description").Value.ToString(), Title = itm.Element("title").Value.ToString(), Path = itm.Element("enclosure").Attribute("url").Value.ToString(), Type = itm.Element("enclosure").Attribute("type").Value.ToString() }).ToList();
- Als Antwort markiert Klaus Günther Sonntag, 18. August 2019 13:59
- Bearbeitet K. Pater Sonntag, 18. August 2019 13:59 Nachtrag, Ergänzung
Alle Antworten
-
Hi,
kannst du mal einen Beispiel-Ausschnitt deiner XML-Datei hier zeigen?
Willst du die 3 Daten nicht jeweils in einer Reihe haben?
Hast du mal versucht, die XML-Datei einfach in ein DataSet oder eine DataTable einzuladen und diese(s) dann an die DataSource-Eigenschaft des Grids zu binden?
Gruß
-
Hallo Klaus,
schau doch dieses Beispiel an.
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.datagridview.rows?view=netframework-4.8Wenn Du diesen Teil entsprechen anpasst:
// Populate the rows. string[] row1 = new string[] { "Meatloaf", "Main Dish", "ground beef", "**" };
sollte das hier, ebenfalls angepasst, die Sache erledigen:
dataGridView1.Rows.Add(rowArray); -
Danke, ich habe es mitlerweile selber hinbekommen, scheitere jetzt aber an einem Problem mit XML.
XmlNodeList title = doc.GetElementsByTagName("title"); for (int i = 0; i < title.Count; i++) { dataGridView1.Rows[i].Cells[0].Value = title[i].InnerXml; }
Das Problem ist, dass ich gerne nur die "title" hätte, die unter <item> stehen, und damit nicht das erste title, was GetElementsByTagName findet.
Ich habe es schon mit doc.GetElementsByTagName("/channel/item/title"); versucht, klappte leider nicht.Habt ihr eine Idee?
-
Keiner eine Idee?
Doch, aber Du gibst leider nicht die benötigten Infos preis.
Poste die XML Datei (falls die sehr groß ist, stell sie in deinen Onedrive Account und poste den Link) und sag uns dann genau zu dieser XML Datei, was Du auslesen willst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Okay, hier die XML-Datei:
https://www.ndr.de/podcast/podcast2974.xml
Da ich mit der o.g. Methode nach title und noch nach description suchen möchte, sucht er natürlich die gesamte Datei durch. Ich möchte aber nur title und description nach item haben und nicht
<title>NDR 2- Der Kurier... </title> und auch nicht
<description>Die TOP-Themen des Tages... </description>- Bearbeitet Klaus Günther Sonntag, 18. August 2019 10:15 Erläuterung
-
Hi,
hier ein Vorschlag. Damit erhältst du erst einmal die gewünschten Daten. Das kannst du anpassen, z.B. könntest du statt der anonymen Klassen eine eigene Klasse definieren und ggf. mit weiteren Eigenschaften versehen. Dies liefert dir einfach nur eine Liste mit den gewünschten Informationen, die du dann noch in dein Grid verfrachten kannst:
using System; using System.Linq; using System.Xml.Linq; class Program { static void Main(string[] args) { // Xml-Daten verarbeiten... XElement xe = XElement.Load("https://www.ndr.de/podcast/podcast2974.xml"); var items = xe.Elements("channel") .Elements("item") .Select(itm => new { Description = itm.Element("description").Value.ToString(), Title = itm.Element("title").Value.ToString() }).ToList(); // Ergebnisse ausgeben... foreach (var item in items) { Console.WriteLine(item.Title); Console.WriteLine(item.Description); Console.WriteLine(); } Console.ReadKey(); } }
Gruß
- Bearbeitet K. Pater Sonntag, 18. August 2019 12:36
- Als Antwort markiert Klaus Günther Sonntag, 18. August 2019 13:59
-
Danke! Das hat mir sehr geholfen.
Ich möchte nun noch die 3. Spalte füllen, und zwar mit dem Link zur .mp3-Datei, welche sich unter <enclosure type> und dann <url> befindet. Dazu habe ich zu deinem Beispiel noch "Path" hinzugefügt:
XElement xe = XElement.Load(textBox1.Text); var items = xe.Elements("channel") .Elements("item") .Select(itm => new { Description = itm.Element("description").Value.ToString(), Title = itm.Element("title").Value.ToString(), Path = itm.Element("enclosure type").Attribute("url").Value.ToString() }).ToList(); // Ergebnisse ausgeben... foreach (var item in items) { dataGridView1.Rows.Add(item.Title, item.Description, item.Path); }
Doch das funktioniert nicht, da ich folgende Fehlermeldung bekomme:
Das ' '-Zeichen, hexidezimaler Wert 0x20, darf nicht in einem Namen enthalten sein.
Vorher habe ich das Problem folgendermaßen gelöst:
XmlNodeList items2 = doc.SelectNodes("//item"); for (int i = 0; i < items2.Count; i++) { var encImg = (items2[i].SelectSingleNode("enclosure").Attributes["url"].Value); dataGridView1.Rows[i].Cells[2].Value = encImg; }
Kannst du mir da vielleicht noch einmal kurz helfen bitte?
Danke -
Ändere von:
Path = itm.Element("enclosure type").Attribute("url").Value.ToString()
zu (also " type" löschen)
Path = itm.Element("enclosure").Attribute("url").Value.ToString()
dann sollte das gehen.
Und mit beiden Attributen:
var items = xe.Elements("channel") .Elements("item") .Select(itm => new { Description = itm.Element("description").Value.ToString(), Title = itm.Element("title").Value.ToString(), Path = itm.Element("enclosure").Attribute("url").Value.ToString(), Type = itm.Element("enclosure").Attribute("type").Value.ToString() }).ToList();
- Als Antwort markiert Klaus Günther Sonntag, 18. August 2019 13:59
- Bearbeitet K. Pater Sonntag, 18. August 2019 13:59 Nachtrag, Ergänzung