XObject.Changed 이벤트
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
이 XObject 또는 해당 하위 항목이 변경될 때 발생합니다.
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 트리의 루트 요소에 이벤트 처리기를 추가합니다. 그런 다음 트리를 수정하여 LINQ to XML 일부 이벤트를 발생합니다.
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
이 예제는 다음과 같은 출력을 생성합니다.
Changing event raised
Sender: Child
ObjectChange: Add
Changed event raised
Sender: Child
ObjectChange: Add
XML 트리에 특정 집계 정보를 유지 관리하려는 경우 이벤트가 유용합니다. 예를 들어, 청구서의 개별 품목에 대한 합계인 청구서 총계를 유지 관리하려고 할 수 있습니다. 이 예제에서는 이벤트를 사용하여 복합 요소 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
이 코드의 결과는 다음과 같습니다.
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 트리가 생성될 때가 아니라 수정될 때만 발생합니다. 이벤트를 받기 전에 이벤트에 이벤트 처리기를 추가해야 하고 에 대한 참조 XObject가 있기 전에 이벤트 처리기를 추가할 수 없기 때문입니다. XML 트리가 생성되기 전에는 에 XObject 대한 참조를 가져올 수 없습니다. 즉, XML 트리를 구성하는 동안 이벤트를 수신하지 않습니다.
이러한 이벤트 중 하나 내에서 XML 트리를 수정할 때는 예기치 않은 결과가 발생할 수 있으므로 주의해야 합니다. 예를 들어 이벤트를 수신 Changing 하고 이벤트가 처리되는 동안 트리에서 노드를 제거하면 이벤트가 수신 Changed 되지 않을 수 있습니다. 이벤트가 처리되는 경우 이벤트를 수신하는 노드가 포함된 트리 이외의 XML 트리를 수정하는 것이 유효합니다. 수정이 이벤트가 발생한 특정 노드에 영향을 미치지 않는 경우 동일한 트리를 수정하는 것도 유효합니다. 그러나 이벤트를 수신하는 노드가 포함된 트리 영역을 수정하는 경우 수신하는 이벤트와 트리에 미치는 영향은 정의되지 않습니다.
적용 대상
추가 정보
.NET