Erro: O controle ListBox ou ComboBox copia itens de lista várias vezes no Visual Basic .NET ou no Visual translation from VPE for Csharp .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 820636
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Você tenha um formulário Microsoft Windows com um controle ListBox ou um controle ComboBox . Quando você vincula o ListBox ou ComboBox a uma fonte de dados, o controle copia os itens na lista várias vezes.
Causa
Quando você cria o ListBox ou quando você cria o ComboBox , o formulário não tem uma propriedade de BindingContext . O ListBox ou ComboBox deve ter um BindingContext para copiar os dados. Portanto, o controle solicita que o formulário enviar BindingContext . O formulário cria BindingContext e, em seguida, o formulário é acionado notificação para o controle. O ListBox ou ComboBox recebe a notificação e, em seguida, o controle tenta atualizar a propriedade de DataManager . Portanto, o ListBox ou ComboBox cria a primeira cópia da lista. Quando o formulário cria BindingContext , ListBox ou ComboBox cria a segunda cópia da lista.
Resolução
Para resolver esse problema, use os procedimentos a seguir:
  • Defina a propriedade BindingContext do controle antes de definir as ligações de dados.
  • Defina a propriedade DisplayMember do controle antes de definir a propriedade DataSource .
Para usar esses procedimentos, execute essas etapas:
  1. Substitua o código existente no formulário f construtor com o código a seguir.

    código do Microsoft Visual Basic .NET pt
    Dim pt As ProductTypes = New ProductTypes'Add a ComboBox control to the form.Dim cb As ComboBox = New ComboBoxControls.Add(cb)'Invoke the binding context for the ComboBox.Dim bc As New BindingContextcb.BindingContext = bc'Set the DataSource property and set the DisplayMember property of the ComboBox.cb.DisplayMember = "Description"cb.DataSource = pt
    Código do Microsoft Visual translation from VPE for Csharp .NET
    ProductTypes pt = new ProductTypes();//Add a ComboBox control to the form.ComboBox cb = new ComboBox();Controls.Add(cb);//Invoke the binding context for the ComboBox.BindingContext bc=new BindingContext();cb.BindingContext =bc;   //Set the DataSource property and set the DisplayMember property of the ComboBox.cb.DisplayMember = "Description";cb.DataSource =pt;
    controlar Observação você também pode usar esse código de um ListBox , ComboBox substituindo da ListBox .
  2. No menu Debug , clique em Iniciar .

    O método CopyTo é chamado somente uma vez.
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Mais Informações

