Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. |
Übersetzung
Original
|
XObject.Changed-Ereignis
Wird ausgelöst, wenn dieses XObject oder eines seiner untergeordneten Elemente geändert wurde.
Assembly: System.Xml.Linq (in System.Xml.Linq.dll)
Ereignisse werden nur ausgelöst, wenn eine XML-Struktur geändert wird, und nicht, wenn sie erstellt wird. Der Grund hierfür ist, dass Sie einem Ereignis einen Ereignishandler hinzufügen müssen, bevor Ereignisse empfangen werden können, und Sie können einen Ereignishandler erst hinzufügen, wenn ein Verweis auf ein XObject vorhanden ist. Sie können einen Verweis auf ein XObject erst abrufen, wenn die XML-Struktur erstellt wurde. Dies bedeutet, dass während der funktionalen Erstellung einer XML-Struktur keine Ereignisse empfangen werden.
Gehen Sie beim Ändern einer XML-Struktur in einem dieser Ereignisse vorsichtig vor, weil dies zu unerwarteten Ergebnissen führen kann. Wenn beispielsweise ein Changing-Ereignis empfangen wird und Sie den Knoten während der Verarbeitung des Ereignisses aus der Struktur entfernen, wird möglicherweise das Changed-Ereignis nicht empfangen. Beim Verarbeiten eines Ereignisses ist es zulässig, eine andere XML-Struktur als die XML-Struktur zu ändern, die den das Ereignis empfangenden Knoten enthält. Es ist sogar zulässig, dieselbe Struktur zu ändern, sofern sich die Änderungen nicht auf die Knoten auswirken, für die das Ereignis ausgelöst wurde. Wenn Sie jedoch den Bereich der Struktur ändern, der den das Ereignis empfangenden Knoten enthält, sind die empfangenen Ereignisse und die Auswirkungen auf die Struktur nicht definiert.
Im folgenden Beispiel wird dem Stammelement einer XML-Struktur ein Ereignishandler hinzugefügt. Anschließend wird die Struktur geändert. Dies bewirkt, dass LINQ to XML einige Ereignisse auslöst.
XElement root = new XElement("Root", "content"); root.Changing += new EventHandler<XObjectChangeEventArgs>( (sender, cea) => { Console.WriteLine("Changing event raised"); XElement xSender = (XElement)sender; Console.WriteLine(" Sender: {0}", xSender.Name); Console.WriteLine(" ObjectChange: {0}", cea.ObjectChange); } ); root.Changed += new EventHandler<XObjectChangeEventArgs>( (sender, cea) => { Console.WriteLine("Changed event raised"); XElement xSender = (XElement)sender; Console.WriteLine(" Sender: {0}", xSender.Name); Console.WriteLine(" ObjectChange: {0}", cea.ObjectChange); } ); root.Add(new XElement("Child", "child content"));
Mit diesem Beispiel wird die folgende Ausgabe erzeugt:
Changing event raised Sender: Child ObjectChange: Add Changed event raised Sender: Child ObjectChange: Add
Ereignisse sind sinnvoll, wenn Sie in einer XML-Struktur aggregierte Informationen beibehalten möchten. Beispielsweise können Sie einen Rechnungsgesamtbetrag beibehalten, der die Summe aller Einzelposten der Rechnung ist. In diesem Beispiel wird mithilfe von Ereignissen die Summe aller untergeordneten Elemente unter dem komplexen Element Items beibehalten.
XElement root = new XElement("Root", new XElement("Total", 0), new XElement("Items") ); XElement total = root.Element("Total"); XElement items = root.Element("Items"); items.Changed += (object sender, XObjectChangeEventArgs cea) => { switch (cea.ObjectChange) { case XObjectChange.Add: if (sender is XElement) total.Value = ((int)total + (int)(XElement)sender).ToString(); if (sender is XText) total.Value = ((int)total + (int)((XText)sender).Parent).ToString(); break; case XObjectChange.Remove: if (sender is XElement) total.Value = ((int)total - (int)(XElement)sender).ToString(); if (sender is XText) total.Value = ((int)total - Int32.Parse(((XText)sender).Value)).ToString(); break; } Console.WriteLine("Changed {0} {1}", sender.GetType().ToString(), cea.ObjectChange.ToString()); }; items.SetElementValue("Item1", 25); items.SetElementValue("Item2", 50); items.SetElementValue("Item2", 75); items.SetElementValue("Item3", 133); items.SetElementValue("Item1", null); items.SetElementValue("Item4", 100); Console.WriteLine("Total:{0}", (int)total); Console.WriteLine(root);
Dieser Code erzeugt die folgende Ausgabe:
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XText Remove
Changed System.Xml.Linq.XText Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Remove
Changed System.Xml.Linq.XElement Add
Total:308
<Root>
<Total>308</Total>
<Items>
<Item2>75</Item2>
<Item3>133</Item3>
<Item4>100</Item4>
</Items>
</Root>
Windows 7, Windows Vista SP1 oder höher, Windows XP SP3, Windows Server 2008 (Server Core wird nicht unterstützt), Windows Server 2008 R2 (Server Core wird mit SP1 oder höher unterstützt), Windows Server 2003 SP2
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.