IBindingList 인터페이스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
데이터 소스에 바인딩할 때 복잡하거나 간단한 시나리오 모두를 지원하는 데 필요한 기능을 제공합니다.
public interface class IBindingList : System::Collections::IList
public interface IBindingList : System.Collections.IList
type IBindingList = interface
interface ICollection
interface IEnumerable
interface IList
type IBindingList = interface
interface IList
interface ICollection
interface IEnumerable
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
{
private ListChangedEventArgs resetEvent = new ListChangedEventArgs(ListChangedType.Reset, -1);
private ListChangedEventHandler onListChanged;
public void LoadCustomers()
{
IList l = (IList)this;
l.Add(ReadCustomer1());
l.Add(ReadCustomer2());
OnListChanged(resetEvent);
}
public Customer this[int index]
{
get
{
return (Customer)(List[index]);
}
set
{
List[index] = value;
}
}
public int Add (Customer value)
{
return List.Add(value);
}
public Customer AddNew()
{
return (Customer)((IBindingList)this).AddNew();
}
public void Remove (Customer value)
{
List.Remove(value);
}
protected virtual void OnListChanged(ListChangedEventArgs ev)
{
if (onListChanged != null)
{
onListChanged(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
{
get { return true ; }
}
bool IBindingList.AllowNew
{
get { return true ; }
}
bool IBindingList.AllowRemove
{
get { return true ; }
}
bool IBindingList.SupportsChangeNotification
{
get { return true ; }
}
bool IBindingList.SupportsSearching
{
get { return false ; }
}
bool IBindingList.SupportsSorting
{
get { return false ; }
}
// Events.
public event ListChangedEventHandler ListChanged
{
add
{
onListChanged += value;
}
remove
{
onListChanged -= value;
}
}
// Methods.
object IBindingList.AddNew()
{
Customer c = new Customer(this.Count.ToString());
List.Add(c);
return c;
}
// Unsupported properties.
bool IBindingList.IsSorted
{
get { throw new NotSupportedException(); }
}
ListSortDirection IBindingList.SortDirection
{
get { throw new NotSupportedException(); }
}
PropertyDescriptor IBindingList.SortProperty
{
get { 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.
private static Customer ReadCustomer1()
{
Customer cust = new Customer("536-45-1245");
cust.FirstName = "Jo";
cust.LastName = "Brown";
return cust;
}
private static Customer ReadCustomer2()
{
Customer cust = new Customer("246-12-5645");
cust.FirstName = "Robert";
cust.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 사용하여 이벤트를 두 번째로 발생시키는 것은 이제 항목이 "new" 상태가 아닌 행임을 나타냅니다.
항목을 제거하거나 새 행에서 메서드를 호출 CancelEdit 할 때(해당 행이 를 구현하는 IEditableObject경우) 적절한 인덱스를 포함하는 열거형을 사용하여 ItemDeleted 이벤트를 발생 ListChanged 시켜야 합니다.
속성
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) |
메서드
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)를 사용하여 적용되는 모든 정렬을 제거합니다. |
이벤트
ListChanged |
목록 또는 목록의 항목이 변경될 때 발생합니다. |
확장 메서드
Cast<TResult>(IEnumerable) |
IEnumerable의 요소를 지정된 형식으로 캐스팅합니다. |
OfType<TResult>(IEnumerable) |
지정된 형식에 따라 IEnumerable의 요소를 필터링합니다. |
AsParallel(IEnumerable) |
쿼리를 병렬화할 수 있도록 합니다. |
AsQueryable(IEnumerable) |
IEnumerable을 IQueryable로 변환합니다. |
적용 대상
.NET