Dúvidas na implementação de IBindingList

Pergunta Dúvidas na implementação de IBindingList

  • quarta-feira, 5 de julho de 2006 19:12
     
     

    Estou tentando implementar a interface IBindingList, baseando em um exemplo de VB desse link (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet02252003.asp).

    Aqui está meu código:

    public class Produto
    {
      #region Private fields
      private int codigo;
     
    private string nome;
     
    private decimal preco;
     
    #endregion

      #region
    Properties
     
    public int Codigo
      {
       
    get { return codigo; } 
      
     set { codigo = value; }
     
    }

      public string Nome
     
    {
       
    get { return nome; }
       
    set { nome = value; }
     
    }

     
    public decimal Preco
     
    {
       
    get { return preco; }
       
    set { preco = value; }
     
    }
      #endregion

      #region Constructors
     
     public Produto(){}
     
    public Produto(int aCodigo, string aNome, decimal aPreco)
     
    {
       
    codigo = aCodigo;
       
    nome = aNome;
       
    preco = aPreco;
     
    }
     
    #endregion
    }

    public class Produtos : CollectionBase, IBindingList

    {

    #region Private fields

    #endregion

    #region Properties

    public Produto this[int index]

    {

    get { return (Produto)InnerList[index]; }

    }

    #endregion

    #region Protected methods

    protected override void OnClearComplete()

    {

    OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, 0));

    }

    protected override void OnInsertComplete(int index, object value)

    {

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

    }

    protected override void OnRemoveComplete(int index, object value)

    {

    OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index));

    }

    protected override void OnSetComplete(int index, object oldValue, object newValue)

    {

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

    }

    #endregion

    #region Public methods

    public void Add(Produto item)

    {

    InnerList.Add(item);

    }

    public void Remove(Produto item)

    {

    InnerList.Remove(item);

    }

    #endregion

    #region IBindingList Members

    #region Events

    public event System.ComponentModel.ListChangedEventHandler ListChanged;

    protected void OnListChanged(System.ComponentModel.ListChangedEventArgs e)

    {

    if (ListChanged != null)

    ListChanged(this, e);

    }

    #endregion

    #region Properties

    public bool SupportsChangeNotification

    {

    get { return true; }

    }

    public bool AllowNew

    {

    get { return true; }

    }

    public bool AllowEdit

    {

    get { return true; }

    }

    public bool AllowRemove

    {

    get { return true; }

    }

    public bool SupportsSearching

    {

    get { return false; }

    }

    public bool SupportsSorting

    {

    get { return false; }

    }

    public bool IsSorted

    {

    get { return false; }

    }

    public System.ComponentModel.ListSortDirection SortDirection

    {

    get { return new System.ComponentModel.ListSortDirection(); }

    }

    public PropertyDescriptor SortProperty

    {

    get { return null; }

    }

    #endregion

    #region Public methods

    public object AddNew()

    {

    Produto produto;

    produto = new Produto();

    return produto;

    }

    public void AddIndex(PropertyDescriptor property){}

    public void ApplySort(PropertyDescriptor property, System.ComponentModel.ListSortDirection direction){}

    public int Find(PropertyDescriptor property, object key) { return 0; }

    public void RemoveIndex(PropertyDescriptor property) {}

    public void RemoveSort() {}

    #endregion

    #endregion

    }

    No meu form coloquei um datagrid e o seguinte código no Load.

    Produtos produtos;

    private void frmPrinicipal_Load(object sender, System.EventArgs e)

    {

    produtos = new Produtos();

    grdProduto.DataSource = produtos;

    produtos.Add(new Produto(1, "Coca Cola 2L PET", 2.44M));

    produtos.Add(new Produto(2, "Fanta Laranja 2L PET", 1.99M));

    }

    }

    Dá o seguinte erro quando vou executar:

    "Specified argument was out of range of valid values. Parameter name: Index was out range. Must be non-negative and less than the size of the collection."

    Alguém pode dar uma ajuda?

     

     

Todas as Respostas

  • quarta-feira, 5 de julho de 2006 20:46
     
     

    Rogério

    Essa mensagem de erro acontece quando você está tentando acessar uma posição de um Array que não existe. Por exempli, se você tentar acessar o 6º ítem de um Array que tem 5 itens, esse erro poderá acontecer.

    Seria mais fácil se você postasse apenas o trecho  do código que está gerando o erro (procedure, function, etc), assim teremos uma visão mais clara.

  • quarta-feira, 5 de julho de 2006 20:59
     
     
    O erro ocorre depois q ele sai do método Load.