IBindingList 인터페이스

정의

데이터 원본에 바인딩할 때 복잡하고 간단한 시나리오를 모두 지원하는 데 필요한 기능을 제공합니다.

public interface class IBindingList : System::Collections::IList
public interface IBindingList : System.Collections.IList
type IBindingList = interface
    interface IList
    interface ICollection
    interface IEnumerable
type IBindingList = interface
    interface ICollection
    interface IEnumerable
    interface IList
Public Interface IBindingList
Implements IList
파생
구현

예제

다음 예제에서는 인터페이스의 간단한 구현을 IBindingList 제공합니다. 클래스는 CustomerList 고객 정보를 목록에 저장합니다. 이 예제에서는 클래스의 Customer 예제에서 찾을 수 있는 클래스를 사용했다고 가정합니다 IEditableObject .

public ref class CustomersList: public CollectionBase, public IBindingList
{
private:
   ListChangedEventArgs^ resetEvent;
   ListChangedEventHandler^ onListChanged;
   virtual event ListChangedEventHandler^ ListChanged;

public:
   property bool AllowEdit 
   {
      // Implements IBindingList.
      virtual bool get() sealed
      {
         return true;
      }
   }

   virtual property bool AllowNew 
   {
      bool get()
      {
         return true;
      }
   }

   property bool AllowRemove 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsChangeNotification 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsSearching 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsSorting 
   {
      virtual bool get()
      {
         return true;
      }

   }

   // Methods.
   virtual Object^ AddNew()
   {
      Customer^ c = gcnew Customer( this->Count->ToString() );
      List->Add( c );
      return c;
   }


   property bool IsSorted 
   {

      // Unsupported properties.
      virtual bool get()
      {
         throw gcnew NotSupportedException;
         return false;
      }

   }

   property ListSortDirection SortDirection 
   {
      virtual ListSortDirection get()
      {
         throw gcnew NotSupportedException;
         return ListSortDirection::Ascending;
      }

   }

   property PropertyDescriptor^ SortProperty 
   {
      virtual PropertyDescriptor^ get()
      {
         throw gcnew NotSupportedException;
         return nullptr;
      }

   }

   // Unsupported Methods.
   virtual void AddIndex( PropertyDescriptor^ property )
   {
      throw gcnew NotSupportedException;
   }

   virtual void ApplySort( PropertyDescriptor^ property, ListSortDirection direction )
   {
      throw gcnew NotSupportedException;
   }

   virtual int Find( PropertyDescriptor^ property, Object^ key )
   {
      throw gcnew NotSupportedException;
      return 0;
   }

   virtual void RemoveIndex( PropertyDescriptor^ property )
   {
      throw gcnew NotSupportedException;
   }

   virtual void RemoveSort()
   {
      throw gcnew NotSupportedException;
   }


   // Worker functions to populate the list with data.
   static Customer^ ReadCustomer1()
   {
      Customer^ cust = gcnew Customer( "536-45-1245" );
      cust->FirstName = "Jo";
      cust->LastName = "Brown";
      return cust;
   }

   static Customer^ ReadCustomer2()
   {
      Customer^ cust = gcnew Customer( "246-12-5645" );
      cust->FirstName = "Robert";
      cust->LastName = "Brown";
      return cust;
   }

protected:
   virtual void OnListChanged( ListChangedEventArgs^ ev )
   {
      if ( onListChanged != nullptr )
      {
         onListChanged( this, ev );
      }
   }

   virtual void OnClear() override
   {
      List->Clear();
   }

   virtual void OnClearComplete() override
   {
      OnListChanged( resetEvent );
   }

   virtual void OnInsertComplete( int index, Object^ value ) override
   {
      Customer^ c = safe_cast<Customer^>(value);
      c->Parent = this;
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemAdded,index ) );
   }

   virtual void OnRemoveComplete( int index, Object^ value ) override
   {
      Customer^ c = safe_cast<Customer^>(value);
      c->Parent = this;
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemDeleted,index ) );
   }

   virtual void OnSetComplete( int index, Object^ oldValue, Object^ newValue ) override
   {
      if ( oldValue != newValue )
      {
         Customer^ oldcust = safe_cast<Customer^>(oldValue);
         Customer^ newcust = safe_cast<Customer^>(newValue);
         oldcust->Parent = 0;
         newcust->Parent = this;
         OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemAdded,index ) );
      }
   }

