{"id":55000220,"date":"2020-04-01T00:00:00","date_gmt":"2020-08-25T09:10:03","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=220"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Access_zu_EDM_INotifyPropertyChanged_integrieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Access_zu_EDM_INotifyPropertyChanged_integrieren\/","title":{"rendered":"Access zu EDM: INotifyPropertyChanged integrieren"},"content":{"rendered":"<p><b>Im Beitrag &#8220;Access zu EDM: Dateien erstellen&#8221; haben wir gezeigt, wie Sie mit einer einfachen Access-Prozedur aus einem Access-Datenmodell die f&uuml;r ein Entity Data Model notwendigen Dateien erzeugen k&ouml;nnen. Das Entity Data Model enth&auml;lt nur die reinen Eigenschaften, welche die Felder der jeweiligen Tabellen repr&auml;sentieren. Manchmal ben&ouml;tigen Sie allerdings mehr als nur diese Eigenschaften &#8211; dann soll zum Beispiel die Schnittstelle INotifyPropertyChanged in der Entit&auml;tsklasse implementiert sein, um &Auml;nderungen in den Eigenschaften schnell in die Anzeige der Daten &uuml;bermitteln zu k&ouml;nnen. Wie Sie die Access-Prozedur zum Erstellen des Entity Data Models entsprechend erweitern, zeigen wir Ihnen in diesem Artikel.<\/b><\/p>\n<p>Unsere Entit&auml;tsklassen, die wir mit der Prozedur <b>EDMDateienErstellen <\/b>erzeugen, bestehen nur aus den reinen Feldern samt Attributen:<\/p>\n<pre>&lt;Table(\"Anreden\")&gt;\r\n<span style=\"color:blue;\">Public <\/span>Partial Class Anrede\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     &lt;Index(IsUnique:=true)&gt;\r\n     &lt;StringLength(255)&gt;\r\n     &lt;Required&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Name<span style=\"color:blue;\"> As <\/span>System.String\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>F&uuml;r die Implementierung der <b>INotifyPropertyChanged<\/b>-Schnittstelle sind einige Erweiterungen notwendig, die wir in den folgenden Abschnitten hinzuf&uuml;gen.<\/p>\n<p><b>Namespace hinzuf&uuml;gen<\/b><\/p>\n<p>Um von der Form der Entit&auml;tsklasse, wie wir sie in der bisher verwendeten Prozedur erstellt haben, zu einer Form mit Implementierung der Schnittstelle <b>IPropertyNotifyChanged <\/b>zu gelangen, m&uuml;ssen wir einige Elemente zur Entit&auml;tsklasse hinzuf&uuml;gen. Das erste ist der Namespace, in der diese Schnittstelle definiert wird. Dazu passen wir die Funktion <b>NamespacesFuerEntitaeten <\/b>an, indem wir dieser einen Parameter namens <b>bolINotifyPropertyChanged<\/b> hinzuf&uuml;gen. Diesen werten wir in der Funktion aus und f&uuml;gen, wenn diese den Wert <b>True<\/b> hat, noch die folgende Zeile hinzu:<\/p>\n<pre>Imports System.ComponentModel<\/pre>\n<p>In der Funktion sieht das wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NamespacesFuerEntitaetenZusammenstellen(<span style=\"color:blue;\">Optional<\/span> bolINotifyPropertyChanged<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strNamespaces<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolINotifyPropertyChanged<span style=\"color:blue;\"> Then<\/span>\r\n         strNamespaces = strNamespaces & \"Imports System.ComponentModel\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...\r\n     NamespacesFuerEntitaetenZusammenstellen = strNamespaces\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Implements-Anweisung hinzuf&uuml;gen<\/b><\/p>\n<p>Als N&auml;chstes wollen wir der Entit&auml;tsklasse die <b>Implements<\/b>-Anweisung hinzuf&uuml;gen, mit der wir festlegen, dass die Klasse die Schnittstelle <b>INotifyPropertyChanged <\/b>implementiert. Dieser Teil erfolgt in der Funktion <b>EntityDataModelZusammenstellen<\/b>, die wir von der Hauptprozedur <b>EDMDateienErstellen <\/b>aus aufrufen. Dazu f&uuml;gen wir dem Aufruf die &Uuml;bergabe des Parameters <b>bolINotifyPropertyChanged <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EDMDateienErstellen(bolEineDatei<span style=\"color:blue;\"> As Boolean<\/span>, strContextname<span style=\"color:blue;\"> As String<\/span>, _\r\n         strUnterverzeichnisEntities<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolINotifyPropertyChanged<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> colMappings = EntityDataModelZusammenstellen(strDBSets, strEntities, strEntityNames, bolINotifyPropertyChanged)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In der Funktion <b>EntityDataModelZusammenstellen <\/b>nehmen wir diesen Parameter im Funktionskopf entgegen und pr&uuml;fen dann wieder per <b>If&#8230;Then<\/b>-Bedingung, ob <b>bolINotifyPropertyChanged <\/b>den Wert <b>True <\/b>hat. In diesem Fall f&uuml;gen wir der Definition der Klasse in der Variablen <b>strEntities(i) <\/b>die Zeile <b>Implements INotifyPropertyChanged <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EntityDataModelZusammenstellen(strDBSets<span style=\"color:blue;\"> As String<\/span>, strEntities()<span style=\"color:blue;\"> As String<\/span>, _\r\n         strEntityNames()<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolINotifyPropertyChanged<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     ...\r\n     For Each objMapping In colMappings\r\n         <span style=\"color:blue;\">With<\/span> objMapping\r\n             ...\r\n             strEntities(i) = \"&lt;Table(\"\"\" & .Entities & \"\"\")&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             strEntities(i) = strEntities(i) & \"Public Partial Class \" & .Entity & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">If <\/span>bolINotifyPropertyChanged<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>bolINotifyPropertyChanged<span style=\"color:blue;\"> Then<\/span>\r\n                 strEntities(i) = strEntities(i) & \"    Implements INotifyPropertyChanged\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & \"    Public Event PropertyChanged<span style=\"color:blue;\"> As <\/span>PropertyChangedEventHandler \" _\r\n                     & \"Implements INotifyPropertyChanged.PropertyChanged\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & \"    Protected Overridable Sub OnPropertyChanged(propname<span style=\"color:blue;\"> As String<\/span>)\" _\r\n                    & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) _\r\n                     & \"        RaiseEvent PropertyChanged(Me, <span style=\"color:blue;\">New<\/span> PropertyChangedEventArgs(propname))\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & \"    End Sub\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strEntities(i) = strEntities(i) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000220\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000220?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000220\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"edd26c4512\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8220;Access zu EDM: Dateien erstellen&#8221; haben wir gezeigt, wie Sie mit einer einfachen Access-Prozedur aus einem Access-Datenmodell die f&uuml;r ein Entity Data Model notwendigen Dateien erzeugen k&ouml;nnen. Das Entity Data Model enth&auml;lt nur die reinen Eigenschaften, welche die Felder der jeweiligen Tabellen repr&auml;sentieren. Manchmal ben&ouml;tigen Sie allerdings mehr als nur diese Eigenschaften &#8211; dann soll zum Beispiel die Schnittstelle INotifyPropertyChanged in der Entit&auml;tsklasse implementiert sein, um &Auml;nderungen in den Eigenschaften schnell in die Anzeige der Daten &uuml;bermitteln zu k&ouml;nnen. Wie Sie die Access-Prozedur zum Erstellen des Entity Data Models entsprechend erweitern, zeigen wir Ihnen in diesem Artikel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022020,662020,44000027,44000026,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000220","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-Excel_programmieren","category-Outlook_programmieren","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000220"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000220\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000220"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}