XObject.Changed Olay

Tanım

Bu XObject veya alt öğelerinden herhangi biri değiştiğinde yükseltildi.

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) 

Olay Türü

Örnekler

Aşağıdaki örnek, bir XML ağacının kök öğesine bir olay işleyicisi ekler. Ardından ağacı değiştirerek LINQ to XML'nin bazı olaylar oluşturmasına neden olur.

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

Bu örnek aşağıdaki çıkışı oluşturur:

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

Olaylar, bir XML ağacında bazı toplama bilgilerini korumak istediğinizde yararlıdır. Örneğin, faturanın satır öğelerinin toplamı olan bir fatura toplamını korumak isteyebilirsiniz. Bu örnek, karmaşık öğe Items altındaki tüm alt öğelerin toplamını korumak için olaylardan faydalanır.

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

Bu kod aşağıdaki çıkışı oluşturur:

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>

Açıklamalar

Olaylar yalnızca XML ağacı oluşturulduğunda değil değiştirildiğinde oluşturulur. Bunun nedeni, olayları alabilmeniz için önce bir olaya olay işleyicisi eklemeniz ve bir başvuruya sahip olmadan önce bir olay işleyicisi ekleyememenizdir XObject. XML ağacı oluşturmadan önce öğesine XObject başvuru alamazsınız. Bu, XML ağacının işlevsel yapısı sırasında olayları alamayacağınız anlamına gelir.

Bu olaylardan birinin içindeki XML ağacını değiştirirken dikkatli olmanız gerekir, çünkü bunu yapmak beklenmeyen sonuçlara yol açabilir. Örneğin, bir Changing olay alırsanız ve olay işlenirken düğümü ağaçtan kaldırırsanız, olayı almayabilirsiniz Changed . Bir olay işlenirken, olayı alan düğümü içerenden başka bir XML ağacını değiştirmek geçerli olur; değişikliklerin olayın oluşturulduğu belirli düğümleri etkilememesi koşuluyla aynı ağacı değiştirmek bile geçerlidir. Ancak, olayı alan düğümü içeren ağaç alanını değiştirirseniz, aldığınız olaylar ve ağaç üzerindeki etkisi tanımlanmamış olur.

Şunlara uygulanır

Ayrıca bkz.