Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

zephirus

Problema com verificação de items em listview

Mensagens Recomendadas

zephirus

Olá,

Estou farto de dar voltas ao meu código e não consigo por isto a funcionar em condições.

O meu código:

	Sub ListView1SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
	Dim SelectedItems As ListView.SelectedListViewItemCollection = CType(sender, ListView).SelectedItems
    If (SelectedItems.Count > 0) Then
    	inventoryIndex = SelectedItems.Item(0).Index.ToString
    	contextMenuStrip2.Items.Item(0).Enabled = True
    	contextMenuStrip2.Items.Item(1).Enabled = True
    Else
    	contextMenuStrip2.Items.Item(0).Enabled = False
    	contextMenuStrip2.Items.Item(1).Enabled = False
    End If
    Me.Text = selectedList & " - " & inventoryIndex
End Sub

Eu quero que os items do meu contextMenuStrip2 fiquem enabled ou disabled consoante eu carrego num item da listview ou não. Por exemplo, se tiver 2 items na listview e carregar em qualquer um deles, os items do contexmenu têm de ficar enabled. Se carregar fora, têm de ficar disabled. Este código só funciona "às vezes".

NOTA: além da listview1, tenho também outra listview e ando sempre a saltar de uma para outra, não sei se isto tem influência. O código da outra listview é igual mas o contextmenu é outro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fLaSh_PT

O problema está aqui:

 Dim  SelectedItems As ListView.SelectedListViewItemCollection = CType(sender, ListView).SelectedItems

Não convertas o objecto porque não é necessário, assim origina erro no caso de não estar nenhum Item seleccionado..

        Sub ListView1SelectedIndexChanged(sender As Object, e As  EventArgs) Handles ListView1.SelectedIndexChanged
	  If (ListView1.SelectedItems.Count > 0) Then
                inventoryIndex = ListView1.SelectedItems.Item(0).Index.ToString
                contextMenuStrip2.Items.Item(0).Enabled = True
                contextMenuStrip2.Items.Item(1).Enabled = True
            Else
                contextMenuStrip2.Items.Item(0).Enabled = False
                contextMenuStrip2.Items.Item(1).Enabled = False
            End If
            Me.Text = selectedList & " - " & inventoryIndex
        End Sub


Making the impossible possible and pwing the world on db at a time.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zephirus

Não resolveu o meu problema. Estou a dar em maluco com isto. Vou colocar mais código e explicar mais detalhadamente o que quero e onde estou a encontrar o problema.

Eu tenho duas listviews e para cada uma delas tenho um contextmenu.

Quando clico na listview1 tenho duas hipóteses: ou clico num item ou não. Quando clico num item tem de me aparecer o contextmenu com as duas opções enabled. No outro caso, aparecem ambas as opções disabled;

Quando clico na listview2, é tudo idêntico. A única diferença é que o enabled do contextmenu depende de um subitem da listview (o subitem de index 3). Quando esse subitem é igual à variável 'loggedName', ambos os items do contextmenu estão enabled. Se não for igual, apenas o 2º item está enabled.

No caso do useraccess ser 'admin', ambos estão enabled.

O problema é que isto está trocado e nem sempre fica correcto. Código em baixo:

	Sub ListView1SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
    If (ListView1.SelectedItems.Count > 0) Then
    	inventoryIndex = ListView1.SelectedItems.Item(0).Index.ToString
    	contextMenuStrip2.Items.Item(0).Enabled = True
    	contextMenuStrip2.Items.Item(1).Enabled = True
    Else
    	contextMenuStrip2.Items.Item(0).Enabled = False
    	contextMenuStrip2.Items.Item(1).Enabled = False
    End If
End Sub

	Sub ListView2SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView2.SelectedIndexChanged
    If (ListView2.SelectedItems.Count > 0) Then
		Select Case loggedAccess
			Case = "admin"
				inventoryIndex = ListView2.SelectedItems.Item(0).Index.ToString
				contextMenuStrip3.Items.Item(0).Enabled = True
				contextMenuStrip3.Items.Item(1).Enabled = True
			Case Else
				Select Case ListView2.Items.Item(inventoryIndex).SubItems.Item(3).Text
					Case = loggedName
						inventoryIndex = ListView2.SelectedItems.Item(0).Index.ToString
						contextMenuStrip3.Items.Item(0).Enabled = True
						contextMenuStrip3.Items.Item(1).Enabled = True
					Case Else
						inventoryIndex = ListView2.SelectedItems.Item(0).Index.ToString
						contextMenuStrip3.Items.Item(1).Enabled = False
						contextMenuStrip3.Items.Item(1).Enabled = True
				End Select
		End Select
    Else
    	contextMenuStrip3.Items.Item(0).Enabled = False
    	contextMenuStrip3.Items.Item(1).Enabled = False
    End If
End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fLaSh_PT

Creio que o teu problema está aqui;

ListView2.Items.Item(inventoryIndex).SubItems.Item(3).Text

Por o que percebi, está a deferir "inventoryIndex" quando seleccionas um item da Listview1.. no entanto depois tentas ver o "Text" da listview2 como o mesmo index...

O index de um Item seleccionado em uma listview é o mais provável ser diferente da outra listview..

Entendes?


Making the impossible possible and pwing the world on db at a time.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zephirus

Creio que o teu problema está aqui;

ListView2.Items.Item(inventoryIndex).SubItems.Item(3).Text

Por o que percebi, está a deferir "inventoryIndex" quando seleccionas um item da Listview1.. no entanto depois tentas ver o "Text" da listview2 como o mesmo index...

O index de um Item seleccionado em uma listview é o mais provável ser diferente da outra listview..

Entendes?

Entendo. Mas de qualquer forma, quando eu clico com o botão direito numa listview diferente, não devia actualizar essa variável?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fLaSh_PT

        Sub ListView1SelectedIndexChanged(sender As Object, e As  EventArgs) Handles ListView1.SelectedIndexChanged
            If (ListView1.SelectedItems.Count > 0) Then
                inventoryIndex = ListView1.SelectedItems.Item(0).Index.ToString
                contextMenuStrip2.Items.Item(0).Enabled = True
                contextMenuStrip2.Items.Item(1).Enabled = True
            Else
                contextMenuStrip2.Items.Item(0).Enabled = False
                contextMenuStrip2.Items.Item(1).Enabled = False
                inventoryIndex = Nothing
            End If
        End Sub

--> inventoryIndex = Nothing

Caso contrario, ficara sempre no ultimo valor desde que foi seleccionado..

Depois no outro sub tens em conta:

 If inventoryIndex  Is Nothing then
'..........
Else
'..........
End If


Making the impossible possible and pwing the world on db at a time.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
zephirus

É escusado. Não funciona. Criei duas variáveis em separado e agora tenho um problema nesta parte da listView2:

Select Case ListView2.Items.Item(inventoryIndex).SubItems.Item(3).Text
   Case = loggedName

loggedName é claramente diferente do valor que está na lista 2 e mesmo assim ele cai no caso em que é igual! Ou seja, ambos os items do contextmenu ficam enabled. Se eu clicar fora da lista e voltar a carregar, então ai já fica bom. Porquê?!?!?

EDIT: esquece, entretanto lembrei-me que tenho uma função de refresh a todos os dados, sempre que há uma modificação nas listas. Nesse update, acrescentei o reset dos indexs e já funciona.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.