DataSource가 BindingSource 인 ListBox가 있습니다. BindingSource의 DataSource는 IList < T>를 구현 한 필자가 작성한 사용자 정의 클래스입니다. 사용자가 목록의 새 항목에 대한 데이터를 입력하면 BindingSource.Insert()를 새 항목으로 호출하여 BindingSource를 업데이트합니다. 이 경우 ListBox에 항목이 추가되지만 BindingSource의 DataSource 인 기본 목록은 수정하지 않는 것 같습니다.BindingSource가 삽입시 DataSource를 수정하지 않습니다.
내 사용자 지정 IList 클래스 (FilteredList < T>)가 아닌 일반 목록 < T>에서 동일한 작업을 수행하려고하면 목록이 BindingSource에 의해 업데이트됩니다. 그래서 문제는 내 커스텀 클래스에있는 것처럼 보입니다. 그러나 FilteredList < T>의 모든 메서드에 중단 점을 넣었으며 그 중 하나도 생성자 외에도 호출되지 않았습니다. 그래서 나는 혼란 스럽다.
가using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AmesView.Encapsulation
{
public class FilteredList<T>: IList<T>
{
public delegate bool TestMethod<T>(T item);
private IList<T> _innerList;
private TestMethod<T> _test;
public FilteredList(IList<T> innerList, TestMethod<T> test)
{
if (innerList == null)
{
throw new ArgumentException("innerList must not be null");
}
if (test == null)
{
throw new ArgumentException("test must not be null");
}
_innerList = innerList;
_test = test;
}
public int IndexOf(T item)
{
int count = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
if (item.Equals(tmp))
{
break;
}
count++;
}
}
return count;
}
public void Insert(int index, T item)
{
int count = 0;
int allidx = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
if (count == index)
{
_innerList.Insert(allidx, item);
return;
}
count++;
}
allidx++;
}
}
public void RemoveAt(int index)
{
int count = 0;
int allidx = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
if (count == index)
{
_innerList.RemoveAt(allidx);
return;
}
count++;
}
allidx++;
}
}
public T this[int index]
{
get
{
int count = 0;
int allidx = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
if (count == index)
{
return _innerList[allidx];
}
count++;
}
allidx++;
}
return default(T);
}
set
{
int count = 0;
int allidx = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
if (count == index)
{
_innerList[allidx] = value;
}
count++;
}
allidx++;
}
}
}
public void Add(T item)
{
_innerList.Add(item);
}
public void Clear()
{
_innerList.Clear();
}
public bool Contains(T item)
{
foreach (T tmp in _innerList)
{
if (tmp.Equals(item) && _test(tmp))
{
return true;
}
}
return false;
}
public void CopyTo(T[] array, int arrayIndex)
{
int count = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
int idx = arrayIndex + count;
if (idx < array.Length)
{
array[idx] = tmp;
}
count++;
}
}
}
public int Count
{
get
{
int count = 0;
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
count++;
}
}
return count;
}
}
public bool IsReadOnly
{
get
{
return _innerList.IsReadOnly;
}
}
public bool Remove(T item)
{
return _innerList.Remove(item);
}
public IEnumerator<T> GetEnumerator()
{
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
yield return tmp;
}
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
foreach (T tmp in _innerList)
{
if (_test(tmp))
{
yield return tmp;
}
}
}
}
}