Passos para reproduzir o problema


  1. No Microsoft Visual Studio. NET, inicie um novo Windows aplicativo usando o Visual Basic .NET ou Visual translation from VPE for Csharp. NET.

    Por padrão, é criado o Form1.
  2. Substitua o código existente no Form1 com o código a seguir.

    código do Visual Basic .NET
    Imports System.Windows.FormsClass f    Inherits Form    Shared Sub Main()        Application.Run(New f)    End Sub    Private Sub New()        Dim pt As ProductTypes = New ProductTypes        'Add a ComboBox control to the form.        Dim cb As ComboBox = New ComboBox        Controls.Add(cb)        'Set the DataSource property and set the DisplayMember property of the ComboBox.        cb.DataSource = pt        cb.DisplayMember = "Description"    End SubEnd Class
    Visual translation from VPE for Csharp .NET Code
    using System.Windows.Forms;class f : Form {    static void Main()     {        Application.Run(new f());    }    f()     {        ProductTypes pt = new ProductTypes();        ComboBox cb = new ComboBox();        //Add a ComboBox control to the form.        Controls.Add(cb);        //Set the DataSource property and set the DisplayMember property of the ComboBox.        cb.DataSource = pt;        cb.DisplayMember = "Description";    }}
    controlar Observação você também pode usar esse código de um ListBox , ComboBox substituindo da ListBox .
  3. No menu Project , clique em Adicionar classe e em seguida, clique em Abrir .
  4. Substitua o código existente em Class1 com o código a seguir.

    código do Visual Basic .NET
    Imports SystemImports System.ComponentModelImports System.CollectionsImports System.DataImports System.Data.SqlClientPublic Class ProductTypes    Implements IList    Implements IEnumerator    Private position As Integer = -1    'List of items    Private _Cache As Hashtable    'List of ordinal pointers to the items    Private _CacheOrdinal As Hashtable    Public Sub New()        _Cache = New Hashtable        _CacheOrdinal = New Hashtable        FillCache()    End Sub    Public Function GetEnumerator() As ProductTypes        position = -1        Console.WriteLine("In type GetEnum..." + Environment.StackTrace)        Return (Me)    End Function    Private Function IGetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator        position = -1        Console.WriteLine("In IEnum GetEnum..." + Environment.StackTrace)        Return CType((Me), IEnumerator)    End Function    ' IList    Public ReadOnly Property IsFixedSize() As Boolean Implements IList.IsFixedSize        Get            Return (False)        End Get    End Property    ' IList    Public ReadOnly Property IsReadOnly() As Boolean Implements IList.IsReadOnly        Get            Return (False)        End Get    End Property    Public Property IItem(ByVal index As Integer) As Object Implements IList.Item        Get            Console.WriteLine("In IList this...")            Return (CType(_Cache(_CacheOrdinal(index)), ProductType))        End Get        Set(ByVal Value As Object)        End Set    End Property    Default Property Item(ByVal pos As Integer) As ProductType        Get            Console.WriteLine("In type this...")            Return (CType(_Cache(_CacheOrdinal(pos)), ProductType))        End Get        Set(ByVal Value As ProductType)        End Set    End Property    ' ICollection    Public ReadOnly Property Count() As Integer Implements ICollection.Count        Get            Console.WriteLine("In Count()")            Return (_Cache.Count)        End Get    End Property    ' Declare the Reset method that IEnumerator requires:    Public Sub Reset() Implements IEnumerator.Reset        Console.WriteLine("Called reset")        position = -1    End Sub    ' Declare the MoveNext method that IEnumerator requires:    Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext        If position < _Cache.Count - 1 Then            position = position + 1            Return True        Else            Return False        End If    End Function    Public Function Add(ByVal o As Object) As Integer Implements IList.Add        Return 1    End Function    Public Sub Clear() Implements IList.Clear    End Sub    Public Sub RemoveAt(ByVal i As Integer) Implements IList.RemoveAt    End Sub    Public Sub Remove(ByVal o As Object) Implements IList.Remove    End Sub    Public Function IndexOf(ByVal o As Object) As Integer Implements IList.IndexOf        Return 0    End Function    Public Function Contains(ByVal o As Object) As Boolean Implements IList.Contains        Return False    End Function    Public ReadOnly Property IsSynchronized() As Boolean Implements ICollection.IsSynchronized        Get            Return (False)        End Get    End Property    Public ReadOnly Property SyncRoot() As Object Implements ICollection.SyncRoot        Get            Return (Nothing)        End Get    End Property    Public Sub Insert(ByVal i As Integer, ByVal o As Object) Implements IList.Insert    End Sub    Public ReadOnly Property Current() As ProductType        Get            Return CType(_Cache(_CacheOrdinal(position)), ProductType)        End Get    End Property    ' Declare the Current property that IEnumerator requires:    Public ReadOnly Property ICurrent() As Object Implements IEnumerator.Current        Get            Return _Cache(_CacheOrdinal(position))        End Get    End Property    Default Property Item(ByVal productTypeId As String) As ProductType        Get            Return CType((_Cache(productTypeId)), ProductType)        End Get        Set(ByVal Value As ProductType)        End Set    End Property    Public Sub CopyTo(ByVal arr As System.Array, ByVal i As Integer) Implements ICollection.CopyTo        _Cache.CopyTo(arr, i)        Console.WriteLine("Calling copy..." + Environment.StackTrace)    End Sub    Private Sub FillCache()        Dim ordinal As Integer = 0        Dim pType As ProductType = New ProductType        pType.Description = "eric"        pType.ProductTypeId = System.Guid.NewGuid()        _Cache.Add(pType.ProductTypeId, pType)        _CacheOrdinal.Add(ordinal, pType.ProductTypeId)        ordinal = ordinal + 1        Dim pType1 As ProductType = New ProductType        pType1.Description = "nancy"        pType1.ProductTypeId = System.Guid.NewGuid()        _Cache.Add(pType1.ProductTypeId, pType1)        _CacheOrdinal.Add(ordinal, pType1.ProductTypeId)        ordinal = ordinal + 1    End SubEnd ClassPublic Class ProductType    Private _ProductTypeId As Guid    Private _Description As String    Public Sub New()        _ProductTypeId = System.Guid.NewGuid()        _Description = Nothing    End Sub    Public Property ProductTypeId() As Guid        Get            Return (_ProductTypeId)        End Get        Set(ByVal Value As Guid)            _ProductTypeId = Value        End Set    End Property    Public Property Description() As String        Get            Return (_Description)        End Get        Set(ByVal Value As String)            _Description = Value        End Set    End PropertyEnd Class
    Visual C# .NET Code
    using System;using System.ComponentModel;using System.Collections;using System.Data;using System.Data.SqlClient;    public class ProductTypes : IList, IEnumerator    {        private int position = -1;        //List of items        private Hashtable _Cache;        //List of ordinal pointers to the items        private Hashtable _CacheOrdinal;        public ProductTypes()        {            _Cache = new Hashtable();            _CacheOrdinal = new Hashtable();            FillCache();        }	        public   ProductTypes GetEnumerator()        {            position = -1;            Console.WriteLine("In type GetEnum..." + Environment.StackTrace);            return (this);        }        IEnumerator IEnumerable.GetEnumerator()        {            position = -1;            Console.WriteLine("In IEnum GetEnum..." + Environment.StackTrace);            return (IEnumerator) (this);        }        // IList        public bool IsFixedSize        {            get            {                return (false);            }        }        // IList        public bool IsReadOnly        {            get            {                return (false);            }        }		        // IList        object IList.this[int pos]        {            get             {                Console.WriteLine("In IList this...");                return (_Cache[_CacheOrdinal[pos]]);            }            set            {            }        }		        public ProductType this[int pos]        {            get             {                Console.WriteLine("In type this...");                return ((ProductType)_Cache[_CacheOrdinal[pos]]);            }            set            {            }        }		        // ICollection        public   int  Count        {            get            {                Console.WriteLine("In Count()");                return (_Cache.Count);            }        }	        // Declare the Reset method that IEnumerator requires:        public void Reset()        {            Console.WriteLine("Called reset");            position = -1;        }        // Declare the MoveNext method that IEnumerator requires:        {            if (position < _Cache.Count - 1)            {                position++;                return true;            }            else            {                return false;            }        }        public int Add(object o)        {            return 1;        }        public void Clear()        {}        public void RemoveAt(int i)        {}		        public void Remove(object o)        {}        public int IndexOf(object o)        {            return 0;        }        public bool Contains(object o)        {            return false;        }        public bool IsSynchronized        {            get            {                return (false);            }        }        public object SyncRoot        {            get            {                return (null);            }        }        public void Insert(int i, object o)        {}		        public ProductType Current        {            get            {                return (ProductType)_Cache[_CacheOrdinal[position]];            }        }        // Declare the Current property that IEnumerator requires:		        object IEnumerator.Current         {            get            {                return _Cache[_CacheOrdinal[position]];            }        }			        public ProductType this[string productTypeId]        {            get            {                return (ProductType)(_Cache[productTypeId]);            }        }	        public void CopyTo(System.Array arr, int i)        {            _Cache.CopyTo(arr, i);            Console.WriteLine("Calling copy..." + Environment.StackTrace);        }				        private void FillCache()        {            int ordinal = 0;			            ProductType pType = new ProductType();            pType.Description = "eric";            pType.ProductTypeId = System.Guid.NewGuid();            _Cache.Add(pType.ProductTypeId, pType);            _CacheOrdinal.Add(ordinal++, pType.ProductTypeId);            ProductType pType1 = new ProductType();            pType1.Description = "nancy";            pType1.ProductTypeId = System.Guid.NewGuid();            _Cache.Add(pType1.ProductTypeId, pType1);            _CacheOrdinal.Add(ordinal++, pType1.ProductTypeId);        }    }    public  class ProductType     {        private Guid					_ProductTypeId;        private string					_Description;        public ProductType()        {            _ProductTypeId = System.Guid.NewGuid();            _Description = null;        }        public Guid  ProductTypeId        {            get            {                return (_ProductTypeId);            }            set            {                _ProductTypeId = value;            }        }        public string Description        {            get            {                return (_Description);            }            set            {                _Description = value;            }        }    }
  5. Clique com o botão direito do mouse WindowsApplication1 e, em seguida, clique em Propriedades .
  6. Na lista tipo de saída , clique em Aplicativo de console .
  7. Na lista Startup object , clique em f e, em seguida, clique em OK .
  8. No menu Build , clique em Build Solution .
  9. No menu Debug , clique em Iniciar .

    Observe a saída no console. O método CopyTo e o método GetEnumerator são chamados muitas vezes, mesmo que você pode esperar o método GetEnumerator para ser chamado duas vezes e o método CopyTo para ser chamado somente uma vez.
Referências
Para obter mais informações, visite o link a seguir no site Microsoft Developer Network (MSDN):

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 820636 - Última Revisão: 12/08/2015 02:42:33 - Revisão: 2.3

Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbnosurvey kbarchive kbmt kbvs2005swept kbvs2005doesnotapply kbvs2002sp1sweep kbdatabinding kblistbox kbctrl kbcontrol kbcombobox kbbug KB820636 KbMtpt
Comentários