Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - ContextMenu come utilizzarlo
Forum - C# / VB.NET - ContextMenu come utilizzarlo

Avatar
alip1 (Normal User)
Pro


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 9:48
Martedì, 15/06/2021
Buongiorno
scusatemi ma vi sottopongo una problematica che per voi sarà banale ma vorrei capirla bene.
Dunque in un form ho due listview che mostrano in maniera identica una serie di item corrispondente a dei records prelevati da db.
La prima listView1 mostra tutti i record la seconda solo i records filtrati con un certo criterio.
Alla prima listView1 ho collegato un contextmenu1 che dovrebbe permettermi di fare alcune operazioni relativamente all'item selezionato (ad es.:modifica, cancellazione).
Il tutto funziona perfettamente.
Ora mi chiedevo volendo fare la stessa cosa per la listView2 è possibile collegarla anch'essa allo stesso contextmenu?
Se si quando clicco su una delle voci di menu come faccio a differenziare se riferito alla prima listView1 o alla seconda?
O devo necessariamente inserire due diversi contextmenu?
Spero di essermi spiegato.
Grazie a tutti per ogni consiglio.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:02
Martedì, 15/06/2021
Teoricamente potresti generare dei ContextMenu anche a runtime.

Se vuoi collegare lo stesso ContextMenu su più controlli ti basta selezionarlo dalle proprietà,
Entrambe le due listview su ContextMenu1 esempio.
Ma ho capito cosa intendi.


Per differenziare le azioni, ovviamente devi dare un nome diverso alle due listview.

All'evento del ContextMenu esempio "Elimina"

Quindi se la prima ListView esempio si chiama: RecordFiltratiTipoA
eseguira una funzione, se invece ha un nome diverso, eseguirà un'altra funzione sempre allo stesso click ovviamente.

in C#

Codice sorgente - presumibilmente C# / VB.NET

  1. private void Elimina_Click(object sender, EventArgs e)
  2.         {
  3.             if(sender.GetType() == typeof(ListView))
  4.             {
  5.                 if( ((ListView)sender).Name == "RecordFiltratiTipoA")
  6.                 {
  7.                     //Esegui azione sui record filtrati di tipo A
  8.                 }
  9.  
  10.                 if (((ListView)sender).Name == "RecordFiltratiTipoB")
  11.                 {
  12.                     //Esegui azione sui record filtrati di tipo B
  13.                 }
  14.             }
  15.         }




in vb.net dovrebbe essere così

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Elimina_Click(ByVal sender As Object, ByVal e As EventArgs)
  2.     If sender.[GetType]() = GetType(ListView) Then
  3.  
  4.         If (CType(sender, ListView)).Name = "RecordFiltratiTipoA" Then
  5.         'Esegui azione sui record filtrati di tipo A
  6.         End If
  7.  
  8.         If (CType(sender, ListView)).Name = "RecordFiltratiTipoB" Then
  9.         'Esegui azione sui record filtrati di tipo B
  10.         End If
  11.     End If
  12. End Sub




Ultima modifica effettuata da Thejuster il 15/06/2021 alle 10:04


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 10:28
Mercoledì, 16/06/2021
Testo quotato

Postato originariamente da Thejuster:

Teoricamente potresti generare dei ContextMenu anche a runtime.

Se vuoi collegare lo stesso ContextMenu su più controlli ti basta selezionarlo dalle proprietà,
Entrambe le due listview su ContextMenu1 esempio.
Ma ho capito cosa intendi.


Per differenziare le azioni, ovviamente devi dare un nome diverso alle due listview.

All'evento del ContextMenu esempio "Elimina"

Quindi se la prima ListView esempio si chiama: RecordFiltratiTipoA
eseguira una funzione, se invece ha un nome diverso, eseguirà un'altra funzione sempre allo stesso click ovviamente.

in C#

Codice sorgente - presumibilmente C# / VB.NET

  1. private void Elimina_Click(object sender, EventArgs e)
  2.         {
  3.             if(sender.GetType() == typeof(ListView))
  4.             {
  5.                 if( ((ListView)sender).Name == "RecordFiltratiTipoA")
  6.                 {
  7.                     //Esegui azione sui record filtrati di tipo A
  8.                 }
  9.  
  10.                 if (((ListView)sender).Name == "RecordFiltratiTipoB")
  11.                 {
  12.                     //Esegui azione sui record filtrati di tipo B
  13.                 }
  14.             }
  15.         }




in vb.net dovrebbe essere così

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Elimina_Click(ByVal sender As Object, ByVal e As EventArgs)
  2.     If sender.[GetType]() = GetType(ListView) Then
  3.  
  4.         If (CType(sender, ListView)).Name = "RecordFiltratiTipoA" Then
  5.         'Esegui azione sui record filtrati di tipo A
  6.         End If
  7.  
  8.         If (CType(sender, ListView)).Name = "RecordFiltratiTipoB" Then
  9.         'Esegui azione sui record filtrati di tipo B
  10.         End If
  11.     End If
  12. End Sub






Grazie ho cercato di fare come mi suggerisci, ma non riesco a differenziare. Mi spiego meglio : il contextmenu1 ha tre voci: Nuovo, Modifica, Cancella con i seguenti nomi CMNuovo, CMModifica, CMCancella. Ovviamente credo che debba agganciare l'evento relativo a ciascuna voce.  Per cui ho:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub CMNuovo_Click(sender As Object, e As EventArgs) Handles CMNuovo.Click
  2.       If sender.[GetType]() = GetType(ListView) Then
  3.  
  4.          If (CType(sender, ListView)).Name = "LVTutte" Then
  5.             'Esegui azione sui record filtrati di tipo A
  6.             If LVTutte.SelectedIndices.Count > 0 Then
  7.  
  8.             Else
  9.                Beep()
  10.  
  11.             End If
  12.          End If
  13.  
  14.          If (CType(sender, ListView)).Name = "LVFiltrate" Then
  15.             'Esegui azione sui record filtrati di tipo B
  16.          End If
  17.       End If
  18.    End Sub


Ma il
Codice sorgente - presumibilmente Plain Text

  1. sender.[GetType]()

mi dice che è : Nuovo ; ossia mi da il valore della voce e non già il tipo. Dov'è il problema??

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:56
Mercoledì, 16/06/2021
Ops, hai ragione, ho confuso...

Ovviamente, ti dice nuovo perché al click l'elemento che cerca di identificare e relativo a dove viene effettuato il click
(su che elemento).

Bhe se vogliamo fare proprio una cosa semplice, senza creare confusione, ti basta che al click sulla Listview imposti un bool o un qualcosa per dire "Ho cliccato sulla ListView "LVTutte"

in questo caso,

Click su ListView LVTutte   setta un bool tipo CliccatosuLVTutte = true, CliccatosuLVFiltrate = false.
e viceversa.

in quel punto al click dell'item del menu tipo "Nuovo" o "Elmina" verifiche quale bool è attivo
e di conseguenza fai eseguire ciò che devi per quella condizione.


Ultima modifica effettuata da Thejuster il 16/06/2021 alle 10:57


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 11:18
Mercoledì, 16/06/2021
Grazie
Ma ho risolto creando due contextmenu uno per la prima listview ed un'altro per la seconda anche se di fatto identici ma mi rispondono in maniera differenziata....
Grazie

Ultima modifica effettuata da alip1 il 16/06/2021 alle 11:19
PM Quote