Filtro in base a scelta su combo

di il
12 risposte

Filtro in base a scelta su combo

Salve a tutti,

scusate so che dal titolo non si comprende affatto il problema ma non so proprio nemmeno cosa chiedere.

in pratica ho una combo dove posso scegliere < > oppure =  e poi ho una textbox dove inserisco un valore quindi vad a "prendere" dalla lista solo i numeri che soddisfano quel filtro ( quindi maggiori di x oppure minore di x oppure = ad x)

La domanda da neofita è come posso fare ? Vorrei fare una cosa del tipo 

if NumeroDaVerfiicare & combi1.text & text1.text allora lo prendo per valido   dovrebbe uscire una cosa del tipo

if 3 < 5 allora ok ma visto che il simbolo < cambia di volta in volta in base alla mia scelta come posso fare ?

l'unica cosa che mi viene in mente è del tipo

if combo.text ="<" then

if numero < text1.text allore ok

elseif combo.text =">" Then

if numero >text1.text allora ok

elseif combo.text="=" Then

if numero = text1.text

ma mi sembra un obrobio !!!!

Grazie e scusate la domanda probabilmente banale.

12 Risposte

  • Re: Filtro in base a scelta su combo

    Intanto usa una Select Case per individuare i tre casi < = >

  • Re: Filtro in base a scelta su combo

    La combo ha un indice

    Il primo valore ha indice zero

    If indice=0 bla bla

    Anche se io userei case...

  • Re: Filtro in base a scelta su combo

    Grazie del consiglio.... pensavo ci fosse qualcosa di più "professionale" 

    gentilissimi

  • Re: Filtro in base a scelta su combo

    Cosa intendi per professionale?

    15/02/2025 - psx2 ha scritto:

    if combo.text ="<" then

    if numero < text1.text allore ok

    Questo non fa niente...

    15/02/2025 - psx2 ha scritto:

    if 3 < 5 allora ok

    Che stai confrontando?

    Se 3 è minore di "5"? 

    Vuoi veramente sapere se un numero è minore di un testo? Mai in tutti i casi (<=>)

  • Re: Filtro in base a scelta su combo

    15/02/2025 - psx2 ha scritto:

    ma mi sembra un obrobio !!!!

    Ciao... ;-)    prova a studiare una soluzione con il Dictionary e Contain...

    ESEMPIO:

    ' Set operators dictionary
    Dim dicOperators As New Dictionary(Of String, Func(Of Integer, Integer, Boolean)) From {
        {"<", Function(a, b) a < b}, {">", Function(a, b) a > b}, {"<>", Function(a, b) a <> b},
        {"=", Function(a, b) a = b}, {"<=", Function(a, b) a <= b}, {">=", Function(a, b) a >= b}}
        
    
    ' Check boolean result 
    If dicOperators.ContainsKey(combi1.Text) AndAlso dicOperators(combi1.Text)(CInt(NumeroDaVerfiicare), CInt(text1.Text)) Then
        ' True
    Else
        ' False
    End If

    .

    Nota: se vuoi il Dictionary puoi definirlo a livello di classe in modo tale che il metodo non lo ricrea in continuazione 

    ' Set operators dictionary
    Private dicOperators As New Dictionary(Of String, Func(Of Integer, Integer, Boolean)) From {
        {"<", Function(a, b) a < b}, {">", Function(a, b) a > b}, {"<>", Function(a, b) a <> b},
        {"=", Function(a, b) a = b}, {"<=", Function(a, b) a <= b}, {">=", Function(a, b) a >= b}}

    In questo modo viene definito e caricato una sola volta e nel metodo  inserirai solo la tua If:

    ' Check boolean result 
    If dicOperators.ContainsKey(combi1.Text) AndAlso dicOperators(combi1.Text)(CInt(NumeroDaVerfiicare), CInt(text1.Text)) Then
        ' True
    Else
        ' False
    End If

    Vedere  :  

    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2?view=net-9.0

    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2.containskey?view=net-9.0

  • Re: Filtro in base a scelta su combo

    15/02/2025 - sihsandrea ha scritto:

    Cosa intendi per professionale?

    15/02/2025 - psx2 ha scritto:

    if combo.text ="<" then

    if numero < text1.text allore ok

    Questo non fa niente...

    15/02/2025 - psx2 ha scritto:

    if 3 < 5 allora ok

    Che stai confrontando?

    Se 3 è minore di "5"? 

    Vuoi veramente sapere se un numero è minore di un testo? Mai in tutti i casi (<=>)

    In pratica:

    Se la combo contiene <

    devo fare

     se 2<3 allora..  

    Se la combo contiene =

    devo fare

    se 2=3 allora

    se la combo contiene >

    devo fare 

    Se 2>3 allora

    In realtà non sono semplici numeri ma ho semplificato per non intrecciarmi nella richiesta ma il concetto è quello.

    15/02/2025 - By65Franco ha scritto:

    15/02/2025 - psx2 ha scritto:

    ma mi sembra un obrobio !!!!

    Ciao... ;-)    prova a studiare una soluzione con il Dictionary e Contain...

    ESEMPIO:

    ' Set operators dictionary
    Dim dicOperators As New Dictionary(Of String, Func(Of Integer, Integer, Boolean)) From {
        {"<", Function(a, b) a < b}, {">", Function(a, b) a > b}, {"<>", Function(a, b) a <> b},
        {"=", Function(a, b) a = b}, {"<=", Function(a, b) a <= b}, {">=", Function(a, b) a >= b}}
        
    
    ' Check boolean result 
    If dicOperators.ContainsKey(combi1.Text) AndAlso dicOperators(combi1.Text)(CInt(NumeroDaVerfiicare), CInt(text1.Text)) Then
        ' True
    Else
        ' False
    End If

    .

    Nota: se vuoi il Dictionary puoi definirlo a livello di classe in modo tale che il metodo non lo ricrea in continuazione 

    ' Set operators dictionary
    Private dicOperators As New Dictionary(Of String, Func(Of Integer, Integer, Boolean)) From {
        {"<", Function(a, b) a < b}, {">", Function(a, b) a > b}, {"<>", Function(a, b) a <> b},
        {"=", Function(a, b) a = b}, {"<=", Function(a, b) a <= b}, {">=", Function(a, b) a >= b}}

    In questo modo viene definito e caricato una sola volta e nel metodo  inserirai solo la tua If:

    ' Check boolean result 
    If dicOperators.ContainsKey(combi1.Text) AndAlso dicOperators(combi1.Text)(CInt(NumeroDaVerfiicare), CInt(text1.Text)) Then
        ' True
    Else
        ' False
    End If

    Vedere  :  

    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2?view=net-9.0

    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2.containskey?view=net-9.0

    Grazie by65franco,

    Daro un occhiata 

  • Re: Filtro in base a scelta su combo

    Visto che stai iniziando, perché non inizi a studiare gli elementi base del linguaggio? Hai letto quello che ti ho suggerito?

  • Re: Filtro in base a scelta su combo

    15/02/2025 - oregon ha scritto:

    Visto che stai iniziando, perché non inizi a studiare gli elementi base del linguaggio? Hai letto quello che ti ho suggerito?

    Si si grazie,

    Alla fine infatti ho utilizzato il select case  

    Ma mi ha incuriosito 'esempio di by65franco che non conoscevo!

    Grazie ancora

  • Re: Filtro in base a scelta su combo

    15/02/2025 - psx2 ha scritto:

    Ma mi ha incuriosito 'esempio di by65franco che non conoscevo!

    Ciao, devi approfondire gli argomenti della documentazione del supporto Microsoft che ti ho fornito in precedenza
    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2?view=net-9.0
    https://learn.microsoft.com/it-it/dotnet/api/system.collections.generic.dictionary-2.containskey?view=net-9.0

    Esempio per darti alcuni suggerimenti:

    • A livello di classe della Form  inserisci la dichiarazione e l'impostazione di un Dictionary
      • Il Dictionary verrà caricato una sola volta per tutte in Open Form e sarà visibile in tutta la Classe Form (poniamo che la tua Form si chiami FormYourForm)
    Public Class FormYourForm
    
        ' Set operators dictionary
        Private dicOperators As New Dictionary(Of String, Func(Of Integer, Integer, Boolean)) From {
        {"<", Function(a, b) a < b}, {">", Function(a, b) a > b}, {"<>", Function(a, b) a <> b},
        {"=", Function(a, b) a = b}, {"<=", Function(a, b) a <= b}, {">=", Function(a, b) a >= b}}
    
    • Come avrai notato ho caricato tutti gli operatori di confronto di base
    • Il Dictionary, in questo caso, ha questa struttura:
      • Chiave : ogni chiave inserita rappresenta un "Operatore di Confronto" di tipo string (es. "<", ">", "<=", "<>",  etc...)
      • Valore : (Func(Of Integer, Integer, Boolean)) è una funzione che ha due Integer e restituisce True o False in base alla condizione specificata
        • Esempio: il dicOperators ("<") (3, 5) , equivale a scrivere 3 < 5  e in questo caso restituisce True
    • Adesso inserire nel tuo codice (nel Metodo dove devi eseguire tali confronti) la tua If :
    ' Check boolean result 
    If dicOperators.ContainsKey(combi1.Text) AndAlso dicOperators(combi1.Text)(CInt(NumeroDaVerficare), CInt(text1.Text)) Then
        ' True
    Else
        ' False
    End If
    • In questa If si ottiene il risultato True o False sulla base del confronto che hai eseguito:
      • If dicOperators.ContainsKey(combi1.Text) : verifica se esiste la Chiave con l'operatore scelto nella ComboBox
      • AndAlso : se la chiave non viene trovata restituisce direttamente False, altrimenti restituisce True e in questo caso esegue:
      • dicOperators(combi1.Text)(CInt(NumeroDaVerficare), CInt(text1.Text)) prende la funzione per la chiave corrispondente all'operatore selezionato in combi1.Text e la esegue passando i parametri NumeroDaVerfiicare e text1.Text.
      • La funzione esegue il confronto con l'operatore e i valori passati e restituisce True o False

    .
    Se studi bene il Dictionary e i suoi campi applicativi, vedrai che ti tornerà molto utile in diversi scenari.
    Risulta Dinamico, Performante, tiene in ordine e pulito e rende di facile lettura il codice. 
    In certi casi riduce sensibilmente il numero di righe da scrivere.

    Ricordati che devi inserire i dovuti controlli per validare

    • la ComboxBox che non ritorni Null (almeno un Item selezionato)
    • la TexBox che non ritorni un valore Null e/o "" . Convertire sempre i valori String in tipo Numerico secondo le tue necessità
    • il NumeroDaVerficare che contenga un valore diverso da Null
  • Re: Filtro in base a scelta su combo

    Accidenti bufranco65,

    è perfetto, devo proprio studiare !!

    Grazie grazie a tutti,

    Gentilissimi.

  • Re: Filtro in base a scelta su combo

    Uhm... Per completezza e non uscire dall'oggetto del titolo.

    Come hai intenzione di metterlo come filtro?

    Avendo una combo ed una textbox puoi già applicare il filtro.

    Basta mettere la condizione 

    (Valore<textvbox.value and combo.itemindex=0) or

    (Valore>textvbox.value and combo.itemindex=1) or

    (Valore<>textvbox.value and combo.itemindex=2) or

    (Eccetera eccetera) Or

    (Valore like% and textbox.valur='')

    Senza usare ulteriori risorse.

    Vuoi usare sql?

    Select bla bla 

    where

    (CampoX<[parametrotesto] and [parametrooperatore]=0) or

    (Idem per le altre opzioni)

    Or (campo like % and [parametrotesto]='')

    Impostando:

    Parametrotesto=textvbox.value

    Parametrooperatore= combo.itemindex

    Usando il dizionario la parte value dovrebbe essere o una sql o un filtro da mettere sui criteri (tabella access) usando trygetvalue.

  • Re: Filtro in base a scelta su combo

    Accidenti,

    Grazie infinite a tutti,

    Gentilissimi

Devi accedere o registrarti per scrivere nel forum
12 risposte