public:

   // Constructor
   CustomersList()
   {
      resetEvent = gcnew ListChangedEventArgs( ListChangedType::Reset,-1 );
   }

   void LoadCustomers()
   {
      IList^ l = static_cast<IList^>(this);
      l->Add( ReadCustomer1() );
      l->Add( ReadCustomer2() );
      OnListChanged( resetEvent );
   }

   property Object^ Item [int]
   {
      Object^ get( int index )
      {
         return static_cast<Customer^>(List->Item[ index ]);
      }

      void set( int index, Object^ value )
      {
         List->Item[ index ] = value;
      }

   }
   int Add( Customer^ value )
   {
      return List->Add( value );
   }

   Customer^ AddNew()
   {
      return safe_cast<Customer^>(static_cast<IBindingList^>(this)->AddNew());
   }

   void Remove( Customer^ value )
   {
      List->Remove( value );
   }

internal:

   // Called by Customer when it changes.
   void CustomerChanged( Customer^ cust )
   {
      int index = List->IndexOf( cust );
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemChanged,index ) );
   }

};
public class CustomersList : CollectionBase, IBindingList
{
    readonly ListChangedEventArgs resetEvent = new(ListChangedType.Reset, -1);
    ListChangedEventHandler onListChanged;

    public void LoadCustomers()
    {
        IList l = this;
        _ = l.Add(ReadCustomer1());
        _ = l.Add(ReadCustomer2());
        OnListChanged(resetEvent);
    }

    public Customer this[int index]
    {
        get => (Customer)List[index]; set => List[index] = value;
    }

    public int Add(Customer value) => List.Add(value);

    public Customer AddNew() => (Customer)((IBindingList)this).AddNew();

    public void Remove(Customer value) => List.Remove(value);

    protected virtual void OnListChanged(ListChangedEventArgs ev) => onListChanged?.Invoke(this, ev);

    protected override void OnClear()
    {
        foreach (Customer c in List)
        {
            c.Parent = null;
        }
    }

    protected override void OnClearComplete() => OnListChanged(resetEvent);

    protected override void OnInsertComplete(int index, object value)
    {
        Customer c = (Customer)value;
        c.Parent = this;
        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
    }

