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:59O erro ocorre depois q ele sai do método Load.

