Oppure

Loading
15/06/21 7:48
alip1
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.
aaa
15/06/21 8:02
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#

 private void Elimina_Click(object sender, EventArgs e)
        {
            if(sender.GetType() == typeof(ListView))
            {
                if( ((ListView)sender).Name == "RecordFiltratiTipoA")
                {
                    //Esegui azione sui record filtrati di tipo A
                }

                if (((ListView)sender).Name == "RecordFiltratiTipoB")
                {
                    //Esegui azione sui record filtrati di tipo B
                }
            }
        }




in vb.net dovrebbe essere così


Private Sub Elimina_Click(ByVal sender As Object, ByVal e As EventArgs)
    If sender.[GetType]() = GetType(ListView) Then

        If (CType(sender, ListView)).Name = "RecordFiltratiTipoA" Then
        'Esegui azione sui record filtrati di tipo A
        End If

        If (CType(sender, ListView)).Name = "RecordFiltratiTipoB" Then
        'Esegui azione sui record filtrati di tipo B
        End If
    End If
End Sub



Ultima modifica effettuata da Thejuster 15/06/21 8:04
mire.forumfree.it/ - Mire Engine
C# UI Designer
16/06/21 8:28
alip1
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#

 private void Elimina_Click(object sender, EventArgs e)
        {
            if(sender.GetType() == typeof(ListView))
            {
                if( ((ListView)sender).Name == "RecordFiltratiTipoA")
                {
                    //Esegui azione sui record filtrati di tipo A
                }

                if (((ListView)sender).Name == "RecordFiltratiTipoB")
                {
                    //Esegui azione sui record filtrati di tipo B
                }
            }
        }




in vb.net dovrebbe essere così


Private Sub Elimina_Click(ByVal sender As Object, ByVal e As EventArgs)
    If sender.[GetType]() = GetType(ListView) Then

        If (CType(sender, ListView)).Name = "RecordFiltratiTipoA" Then
        'Esegui azione sui record filtrati di tipo A
        End If

        If (CType(sender, ListView)).Name = "RecordFiltratiTipoB" Then
        'Esegui azione sui record filtrati di tipo B
        End If
    End If
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:
 Private Sub CMNuovo_Click(sender As Object, e As EventArgs) Handles CMNuovo.Click
      If sender.[GetType]() = GetType(ListView) Then

         If (CType(sender, ListView)).Name = "LVTutte" Then
            'Esegui azione sui record filtrati di tipo A
            If LVTutte.SelectedIndices.Count > 0 Then

            Else
               Beep()

            End If
         End If

         If (CType(sender, ListView)).Name = "LVFiltrate" Then
            'Esegui azione sui record filtrati di tipo B
         End If
      End If
   End Sub

Ma il
sender.[GetType]()
mi dice che è : Nuovo ; ossia mi da il valore della voce e non già il tipo. Dov'è il problema??
aaa
16/06/21 8:56
Thejuster
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 16/06/21 8:57
mire.forumfree.it/ - Mire Engine
C# UI Designer
16/06/21 9:18
alip1
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 16/06/21 9:19
aaa