我有一个非常简单的课程:人:
class People
{
private string LastName = null;
private string FirstName = null;
private string Status = null;
public string lastName
{
get { return LastName; }
set { LastName = value; }
}
public string firstName
{
get { return FirstName; }
set { FirstName = value; }
}
public string status
{
get { return Status; }
set { Status = value; }
}
public People(string lastName, string firstName, string status)
{
LastName = lastName;
FirstName = firstName;
Status = status;
}
}
而且,我有另一个实现接口IList<>的类,它被用作People类的集合,名为PeopleList<>。 PeopleList<>是特殊的,因为我直接将此类的实例绑定到DataGridView。通常情况下,我永远不会使用IList<>作为datagridview(DGV)的数据源有一个重要原因:IList不会生成ListChanged事件,这意味着一旦将DGV绑定到IList<>设置DGV中的行数。换句话说,如果将新项目添加到IList<>,DGV将不会显示它们!使其工作的唯一方法是将DGV的数据源设置为null,然后将其重新绑定到IList<>改变之后。
BindingList更适合这种类型的需求,但是,由于我无法进入的原因,我必须使用IList<>作为界面。为了解决这个问题,我找到了一些代码,据说将ListChanged事件集成到IList<>的实现中。界面,但我遇到了一些麻烦。看起来即使使用这段代码我也必须有一个事件处理程序方法吗?在某些时候,我必须将此方法声明为ListChanged事件的处理程序?看看:
class PeopleList<T> : IList<T>
{
private IList<T> internalList;
public class ListChangedEventArgs : EventArgs {
public int index;
public T item;
public ListChangedEventArgs(int index, T item) {
this.index = index;
this.item = item;
}
}
public delegate void ListChangedEventHandler(object source, ListChangedEventArgs e);
public delegate void ListClearedEventHandler(object source, EventArgs e);
public event ListChangedEventHandler ListChanged;
public event ListClearedEventHandler ListCleared;
public PeopleList() {
internalList = new List<T>();
}
public PeopleList(IList<T> list) {
internalList = list;
}
public PeopleList(IEnumerable<T> collection) {
internalList = new List<T>(collection);
}
protected virtual void OnListChanged(ListChangedEventArgs e) {
if (ListChanged != null)
ListChanged(this, e);
}
protected virtual void OnListCleared(EventArgs e) {
if (ListCleared != null)
ListCleared(this, e);
}
public int IndexOf(T item) {
return internalList.IndexOf(item);
}
public void Insert(int index, T item) {
internalList.Insert(index, item);
OnListChanged(new ListChangedEventArgs(index, item));
}
public void RemoveAt(int index) {
T item = internalList[index];
internalList.Remove(item);
OnListChanged(new ListChangedEventArgs(index, item));
}
T this[int index] {
get { return internalList[index]; }
set {
internalList[index] = value;
OnListChanged(new ListChangedEventArgs(index, value));
}
}
public void Add(T item) {
internalList.Add(item);
OnListChanged(new ListChangedEventArgs(internalList.IndexOf(item), item));
}
public void Clear() {
internalList.Clear();
OnListCleared(new EventArgs());
}
public bool Contains(T item) {
return internalList.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex) {
internalList.CopyTo(array, arrayIndex);
}
public int Count {
get { return internalList.Count; }
}
public bool IsReadOnly {
get { return IsReadOnly; }
}
public bool Remove(T item) {
lock(this) {
int index = internalList.IndexOf(item);
if (internalList.Remove(item)) {
OnListChanged(new ListChangedEventArgs(index, item));
return true;
}
else
return false;
}
}
public IEnumerator<T> GetEnumerator() {
return internalList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable) internalList).GetEnumerator();
}
T IList<T>.this[int index]
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
}
仅供参考 - 我在VS2010设计。
非常感谢任何指导......谢谢!
答案 0 :(得分:3)
好的,所以我没有收到回复,似乎没有办法让这项工作没有严重的副作用。我最终只是在我的代码中删除我的列表类并将其基于System.ComponentModel.BindingList&lt;&gt;这似乎工作正常。我知道这是一种可能性(正如我在我的问题中所提到的那样),但我希望避免因更换基类的繁琐工作,因为我不是编写原始代码的人。哦,井。 =)