    protected override void OnRemoveComplete(int index, object value)
    {
        Customer c = (Customer)value;
        c.Parent = this;
        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index));
    }

    protected override void OnSetComplete(int index, object oldValue, object newValue)
    {
        if (oldValue != newValue)
        {
            Customer oldcust = (Customer)oldValue;
            Customer newcust = (Customer)newValue;

            oldcust.Parent = null;
            newcust.Parent = this;

            OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
        }
    }

    // Called by Customer when it changes.
    internal void CustomerChanged(Customer cust)
    {
        int index = List.IndexOf(cust);

        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index));
    }

    // Implements IBindingList.
    bool IBindingList.AllowEdit => true;

    bool IBindingList.AllowNew => true;

    bool IBindingList.AllowRemove => true;

    bool IBindingList.SupportsChangeNotification => true;

    bool IBindingList.SupportsSearching => false;

    bool IBindingList.SupportsSorting => false;

    // Events.
    public event ListChangedEventHandler ListChanged
    {
        add => onListChanged += value; remove => onListChanged -= value;
    }

    // Methods.
    object IBindingList.AddNew()
    {
        Customer c = new(Count.ToString());
        _ = List.Add(c);
        return c;
    }

    // Unsupported properties.
    bool IBindingList.IsSorted => throw new NotSupportedException();

    ListSortDirection IBindingList.SortDirection => throw new NotSupportedException();

    PropertyDescriptor IBindingList.SortProperty => throw new NotSupportedException();

    // Unsupported Methods.
    void IBindingList.AddIndex(PropertyDescriptor property) => throw new NotSupportedException();

    void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) => throw new NotSupportedException();

    int IBindingList.Find(PropertyDescriptor property, object key) => throw new NotSupportedException();

    void IBindingList.RemoveIndex(PropertyDescriptor property) => throw new NotSupportedException();

    void IBindingList.RemoveSort() => throw new NotSupportedException();

    // Worker functions to populate the list with data.
    static Customer ReadCustomer1() => new("536-45-1245")
    {
        FirstName = "Jo",
        LastName = "Brown"
    };

    static Customer ReadCustomer2()
    {
        Customer cust = new("246-12-5645")
        {
            FirstName = "Robert",
            LastName = "Brown"
        };
        return cust;
    }
}
Public Class CustomersList
    Inherits CollectionBase
    Implements IBindingList 

    Private resetEvent As New ListChangedEventArgs(ListChangedType.Reset, -1)
    Private onListChanged1 As ListChangedEventHandler


    Public Sub LoadCustomers()
        Dim l As IList = CType(Me, IList)
        l.Add(ReadCustomer1())
        l.Add(ReadCustomer2())
        OnListChanged(resetEvent)
    End Sub 


    Default Public Property Item(ByVal index As Integer) As Customer
        Get
            Return CType(List(index), Customer)
        End Get
        Set(ByVal Value As Customer)
            List(index) = Value
        End Set
    End Property


    Public Function Add(ByVal value As Customer) As Integer
        Return List.Add(value)
    End Function 


    Public Function AddNew2() As Customer
        Return CType(CType(Me, IBindingList).AddNew(), Customer)
    End Function 


    Public Sub Remove(ByVal value As Customer)
        List.Remove(value)
    End Sub 



    Protected Overridable Sub OnListChanged(ByVal ev As ListChangedEventArgs)
        If (onListChanged1 IsNot Nothing) Then
            onListChanged1(Me, ev)
        End If
    End Sub 



    Protected Overrides Sub OnClear()
        Dim c As Customer
        For Each c In List
            c.parent = Nothing
        Next c
    End Sub 


    Protected Overrides Sub OnClearComplete()
        OnListChanged(resetEvent)
    End Sub 


    Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
        Dim c As Customer = CType(value, Customer)
        c.parent = Me
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index))
    End Sub 


    Protected Overrides Sub OnRemoveComplete(ByVal index As Integer, ByVal value As Object)
        Dim c As Customer = CType(value, Customer)
        c.parent = Me
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemDeleted, index))
    End Sub 


    Protected Overrides Sub OnSetComplete(ByVal index As Integer, ByVal oldValue As Object, ByVal newValue As Object)
        If oldValue <> newValue Then

            Dim oldcust As Customer = CType(oldValue, Customer)
            Dim newcust As Customer = CType(newValue, Customer)

            oldcust.parent = Nothing
            newcust.parent = Me

            OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index))
        End If
    End Sub 


    ' Called by Customer when it changes.
    Friend Sub CustomerChanged(ByVal cust As Customer)
        Dim index As Integer = List.IndexOf(cust)
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemChanged, index))
    End Sub 


    ' Implements IBindingList.

    ReadOnly Property AllowEdit() As Boolean Implements IBindingList.AllowEdit
        Get
            Return True
        End Get
    End Property

    ReadOnly Property AllowNew() As Boolean Implements IBindingList.AllowNew
        Get
            Return True
        End Get
    End Property

    ReadOnly Property AllowRemove() As Boolean Implements IBindingList.AllowRemove
        Get
            Return True
        End Get
    End Property

    ReadOnly Property SupportsChangeNotification() As Boolean Implements IBindingList.SupportsChangeNotification
        Get
            Return True
        End Get
    End Property

    ReadOnly Property SupportsSearching() As Boolean Implements IBindingList.SupportsSearching
        Get
            Return False
        End Get
    End Property

    ReadOnly Property SupportsSorting() As Boolean Implements IBindingList.SupportsSorting
        Get
            Return False
        End Get
    End Property

    ' Events.
    Public Event ListChanged As ListChangedEventHandler Implements IBindingList.ListChanged


    ' Methods.
    Function AddNew() As Object Implements IBindingList.AddNew
        Dim c As New Customer(Me.Count.ToString())
        List.Add(c)
        Return c
    End Function 


    ' Unsupported properties.

    ReadOnly Property IsSorted() As Boolean Implements IBindingList.IsSorted
        Get
            Throw New NotSupportedException()
        End Get
    End Property

    ReadOnly Property SortDirection() As ListSortDirection Implements IBindingList.SortDirection
        Get
            Throw New NotSupportedException()
        End Get
    End Property


    ReadOnly Property SortProperty() As PropertyDescriptor Implements IBindingList.SortProperty
        Get
            Throw New NotSupportedException()
        End Get
    End Property


    ' Unsupported Methods.
    Sub AddIndex(ByVal prop As PropertyDescriptor) Implements IBindingList.AddIndex
        Throw New NotSupportedException()
    End Sub 


    Sub ApplySort(ByVal prop As PropertyDescriptor, ByVal direction As ListSortDirection) Implements IBindingList.ApplySort
        Throw New NotSupportedException()
    End Sub 


    Function Find(ByVal prop As PropertyDescriptor, ByVal key As Object) As Integer Implements IBindingList.Find
        Throw New NotSupportedException()
    End Function 


    Sub RemoveIndex(ByVal prop As PropertyDescriptor) Implements IBindingList.RemoveIndex
        Throw New NotSupportedException()
    End Sub 


    Sub RemoveSort() Implements IBindingList.RemoveSort
        Throw New NotSupportedException()
    End Sub 


    ' Worker functions to populate the list with data.
    Private Shared Function ReadCustomer1() As Customer
        Dim cust As New Customer("536-45-1245")
        cust.FirstName = "Jo"
        cust.LastName = "Brown"
        Return cust
    End Function 


    Private Shared Function ReadCustomer2() As Customer
        Dim cust As New Customer("246-12-5645")
        cust.FirstName = "Robert"
        cust.LastName = "Brown"
        Return cust
    End Function 
