{"id":80,"date":"2009-06-13T15:52:05","date_gmt":"2009-06-13T14:52:05","guid":{"rendered":"http:\/\/www.ms-mueller.ch\/wp\/?p=80"},"modified":"2009-06-13T15:52:05","modified_gmt":"2009-06-13T14:52:05","slug":"datagridview-properties-von-unterobjekten-anzeigen","status":"publish","type":"post","link":"https:\/\/www.ms-mueller.ch\/?p=80","title":{"rendered":"Datagridview &#8211; Properties von Unterobjekten anzeigen."},"content":{"rendered":"<p>Das Datagridview hat einen ganz entscheidenen Nachteil.<\/p>\n<p>Man kann keine Daten von Unterobjekten anzeigen.<\/p>\n<p>Es gibt einige L\u00f6sungsans\u00e4tze:<\/p>\n<p><a title=\"http:\/\/www.developer-corner.com\/Resources\/KnowledgeBase\/tabid\/118\/articleType\/ArticleView\/articleId\/28\/Default.aspx\" href=\"http:\/\/www.developer-corner.com\/Resources\/KnowledgeBase\/tabid\/118\/articleType\/ArticleView\/articleId\/28\/Default.aspx\" target=\"_blank\">http:\/\/www.developer-corner.com\/Resources\/KnowledgeBase\/tabid\/118\/articleType\/ArticleView\/articleId\/28\/Default.aspx<\/a><\/p>\n<p><a title=\"http:\/\/blogs.msdn.com\/msdnts\/archive\/2007\/01\/19\/how-to-bind-a-datagridview-column-to-a-second-level-property-of-a-data-source.aspx\" href=\"http:\/\/\" target=\"_blank\">http:\/\/blogs.msdn.com\/msdnts\/archive\/2007\/01\/19\/how-to-bind-a-datagridview-column-to-a-second-level-property-of-a-data-source.aspx<\/a><\/p>\n<p>Ich habe mich f\u00fcr die erste Variante entschieden sie aber leicht abge\u00e4ndert.<\/p>\n<p>Als erstet erstellen wir eine eigene DataGridViewKlasse und leiten von DataGridView ab.<\/p>\n<pre><span style=\"color: #0000ff;\">Public Class<\/span> MyDataGridView\n\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">Inherits <\/span>Forms.DataGridView<\/pre>\n<pre style=\"text-align: justify;\"><span style=\"color: #0000ff;\">End Class<\/span><\/pre>\n<p>Und dann \u00fcberschreiben wir das OnCellFormat Ereigniss:<\/p>\n<pre style=\"text-align: justify;\">\n<span style=\"color: #0000ff;\">Public Class<\/span> MyDataGridView\n\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">Inherits <\/span>System.Windows.Forms.DataGridView\n\n    <span style=\"color: #0000ff;\">Protected Overrides Sub<\/span> OnCellFormatting( _ \n              <span style=\"color: #0000ff;\">ByVal <\/span>e <span style=\"color: #0000ff;\">As<\/span> System.Windows.Forms.DataGridViewCellFormattingEventArgs)\n\n        <span style=\"color: #0000ff;\">MyBase<\/span>.OnCellFormatting(e)\n        <span style=\"color: #0000ff;\">If<\/span> <span style=\"color: #0000ff;\">Me<\/span>.Rows(e.RowIndex).DataBoundItem <span style=\"color: #0000ff;\">IsNot Nothing _\n\u00a0          AndAlso<\/span> <span style=\"color: #0000ff;\">Me<\/span>.Columns(e.ColumnIndex).DataPropertyName.Contains(<span style=\"color: #800000;\">\".\"<\/span>) <span style=\"color: #0000ff;\">Then<\/span>\n            e.Value = BindProperty( _\n                 <span style=\"color: #0000ff;\">Me<\/span>.Rows(e.RowIndex).DataBoundItem, _\n                 <span style=\"color: #0000ff;\">Me<\/span>.Columns(e.ColumnIndex).DataPropertyName, 0)\n        <span style=\"color: #0000ff;\">End If<\/span>\n\n    <span style=\"color: #0000ff;\">End Sub<\/span>\n<span style=\"color: #0000ff;\">End Class<\/span><\/pre>\n<p>Und nun m\u00fcssen wir noch rekursiv das Richtige Objekt an die Zelle binden.<\/p>\n<pre style=\"text-align: justify;\">\n<span style=\"color: #0000ff;\">Public Class<\/span> MyDataGridView\n\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">Inherits <\/span>System.Windows.Forms.DataGridView\n\n    <span style=\"color: #0000ff;\">Protected Overrides Sub<\/span> OnCellFormatting(<span style=\"color: #0000ff;\"> _ \n              ByVal <\/span>e <span style=\"color: #0000ff;\">As<\/span> System.Windows.Forms.DataGridViewCellFormattingEventArgs)\n\n        <span style=\"color: #0000ff;\">MyBase<\/span>.OnCellFormatting(e)\n        <span style=\"color: #0000ff;\">If<\/span> <span style=\"color: #0000ff;\">Me<\/span>.Rows(e.RowIndex).DataBoundItem <span style=\"color: #0000ff;\">IsNot Nothing _\n          \u00a0AndAlso<\/span> <span style=\"color: #0000ff;\">Me<\/span>.Columns(e.ColumnIndex).DataPropertyName.Contains(<span style=\"color: #800000;\">\".\"<\/span>) <span style=\"color: #0000ff;\">Then<\/span>\n            e.Value = BindProperty( _\n                 <span style=\"color: #0000ff;\">Me<\/span>.Rows(e.RowIndex).DataBoundItem, _\n                 <span style=\"color: #0000ff;\">Me<\/span>.Columns(e.ColumnIndex).DataPropertyName, 0)\n        <span style=\"color: #0000ff;\">End If<\/span>\n\n    <span style=\"color: #0000ff;\">End Sub<\/span>\n\n    <span style=\"color: #0000ff;\">Private Function <\/span>BindProperty(<span style=\"color: #0000ff;\">ByVal <\/span>dataItem <span style=\"color: #0000ff;\">As Object<\/span>, _\n           \u00a0<span style=\"color: #0000ff;\">ByVal <\/span>bindingPath <span style=\"color: #0000ff;\">As String<\/span>, <span style=\"color: #0000ff;\">ByVal <\/span>index <span style=\"color: #0000ff;\">As Integer<\/span>) <span style=\"color: #0000ff;\">As Object<\/span>\n\n        <span style=\"color: #0000ff;\">Dim <\/span>tokens = bindingPath.Split(New Char() {<span style=\"color: #0000ff;\">CChar<\/span>(<span style=\"color: #800000;\">\".\"<\/span>)})\n        <span style=\"color: #0000ff;\">Dim <\/span>token = tokens(index)\n\n        <span style=\"color: #0000ff;\">Dim <\/span>t = dataItem.GetType()\n        <span style=\"color: #0000ff;\">Dim <\/span>pi = t.GetProperty(token)\n        <span style=\"color: #0000ff;\">Dim <\/span>nextDataItem <span style=\"color: #0000ff;\">As Object<\/span>\n\n        <span style=\"color: #0000ff;\">If <\/span>(pi <span style=\"color: #0000ff;\">IsNot <\/span><span style=\"color: #0000ff;\">Nothing<\/span>) <span style=\"color: #0000ff;\">Then<\/span>\n\n            nextDataItem = pi.GetValue(dataItem, Nothing)\n\n            <span style=\"color: #0000ff;\">If <\/span>(index = tokens.Length - 1) <span style=\"color: #0000ff;\">Then<\/span>\n\n                <span style=\"color: #0000ff;\">Return <\/span>nextDataItem\n<span style=\"color: #0000ff;\">            End If<\/span>\n\n            <span style=\"color: #0000ff;\">Return <\/span>BindProperty(nextDataItem, bindingPath, index + 1)\n<span style=\"color: #0000ff;\">        End If<\/span>\n\n<span style=\"color: #0000ff;\">        Return Nothing<\/span>\n<span style=\"color: #0000ff;\">\n    End Function<\/span>\n<span style=\"color: #0000ff;\">End Class<\/span><\/pre>\n<p>So nun kann man im Designer dem Datagridview ungebundene Felder hinzuf\u00fcgen und dann bei DataProperty die Eigenschaft angeben:<\/p>\n<pre style=\"text-align: justify;\">\nAdresse.Strasse<\/pre>\n<p>Und das MyDataGridView l\u00f6st das auf. Da wir das Feld an das Objekt gebunden haben lassen sich auf \u00e4nderungen am Wert durchf\u00fchren.<\/p>\n<p>Man muss beim speichern einfach beachten das die Unterobjekte dann mit gespeichert werden m\u00fcssen.<\/p>\n<p>Gruss Marco<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Datagridview hat einen ganz entscheidenen Nachteil. Man kann keine Daten von Unterobjekten anzeigen. Es gibt einige L\u00f6sungsans\u00e4tze: http:\/\/www.developer-corner.com\/Resources\/KnowledgeBase\/tabid\/118\/articleType\/ArticleView\/articleId\/28\/Default.aspx http:\/\/blogs.msdn.com\/msdnts\/archive\/2007\/01\/19\/how-to-bind-a-datagridview-column-to-a-second-level-property-of-a-data-source.aspx Ich habe mich f\u00fcr die erste Variante entschieden sie aber leicht abge\u00e4ndert. Als erstet erstellen wir eine eigene DataGridViewKlasse und leiten von DataGridView ab. Public Class MyDataGridView \u00a0\u00a0\u00a0 Inherits Forms.DataGridView End Class Und dann \u00fcberschreiben [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[9,15,18],"class_list":["post-80","post","type-post","status-publish","format-standard","hentry","category-visual-studio","tag-controls","tag-vb","tag-vs"],"_links":{"self":[{"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=\/wp\/v2\/posts\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=80"}],"version-history":[{"count":0,"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=\/wp\/v2\/posts\/80\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ms-mueller.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}