Pergunta

Gostaria de manter um item selecionado, em uma ListView, quando o usuário clicar em um espaço que não tem item. Por exemplo, o espaço abaixo dos itens, mas ainda no componente ListView. Eu alterei a propriedade ListView "HidesElection" para False, mas isso só funciona quando o foco é alterado para outro componente; Não quando o usuário clica no próprio ListView. Obrigado!

Foi útil?

Solução

Isso é algo que você normalmente não deve consertar. O usuário clicou em algum lugar intencionalmente, isso pode estar porque ela desejado para desmarcar um item. Se não foi intencional, ela entenderá o que aconteceu e saberá como corrigi -lo. A oferta de controles padrão não-padrão tende a confundir apenas o usuário.

Mas você pode consertar isso. Você precisará impedir que o controle da ListView nativo veja o clique. Isso requer substituir o método wndproc () e verificar onde ocorreu o clique. Adicione uma nova classe ao seu projeto e cole o código mostrado abaixo. Compilar. Solte o novo controle da parte superior da caixa de ferramentas no formulário.

using System;
using System.Drawing;
using System.Windows.Forms;

class MyListView : ListView {
  protected override void WndProc(ref Message m) {
    if (m.Msg == 0x201 || m.Msg == 0x203) {  // Trap WM_LBUTTONDOWN + double click
      var pos = new Point(m.LParam.ToInt32());
      var loc = this.HitTest(pos);
      switch (loc.Location) {
        case ListViewHitTestLocations.None:
        case ListViewHitTestLocations.AboveClientArea:
        case ListViewHitTestLocations.BelowClientArea:
        case ListViewHitTestLocations.LeftOfClientArea:
        case ListViewHitTestLocations.RightOfClientArea:
          return;  // Don't let the native control see it
      }
    }
    base.WndProc(ref m);
  }
}

Outras dicas

Uma maneira: no evento SelectedIndexchanged, verifique se o valor é -1; Nesse caso, redefini -lo para o valor anterior (que você talvez seja armazenado em uma variável ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top