Jump to content
  • 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

Recommended Posts

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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.