| 

.NET C# Java Javascript Exception

1
Hallo,

ich möchte in einer Winforms-Anwendung eine Objektliste über Databinding in einem DataGridView anzeigen/editieren.

Nun habe ich mehrere Spalten die auf Properties von eingebetteten Objekten verweisen und bekomme das nur über Umwege hin und würde gerne wissen ob ich irgendwas übersehen habe.

Eine Google-Suche nach "datagridview winforms nested objects" bringt zwar ein paar mögliche Lösungen, die gefallen mir aber alle nicht so sehr.

Hatte jemand auch schon das Problem und weiß eine Lösung?
11.09.2012
erh 86 1 3
1
Könntest Du Deiner Frage ein wenig SampleCode hinzufügen und das Ganze anhand des Beispiels konkretisieren?
ffordermaier 11.09.2012
Und dazu: was gefällt Dir an den Vorschlägen im Netz nicht, d.h. was möchtest Du besser gelöst haben? Ich finde z.B. die Lösung in http://stackoverflow.com/questions/4900110/winforms-datagridview-binding-an-object-with-a-nested-object-property-expandin auf den ersten Blick recht überzeugend.
Matthias Hlawatsch 12.09.2012
1 Antwort
0
Danke schon mal für eure Kommentare.

Der Link von Stackoverflow trifft mein Problem eigentlich recht genau.
Jedoch kann/möchte ich nicht eine eigene MyList<T> verwenden, sondern das sollte mit einer IList<T>, ICollection<T> oder T[] auch funktionieren. Weiterhin bekomme ich mit der Lösung von stackoverflow TargetInvocationExceptions vom Grid.

Hier ein Beispielcode, das meiste ist der stackoverflow-Antwort geborgt.

Die Klasse "BookDetails" enthält ein property der Klasse "Author"

public class Author
{
public string LastName { get; set; }
public string FirstName { get; set; }
}
public class BookDetails
{
public string Title { get; set; }
public int TotalRating { get; set; }
public int Occurrence { get; set; }
public Author Author { get; set; }
}

Ich habe nun eine List<BookDetails>

private static List<BookDetails> GetBookList()
{
var author1 = new Author() { FirstName = "Victor", LastName = "Hugo" };
var author2 = new Author() { FirstName = "Moore", LastName = "Thomas" };

return new List<BookDetails> {
new BookDetails { Title = "abc", TotalRating = 3, Occurrence = 2, Author = author1 },
new BookDetails { Title = "def", TotalRating = 3, Occurrence = 2, Author = author2 },
new BookDetails { Title = "ghi", TotalRating = 3, Occurrence = 2, Author = author1 },
new BookDetails { Title = "jkl", TotalRating = 3, Occurrence = 2, Author = author2 },
};
}

Jetzt hätte ich gern eine DataGridView mit 4 Spalten:

  • BookDetail.Author.FirstName (readonly)
  • BookDetail.Author.LastName (readonly)
  • BookDetail.Title (readonly)
  • BookDetail.TotalRating (editierbar)

Objekte müssen keine hinzugefügt oder gelöscht werden, es muss nur das eine Property editierbar sein.

Ich habe schon versucht die Grid-Spalten selber anzulegen und dann
column.DataPropertyName = "Author.FirstName";
zu setzen, aber anscheinend kann man die properties von eingebetteten Objekten nicht von Haus aus einfach ansprechen.

Meine bisherige Lösung ist dass ich eine private Wrapper-Klasse schreibe, die dann die gewünschten Properties definiert. Ist auch nicht schön, aber tut soweit.

private class Wrapper
{
private BookDetails m_bookDetails;
public Wrapper(BookDetails bookDetails)
{
m_bookDetails = bookDetails;
}

public string FirstName { get { return m_bookDetails.Author.FirstName; } }
public string LastName { get { return m_bookDetails.Author.LastName; } }
public string Title { get { return m_bookDetails.Title; } }
public int TotalRating { get { return m_bookDetails.TotalRating; } set { m_bookDetails.TotalRating = value; } }
}

private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = GetBookList().ConvertAll<Wrapper>(bookDetail => new Wrapper(bookDetail));
}


Mit dieser bisherigen Lösung könnte ich leben, aber richtig gefallen tut mir das nicht.
Ich will halt nur nicht richtig glauben, dass es keine einfachere/bessere Lösung gibt!
13.09.2012
erh 86 1 3

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH