هل هناك حدث يتم تشغيله إذا تغير عدد ListViewItems في ListView؟(نماذج ويندوز)

StackOverflow https://stackoverflow.com/questions/47169

  •  09-06-2019
  •  | 
  •  

سؤال

أرغب في تمكين/تعطيل بعض عناصر التحكم الأخرى بناءً على عدد العناصر الموجودة في ملفي ListView يتحكم.لا يمكنني العثور على أي حدث من شأنه أن يفعل ذلك، سواء على ListView نفسها أو على ListViewItemCollection.ربما هناك طريقة لمشاهدة أي مجموعة بشكل عام في C# لإجراء التغييرات؟

سأكون سعيدًا بالأحداث الأخرى أيضًا، حتى تلك التي يتم تنشيطها أحيانًا عندما لا تتغير العناصر، ولكن على سبيل المثال ControlAdded و Layout الأحداث لم تنجح :(.

هل كانت مفيدة؟

المحلول

@ دومينيك

لست متأكدًا تمامًا، لم تصل أبدًا إلى هذا الحد في عملية التفكير.

قد يكون الحل الآخر هو توسيع ListView، وعند إضافة أشياء وإزالتها، بدلاً من استدعاء .items.add و items.remove، يمكنك استدعاء وظائفك الأخرى.سيظل من الممكن الإضافة والإزالة دون رفع الأحداث، ولكن مع القليل من مراجعة التعليمات البرمجية للتأكد من عدم استدعاء .items.add و.items.remove مباشرة، يمكن أن يعمل الأمر بشكل جيد.وهنا مثال صغير.لقد أظهرت وظيفة إضافة واحدة فقط، ولكن هناك 6 وظائف يجب عليك تنفيذها، إذا كنت تريد الاستفادة من جميع وظائف الإضافة المتاحة.هناك أيضًا .AddRange و.Clear التي قد ترغب في إلقاء نظرة عليها.

Public Class MonitoredListView
    Inherits ListView

    Public Event ItemAdded()
    Public Event ItemRemoved()

    Public Sub New()
        MyBase.New()
    End Sub

    Public Function AddItem(ByVal Text As String) As ListViewItem
        RaiseEvent ItemAdded()

        MyBase.Items.Add(Text)
    End Function

    Public Sub RemoveItem(ByVal Item As ListViewItem)
        RaiseEvent ItemRemoved()

        MyBase.Items.Remove(Item)
    End Sub

End Class

نصائح أخرى

لم أتمكن من العثور على أي أحداث يمكنك استخدامها.ربما يمكنك فئة فرعية ListViewItemCollection، ورفع الحدث الخاص بك عند إضافة شيء ما، باستخدام رمز مشابه لهذا.

Public Class MyListViewItemCollection
    Inherits ListView.ListViewItemCollection

    Public Event ItemAdded(ByVal Item As ListViewItem)

    Sub New(ByVal owner As ListView)
        MyBase.New(owner)
    End Sub

    Public Overrides Function Add(ByVal value As System.Windows.Forms.ListViewItem) As System.Windows.Forms.ListViewItem
        Dim Item As ListViewItem

        Item = MyBase.Add(value)

        RaiseEvent ItemAdded(Item)

        Return Item
    End Function
End Class

أعتقد أن أفضل ما يمكنك القيام به هنا هو إنشاء فئة فرعية من ListView وتوفير الأحداث التي تريدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top