3 Stimmen

DataGridView, das mit den Ergebnissen einer LINQ-Abfrage gefüllt ist, kann nicht bearbeitet werden

Wenn ich die Ergebnisse einer Linq-zu-Xml-Abfrage verwende, um eine Datagridview zu füllen, kann ich die Datagridview nicht bearbeiten. Ich habe versucht, die Readonly-Eigenschaft der Datagridview auf false zu setzen, und das hilft nicht. Ich habe auch einen Ereignishandler für cellBeginEdit hinzugefügt und dort einen Haltepunkt gesetzt, aber er wird nicht ausgelöst. Irgendeine Idee, was ich falsch mache, oder wenn dies nicht möglich ist?

public class MergeEntry
{
  public string author    { get; set; }
  public string message   { get; set; }
}
...
var query = from entry in xmlDoc.Descendants("entry")
            select new MergeEntry
            {
              author = entry.Element("author").Value,
              message = entry.Element("msg").Value,
            }
var queryAsList = query.ToList();

myBindingSource.DataSource = queryAsList;
myDataGridView.DataSource = myBindingSource;

4voto

dugas Punkte 11576

Ja, es ist möglich, an eine mit Linq-To-Xml erstellte Liste zu binden. Ich habe versucht, Ihr Problem zu reproduzieren. Ich habe Folgendes getan:

  1. Erstellen Sie ein leeres WindForm-Projekt (VS 2008 und .Net 3.5)
  2. Dem Formular wurde ein DataGridView hinzugefügt.
  3. Die CellBeginEdit und CellEndEdit verdrahtet.
  4. Fügen Sie den folgenden Code in den Konstruktor des Formulars ein

string testXML =
        @"<p><entry>
          <author>TestAuthor1</author>
          <msg>TestMsg1</msg>  
          </entry></p>
        ";

XElement xmlDoc = XElement.Parse(testXML);

var query = from entry in xmlDoc.Descendants("entry")
            select new MergeEntry
            {
                author = entry.Element("author").Value,
                message = entry.Element("msg").Value,
            }; //You were missing the ";" in your post, I am assuming that was a typo.

//I first binded to a List, that worked fine. I then changed it to use a BindingList
//to support two-way binding.
var queryAsList = new BindingList<MergeEntry>(query.ToList());

bindingSource1.DataSource = queryAsList;
dataGridView1.DataSource = bindingSource1;

Beim Ausführen der WinForm-Anwendung wurde ein bearbeitbares Raster angezeigt und die Ereignisse CellBeginEdit und CellEndEdit wurden ausgelöst, wenn sie hätten ausgelöst werden müssen. Wir hoffen, dass Sie das Problem mit Hilfe der oben genannten Schritte reproduzieren können.

0voto

Thomas Levesque Punkte 277723

Da Sie die ToList , Ihr DataSource ist eigentlich ein List<MergeEntry> Die Tatsache, dass sie aus einer Linq-Abfrage stammt, ändert also nichts. Ich vermute, dass die ReadOnly Eigenschaft der Spalten (nicht des DGV) auf true gesetzt ist... Ich sehe keinen anderen Grund, warum das Gitter nicht bearbeitbar sein sollte

0voto

Sivashankar Punkte 421

Diese Lösung ist vielleicht nicht effizient, aber für mich funktioniert sie, Ich habe alle Daten (die von LINQ sind) in eine neue Sammlung verschoben und diese neue Sammlung als Datenquelle an gridview übergeben. In Gridview können wir nun Zellen bearbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X