c#基于IList更新Datagridview

时间:2011-03-24 15:44:57

标签: data-binding c#-4.0 datagridview ilist

我有一个非常简单的课程:人:

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设计。

非常感谢任何指导......谢谢!

1 个答案:

答案 0 :(得分:3)

好的,所以我没有收到回复,似乎没有办法让这项工作没有严重的副作用。我最终只是在我的代码中删除我的列表类并将其基于System.ComponentModel.BindingList&lt;&gt;这似乎工作正常。我知道这是一种可能性(正如我在我的问题中所提到的那样),但我希望避免因更换基类的繁琐工作,因为我不是编写原始代码的人。哦,井。 =)