End Class

설명

이 인터페이스는 클래스에 의해 구현됩니다 DataView . 메서드의 구현은 클래스에서 해당 메서드의 구현과 동일한 동작을 DataView 나타내야 합니다.

또는 메서드를 ApplySort 호출할 때 열거형을 사용하여 ListChanged 이벤트를 Reset 발생시켜야 RemoveSort 합니다.

메서드를 AddNew 호출할 때 적절한 인덱스가 ListChanged 포함된 열거형을 ItemAdded 사용하여 이벤트를 발생시켜야 합니다. 추가된 행은 컨트롤에서 ESC를 누르면 새 행을 제거할 수 있는 DataGridView 상태입니다. 이 행에서 ListChanged 열거형을 ItemAdded 사용하여 이벤트를 두 번째로 발생시키는 것은 이제 항목이 "새" 상태가 아닌 행임을 나타냅니다.

항목을 제거하거나 새 행에서 메서드를 호출 CancelEdit 할 때(해당 행이 구현되는 IEditableObject경우) 적절한 인덱스를 포함하는 열거형을 ItemDeleted 사용하여 이벤트를 발생 ListChanged 시켜야 합니다.

속성

Name Description
AllowEdit

목록에서 항목을 업데이트할 수 있는지 여부를 가져옵니다.

AllowNew

를 사용하여 AddNew()목록에 항목을 추가할 수 있는지 여부를 가져옵니다.

AllowRemove

목록에서 Remove(Object)RemoveAt(Int32)항목을 제거할 수 있는지 여부를 가져옵니다.

Count

에 포함된 ICollection요소 수를 가져옵니다.

