XObject.Changed 事件

定義

當此 XObject 或其任何子代發生變更時會引發。

C#
public event EventHandler<System.Xml.Linq.XObjectChangeEventArgs> Changed;

事件類型

範例

下列範例會將事件處理常式新增至 XML 樹狀結構的根項目。 然後,它會修改樹狀結構,導致LINQ to XML引發某些事件。

C#
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"));  

這個範例會產生下列輸出:

Changing event raised  
  Sender: Child  
  ObjectChange: Add  
Changed event raised  
  Sender: Child  
  ObjectChange: Add  

當您想要維護 XML 樹狀結構中的特定彙總資訊時,這些事件相當實用。 例如,您可能想要維護發票明細項目總計的發票總數。 此範例使用事件維護複雜項目 Items 下,所有子項目的總計。

C#
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);  

此程式碼會產生下列輸出:

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>  

備註

只有在修改 XML 樹狀結構時,才會引發事件,而不是在建構 XML 樹狀結構時引發。 這是因為您必須將事件處理常式新增至事件,才能接收事件,而且您無法在參考 XObject 之前加入事件處理常式。 在建構 XML 樹狀結構之前,您無法取得 的參考 XObject 。 這表示在 XML 樹狀結構的功能建構期間,您不會收到事件。

修改其中一個事件內的 XML 樹狀結構時應該小心,因為這樣做可能會導致非預期的結果。 例如,如果您收到 Changing 事件,而且正在處理事件時,您會從樹狀結構中移除節點,您可能不會收到 Changed 事件。 處理事件時,修改包含接收事件的節點以外的 XML 樹狀結構是有效的;即使修改的相同樹狀結構也有效,前提是修改不會影響引發事件的特定節點。 不過,如果您修改包含接收事件之節點的樹狀結構區域,您收到的事件和對樹狀結構的影響是未定義的。

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

另請參閱