XObject.Changed 이벤트

정의

XObject 또는 해당 하위 항목이 변경될 때 발생합니다.Raised when this XObject or any of its descendants have changed.

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) 

예제

다음 예제에서는 XML 트리의 루트 요소에 이벤트 처리기를 추가합니다.The following example adds an event handler to the root element of an XML tree. 그런 다음 LINQ 일부 이벤트를 발생 시키는 XML로 인해 트리를 수정 합니다.It then modifies the tree, causing LINQ to XML to raise some events.

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  

이 예제는 다음과 같은 출력을 생성합니다.This example produces the following output:

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

XML 트리에 특정 집계 정보를 유지 관리하려는 경우 이벤트가 유용합니다.Events are useful when you want to maintain some aggregate information in an XML tree. 예를 들어, 청구서의 개별 품목에 대한 합계인 청구서 총계를 유지 관리하려고 할 수 있습니다.For example, you may want maintain an invoice total that is the sum of the line items of the invoice. 이 예제에서는 이벤트를 사용하여 복합 요소 Items 아래의 모든 자식 요소에 대한 총계를 유지 관리합니다.This example uses events to maintain the total of all of the child elements under the complex element 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  

이 코드의 결과는 다음과 같습니다.This code produces the following output:

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 트리 수정 될 때만 발생 합니다.Events are raised only when an XML tree is modified, not when it is constructed. 이벤트를 받을 수 있으며에 대 한 참조 하기 전에 이벤트 처리기를 추가할 수 없습니다 전에 이벤트에 이벤트 처리기를 추가 해야 하기 때문에 이것이 XObject합니다.This is because you have to add an event handler to an event before you can receive events, and you cannot add an event handler before you have a reference to an XObject. 에 대 한 참조를 가져올 수 없습니다는 XObject 트리가 생성 되기 전에 XML입니다.You cannot get a reference to an XObject before the XML tree is constructed. 이 XML 트리의 기능 생성 하는 동안 받을 수 없습니다 이벤트 것을 의미 합니다.This means that during functional construction of an XML tree, you will not receive events.

예기치 않은 결과가 발생할 수 있습니다이 작업을 수행 하기 때문에 이러한 이벤트 중 하나에서 XML 트리를 수정 하는 경우 주의 해야 합니다.You should be careful when modifying an XML tree within one of these events, because doing this might lead to unexpected results. 예를 들어, 표시 되 면을 Changing 이벤트 및 이벤트를 처리 하는 동안 트리에서 노드를 제거 하면 받을 수는 Changed 이벤트입니다.For example, if you receive a Changing event, and while the event is being processed you remove the node from the tree, you might not receive the Changed event. 이벤트가 처리 되는 경우에 이벤트를 수신 하는 노드를 포함 하는 것과 다른 XML 트리를 수정할 수 수정이 이벤트가 발생 한 특정 노드가 영향을 주지 않습니다 제공 같은 트리를 수정 하려면도 유효 합니다.When an event is being processed, it is valid to modify an XML tree other than the one that contains the node that is receiving the event; it is even valid to modify the same tree provided the modifications do not affect the specific nodes on which the event was raised. 그러나 이벤트를 수신 하는 노드가 포함 된 트리의 영역을 수정 하면 트리에 영향과 받은 이벤트를 정의 되지 않습니다.However, if you modify the area of the tree that contains the node receiving the event, the events that you receive and the impact to the tree are undefined.

적용 대상

추가 정보