XObject.Changed Událost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vyvolá se, když se tento XObject nebo některý z jeho potomků změnil.
public:
event EventHandler<System::Xml::Linq::XObjectChangeEventArgs ^> ^ Changed;
public event EventHandler<System.Xml.Linq.XObjectChangeEventArgs> Changed;
member this.Changed : EventHandler<System.Xml.Linq.XObjectChangeEventArgs>
Public Custom Event Changed As EventHandler(Of XObjectChangeEventArgs)
Event Type
Příklady
Následující příklad přidá obslužnou rutinu události do kořenového prvku stromu XML. Potom upraví strom, což způsobí, že LINQ to XML vyvolá některé události.
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"));
Module Module1
WithEvents root As XElement = <Root>content</Root>
Sub Main()
root.Add(<Child>child content</Child>)
End Sub
Private Sub root_Changing( _
ByVal sender As Object, _
ByVal e As XObjectChangeEventArgs) _
Handles root.Changing
Dim xSender As XElement = DirectCast(sender, XElement)
Console.WriteLine("Changing event raised")
Console.WriteLine(" Sender: {0}", xSender.Name)
Console.WriteLine(" ObjectChange: {0}", e.ObjectChange)
End Sub
Private Sub root_Changed( _
ByVal sender As Object, _
ByVal e As XObjectChangeEventArgs) _
Handles root.Changed
Dim xSender As XElement = DirectCast(sender, XElement)
Console.WriteLine("Changed event raised")
Console.WriteLine(" Sender: {0}", xSender.Name)
Console.WriteLine(" ObjectChange: {0}", e.ObjectChange)
End Sub
End Module
Tento příklad vytvoří následující výstup:
Changing event raised
Sender: Child
ObjectChange: Add
Changed event raised
Sender: Child
ObjectChange: Add
Události jsou užitečné, když chcete zachovat některé agregované informace ve stromu XML. Můžete například chtít zachovat celkovou částku faktury, která je součtem řádkových položek faktury. Tento příklad používá události k zachování celkového součtu všech podřízených prvků v rámci komplexního prvku Items.
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);
Module Module1
Private total As XElement = Nothing
Private WithEvents items As XElement = Nothing
Private root As XElement = _
<Root>
<Total>0</Total>
<Items></Items>
</Root>
Sub Main()
total = root.<Total>(0)
items = root.<Items>(0)
items.SetElementValue("Item1", 25)
items.SetElementValue("Item2", 50)
items.SetElementValue("Item2", 75)
items.SetElementValue("Item3", 133)
items.SetElementValue("Item1", Nothing)
items.SetElementValue("Item4", 100)
Console.WriteLine("Total:{0}", CInt(total))
Console.WriteLine(root)
End Sub
Private Sub XObjectChanged( _
ByVal sender As Object, _
ByVal cea As XObjectChangeEventArgs) _
Handles items.Changed
Select Case cea.ObjectChange
Case XObjectChange.Add
If sender.GetType() Is GetType(XElement) Then
total.Value = CStr(CInt(total.Value) + _
CInt((DirectCast(sender, XElement)).Value))
End If
If sender.GetType() Is GetType(XText) Then
total.Value = CStr(CInt(total.Value) + _
CInt((DirectCast(sender, XText)).Value))
End If
Case XObjectChange.Remove
If sender.GetType() Is GetType(XElement) Then
total.Value = CStr(CInt(total.Value) - _
CInt((DirectCast(sender, XElement)).Value))
End If
If sender.GetType() Is GetType(XText) Then
total.Value = CStr(CInt(total.Value) - _
CInt((DirectCast(sender, XText)).Value))
End If
End Select
Console.WriteLine("Changed {0} {1}", _
sender.GetType().ToString(), _
cea.ObjectChange.ToString())
End Sub
End Module
Tento kód vytvoří následující výstup:
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>
Poznámky
Události jsou vyvolány pouze v případě, že je změněn strom XML, nikoli při jeho vytvoření. Důvodem je to, že před příjmem událostí musíte přidat obslužnou rutinu události do události a před odkazem na XObjectudálost nelze přidat obslužnou rutinu události. Nelze získat odkaz na před XObject vytvořením stromu XML. To znamená, že během funkční výstavby stromu XML nebudete přijímat události.
Při úpravě stromu XML v rámci jedné z těchto událostí byste měli být opatrní, protože to může vést k neočekávaným výsledkům. Pokud například obdržíte Changing událost a během zpracování události odeberete uzel ze stromu, nemusí se událost zobrazit Changed . Při zpracování události je platná změna stromu XML jiného než ten, který obsahuje uzel, který přijímá událost; je dokonce platné upravit stejný strom za předpokladu, že změny nemají vliv na konkrétní uzly, na kterých byla událost vyvolána. Pokud ale upravíte oblast stromu, která obsahuje uzel přijímající událost, události, které obdržíte, a dopad na strom není definován.