(다음에서 상속됨 ICollection)
IsFixedSize

고정 크기가 있는지 여부를 IList 나타내는 값을 가져옵니다.

(다음에서 상속됨 IList)
IsReadOnly

IList 읽기 전용인지 여부를 나타내는 값을 가져옵니다.

(다음에서 상속됨 IList)
IsSorted

목록의 항목이 정렬되는지 여부를 가져옵니다.

IsSynchronized

ICollection 대한 액세스가 동기화되는지 여부를 나타내는 값을 가져옵니다(스레드로부터 안전).

(다음에서 상속됨 ICollection)
Item[Int32]

지정된 인덱스에서 요소를 가져오거나 설정합니다.

(다음에서 상속됨 IList)
SortDirection

정렬 방향을 가져옵니다.

SortProperty

정렬에 PropertyDescriptor 사용되는 값을 가져옵니다.

SupportsChangeNotification

목록이 변경될 때 이벤트가 발생하는지 또는 목록의 항목이 변경되는지 여부를 ListChanged 가져옵니다.

SupportsSearching

목록에서 메서드를 사용하여 Find(PropertyDescriptor, Object) 검색을 지원하는지 여부를 가져옵니다.

SupportsSorting

목록에서 정렬을 지원하는지 여부를 가져옵니다.

SyncRoot

ICollection대한 액세스를 동기화하는 데 사용할 수 있는 개체를 가져옵니다.

(다음에서 상속됨 ICollection)

메서드

Name Description
Add(Object)

에 항목을 IList추가합니다.

(다음에서 상속됨 IList)
AddIndex(PropertyDescriptor)

검색에 PropertyDescriptor 사용되는 인덱스에 추가합니다.

AddNew()

목록에 새 항목을 추가합니다.

ApplySort(PropertyDescriptor, ListSortDirection)

및 을 기준으로 PropertyDescriptor 목록을 정렬합니다 ListSortDirection.

Clear()

에서 모든 항목을 IList제거합니다.

(다음에서 상속됨 IList)
Contains(Object)

특정 값이 IList 포함되어 있는지 여부를 확인합니다.

(다음에서 상속됨 IList)
CopyTo(Array, Int32)

특정 ICollection 인덱스에서 시작하여 Array 요소를 Array복사합니다.

(다음에서 상속됨 ICollection)
Find(PropertyDescriptor, Object)

지정된 PropertyDescriptor행의 인덱스 값을 반환합니다.

GetEnumerator()

컬렉션을 반복하는 열거자를 반환합니다.

(다음에서 상속됨 IEnumerable)
IndexOf(Object)

에서 특정 항목의 인덱스를 IList결정합니다.

(다음에서 상속됨 IList)
Insert(Int32, Object)

지정된 인덱스에 항목을 IList 삽입합니다.

(다음에서 상속됨 IList)
Remove(Object)

에서 특정 개체의 첫 번째 항목을 제거합니다 IList.

(다음에서 상속됨 IList)
RemoveAt(Int32)

지정된 인덱스의 IList 항목을 제거합니다.

(다음에서 상속됨 IList)
RemoveIndex(PropertyDescriptor)

검색에 PropertyDescriptor 사용되는 인덱스에서 제거합니다.

RemoveSort()

를 사용하여 ApplySort(PropertyDescriptor, ListSortDirection)적용된 모든 정렬을 제거합니다.

이벤트

Name Description
ListChanged

목록이 변경되거나 목록의 항목이 변경되면 발생합니다.

확장명 메서드

Name Description
AsParallel(IEnumerable)

쿼리의 병렬 처리를 사용하도록 설정합니다.

AsQueryable(IEnumerable)

IEnumerable IQueryable변환합니다.

Cast<TResult>(IEnumerable)

IEnumerable 요소를 지정된 형식으로 캐스팅합니다.

OfType<TResult>(IEnumerable)

지정된 형식에 따라 IEnumerable 요소를 필터링합니다.

적용 대상