Artigo: 822483 - Última revisão: segunda-feira, 26 de Novembro de 2007 - Revisão: 2.9

Controlo ListView não suporta a funcionalidade de arrastar e largar para itens em tempo de execução

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Se adicionar itens ao controlo ListView num formulário do Microsoft Windows, não é possível reordenar os itens arrastando os itens no controlo ListView em tempo de execução.

Causa

Este problema ocorre porque o controlo ListView não suporta a funcionalidade de arrastar e largar para os itens em tempo de execução.

Como contornar

Para contornar este problema, fornecem funcionalidade de arrastar e largar para o controlo ListView da seguinte forma:
  1. Adicione o seguinte código ao processador de eventos ListView1_ItemDrag .

    código do Microsoft Visual Basic 2005 ou Microsoft Visual Basic .NET
     'Begins a drag-and-drop operation in the ListView control.
    ListView1.DoDragDrop(ListView1.SelectedItems, DragDropEffects.Move)
    código do Microsoft Visual C# 2005 ou Microsoft Visual C# .NET
    //Begins a drag-and-drop operation in the ListView control.
    listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Move);
  2. Adicione o seguinte código ao processador de eventos ListView1_DragEnter .

    código de Visual Basic 2005 ou do Visual Basic .NET
    Dim i As Integer
    For i = 0 To e.Data.GetFormats().Length - 1
    If e.Data.GetFormats()(i).Equals("System.Windows.Forms.ListView+SelectedListViewItemCollection") Then
        'The data from the drag source is moved to the target.
        e.Effect = DragDropEffects.Move
    End If
    Next
    Visual C# .NET ou Visual C# 2005 código
    int len=e.Data.GetFormats().Length-1 ;
    int i;
    for (i = 0 ; i<=len ;i++)
    {
        if (e.Data.GetFormats()[i].Equals("System.Windows.Forms.ListView+SelectedListViewItemCollection"))
        {
            //The data from the drag source is moved to the target.	
            e.Effect = DragDropEffects.Move;
        }
    }
    
  3. Adicione o seguinte código ao processador de eventos ListView1_DragDrop .

    código de Visual Basic 2005 ou do Visual Basic .NET
    'Return if the items are not selected in the ListView control.
    If ListView1.SelectedItems.Count = 0 Then Return
    'Returns the location of the mouse pointer in the ListView control.
    Dim p As Point = ListView1.PointToClient(New Point(e.X, e.Y))
    'Obtain the item that is located at the specified location of the mouse pointer.
    Dim dragToItem As ListViewItem = ListView1.GetItemAt(p.X, p.Y)
    If dragToItem Is Nothing Then Return
    'Obtain the index of the item at the mouse pointer.
    Dim dragIndex As Integer = dragToItem.Index
    Dim i As Integer
    Dim sel(ListView1.SelectedItems.Count) As ListViewItem
    For i = 0 To ListView1.SelectedItems.Count - 1
        sel(i) = ListView1.SelectedItems.Item(i)
    Next
    For i = 0 To ListView1.SelectedItems.Count - 1
        'Obtain the ListViewItem to be dragged to the target location.
        Dim dragItem As ListViewItem = sel(i)
        Dim itemIndex As Integer = dragIndex
        If itemIndex = dragItem.Index Then Return
        If dragItem.Index < itemIndex Then
           itemIndex = itemIndex + 1
        Else
           itemIndex = dragIndex + i
        End If
        'Insert the item in the specified location.
        Dim insertitem As ListViewItem = dragItem.Clone
        ListView1.Items.Insert(itemIndex, insertitem)
        'Removes the item from the initial location while 
        'the item is moved to the new location.
        ListView1.Items.Remove(dragItem)
    Next
    
    visual C# .NET ou Visual C# 2005 código
    //Return if the items are not selected in the ListView control.
    if(listView1.SelectedItems.Count==0)
    {
       return;
    }
    //Returns the location of the mouse pointer in the ListView control.
    Point cp = listView1.PointToClient(new Point(e.X, e.Y));
    //Obtain the item that is located at the specified location of the mouse pointer.
    ListViewItem dragToItem = listView1.GetItemAt(cp.X, cp.Y);
    if(dragToItem==null)
    {
        return;
    } 
    //Obtain the index of the item at the mouse pointer.
    int dragIndex = dragToItem.Index;
    ListViewItem[] sel=new ListViewItem [listView1.SelectedItems.Count];
    for(int i=0; i<=listView1.SelectedItems.Count-1;i++)
    {
         sel[i]=listView1.SelectedItems[i];
    }
    for(int i=0; i<sel.GetLength(0);i++)
    { 
        //Obtain the ListViewItem to be dragged to the target location.
        ListViewItem dragItem = sel[i];
        int itemIndex = dragIndex;
        if(itemIndex==dragItem.Index)
       {
            return;
       }
       if(dragItem.Index<itemIndex)
           itemIndex++;
      else
           itemIndex=dragIndex+i;
       //Insert the item at the mouse pointer.
       ListViewItem insertItem = (ListViewItem)dragItem.Clone();
       listView1.Items.Insert(itemIndex, insertItem);
       //Removes the item from the initial location while 
       //the item is moved to the new location.
       listView1.Items.Remove(dragItem);
    }
    
  4. No menu criar , clique em criar soluções .
  5. No menu Debug , clique em Iniciar .

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Crie uma nova aplicação do Windows utilizando o Visual Basic. NET, Visual Basic 2005, Visual C# 2005 ou Visual C#. NET.

    Por predefinição, é criado o Form1.
  3. Adicione o controlo ListView ao Form1.
  4. Clique com o botão direito do rato ListView1 e, em seguida, clique em Propriedades .
  5. Na caixa de diálogo Propriedades , clique na propriedade itens e, em seguida, clique no botão reticências (... ).
  6. No Editor de colecções de ListViewItem diálogo caixa, clique em Adicionar quatro vezes.
  7. Defina a propriedade texto do primeiro controlo ListViewItem para Item1 , defina a propriedade Text do segundo controlo ListViewItem como Item2 , definir a propriedade de texto do controlo ListViewItem terceiro para Item3 e, em seguida, defina a propriedade Text do controlo ListViewItem quarto para Item4 .
  8. No Editor de colecções de ListViewItem diálogo caixa, clique em OK .
  9. Na caixa de diálogo Propriedades de ListView1 , defina a propriedade Ver a lista .
  10. Defina a propriedade AllowDrop de ListView1 como true .
  11. No menu criar , clique em criar soluções .
  12. No menu Debug , clique em Iniciar .
  13. A tentar arrastar Item1 para uma nova localização no controlo ListView .

    Não é possível arrastar Item1 .

Referências

Para obter mais informações, visite os seguintes Web sites da Microsoft:
Método Control.DoDragDrop
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop(vs.71).aspx)
Control.DragEnter Event
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx)
Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
822482  (http://support.microsoft.com/kb/822482/ ) COMO: Fornecer funcionalidade arrastar e largar em aplicações do Microsoft Windows utilizando o Microsoft Visual Basic .NET


A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbforms kbwindowsforms kblistview kbdragdrop kbctrl kbcontrol kbprb KB822483 KbMtpt
Tradução automáticaTradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 822483  (http://support.microsoft.com/kb/822483/en-us/ )