54 messaggi dal 10 aprile 2017
Buon pomeriggio a tutti VOI,
ciao

in vs i controlli più comuni sono (intendo quelli a livello form) una quarantina e poco più
progetto la mia form come mi piace di più
soprattutto con l'aiuto degli interventi di questo forum entro nel merito dei controlli anche se sono annidati
e fin qui va tutto benissimo
il codice che uso è questo per l'oggetto Button
        
Dim ELENCOCONTROLLIBT As New List(Of Control)
ELENCOCONTROLLIBT = GETALLCONTROLS(Of Button)(Me)


Private Function GETALLCONTROLS(Of T)(ByVal searchWithin As Control) As List(Of Control)


        Dim returnList As New List(Of Control)

        If searchWithin.HasChildren = True Then
            For Each ctrl As Control In searchWithin.Controls
                If TypeOf ctrl Is T Then
                    returnList.Add(ctrl)
                End If
                returnList.AddRange(GETALLCONTROLS(Of T)(ctrl))
            Next
        ElseIf searchWithin.HasChildren = False Then
            For Each ctrl As Control In searchWithin.Controls
                If TypeOf ctrl Is T Then
                    returnList.Add(ctrl)
                End If
                returnList.AddRange(GETALLCONTROLS(Of T)(ctrl))
            Next
        End If
        Return returnList
    End Function


per avere l'elenco di altri oggetti basta sostituire a Button quello che interessa TextBox, CheckedListBox etc ect
.........................
in definitiva quello che mi piacerebbe fare è svincolarmi in fare si scrittura del codice dagli oggetti che vado a disegnare nella form e qui sorge la domanda


        
Dim ELENCOCONTROLLIBT As New List(Of Control)
ELENCOCONTROLLIBT = GETALLCONTROLS(Of Button)(Me)

sappiamo che Button è un Control
ho una lista dei controlli comuni
vorrei fare un ciclo passando al posto di Button una variabile che una alla volta li contiene
la variabile ovviamente (penso) deve essere di tipo control
prima di scrivere c'ho provato ma invano a convertire una variabile stringa [che contiene il controllo di cui voglio sapere le caratteristiche] in control invano...

        
Dim ELENCOCONTROLLIBT As New List(Of Control)
ELENCOCONTROLLIBT = GETALLCONTROLS(Of xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)(Me)


ammesso che si possa... xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx che sia una variabile di tipo control che assegno da una lista

uhm
ho riletto penso di essere stata chiara nella esposizione
come sempre GRAZIE per le risposte
buon lavoro
lily
333 messaggi dal 05 novembre 2012
Ciao,

non amo particolarmente vb.net (problema mio  ), inizio a postarti una possibile soluzione con c# ... eventualmente se hai problemi nel comprendere e tradurre in vb.net chiedi e vediamo di risolvere :)

public Form1()
{
    InitializeComponent();

    var types = new List<Type> { typeof(Label), typeof(TextBox) };

    var message = new StringBuilder();

    foreach (Type type in types)
    {
        IEnumerable<Control> c = GetAllControls(this, type);
        message.AppendLine($"Totale '{type.Name}': {c.Count()}");
    }

    MessageBox.Show(message.ToString());
}

public IEnumerable<Control> GetAllControls(Control control, Type type)
{
    List<Control> controls = control.Controls.Cast<Control>().ToList();

    foreach (Control c in controls.SelectMany(ctrl => GetAllControls(ctrl, type))
        .Concat(controls))
    {
        if (c.GetType() == type) yield return c;
    }
}



/Ciao

Alessio
333 messaggi dal 05 novembre 2012
questa penso sia la traduzione in vb.net

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim types As List(Of Type) = New List(Of Type) From { GetType(Label), GetType(TextBox) }

    Dim message As StringBuilder = New StringBuilder()

    For Each type As Type In types
        
        Dim c As New List(Of Control)
        c = GetAllControls(Me, type)
        message.AppendLine("Totale '" + type.Name + "': " + c.Count.ToString())
    Next

    MessageBox.Show(message.ToString())

End Sub

Private Function GetAllControls(ByVal control As Control, ByVal type As Type) As List(Of Control)

    Dim controls(control.Controls.Count - 1) As Control
    control.Controls.CopyTo(controls, 0)

    Dim output As List(Of Control) = New List(Of Control)()

    For Each c As Control In controls.SelectMany(Function(ctrl) GetAllControls(ctrl, type)).Concat(controls)
        
        If c.GetType() = type Then
            
            output.Add(c)

        End If

    Next

    Return output

End Function



/Ciao

Alessio
54 messaggi dal 10 aprile 2017
Ciao scioCoder

grazie sia per il codice C sia per sua traduzione che è arrivata subito dopo
nel frattempo mi son messa di cozzo buono e sto concludendo la mia
al di la della traduzione la soluzione al mio quesito è questa

    Dim types As List(Of Type) = New List(Of Type) From { GetType(Label), GetType(TextBox) }


la dichiarazione di una lista di Type
dove ciascun elemento è dato da GetType

=========
foreach (Control c in controls.SelectMany(ctrl => GetAllControls(ctrl, type))
        .Concat(controls))
    {
        if (c.GetType() == type) yield return c;
    }


interessante questo fragmento di codice la SelectMany che non la conoscevo
ci risentiamo tra un pochetto

mille grazie
lily
54 messaggi dal 10 aprile 2017
Ciao Alessio,

uhm diciamo che oggi ho imparato cose nuove e ne son felice grazie al tuo supporto
però
devo cercare di modificare la tua funzione affinché ella mi possa restituire (non so come ne in che modo)
i dati del controllo
mi spiego meglio
in una form ho dentro ventun bottoni delle txtbox etc
per ciascuno divisi per tipo devo sapere il nome (tutti gli attributi) dell'oggetto [poi che li uso o meno + un altro discorso]
ci provo...
mille grazie
buona serata
lily
333 messaggi dal 05 novembre 2012
Ciao Liliana,
interessante questo fragmento di codice la SelectMany che non la conoscevo

Fondamentalmente SelectMany appiattisce una lista di liste in un'unica lista di valori...

Fa parte del magico mondo :) Linq
Per esempio la function di prima, utilizzando una linq-expression può essere riscritta così

Private Function GetAllControls2(ByVal control As Control, ByVal type As Type) As List(Of Control)

    Dim controls(control.Controls.Count - 1) As Control
    control.Controls.CopyTo(controls, 0)

    Dim output As List(Of Control) = (From c In controls.SelectMany(Function(ctrl) GetAllControls(ctrl, type)).Concat(controls) Where c.GetType() = type).ToList()
        
    Return output

End Function

In questo caso, cmq, sentiti libera di utilizzare la soluzione che ti dà più sicurezza e leggibilità del codice...la differenza a livello di performance è irrisoria (su grandi numeri la soluzione con il loop è più performante). Naturalmente è un pensiero personale e va preso come tale :)

per ciascuno divisi per tipo devo sapere il nome (tutti gli attributi) dell'oggetto [poi che li uso o meno + un altro discorso]


Questi sono alcuni esempi di quello che puoi fare ... ma non sò se fanno al caso tuo ... eventualmente spiega meglio la tua esigenza

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim types As List(Of Type) = New List(Of Type) From {GetType(Label), GetType(TextBox), GetType(CheckBox)}

    Dim message As StringBuilder = New StringBuilder()

    For Each type As Type In types

        Dim allControls As List(Of Control) = GetAllControls(Me, type)

        ' === Proprietà comuni e presenti nel Tipo Control, es. Name
        
        ' Ciclo tutte i controlli restituiti per il tipo corrente
        For Each control As Control In allControls

            Dim name = control.Name

        Next

        ' Leggo il nome del primo controllo della lista
        Dim nomePrimoControllo = allControls.FirstOrDefault().Name

        ' Salvo in una lista tutti i nomi dei controlli (method sintax)
        Dim nomiDiTuttiIControlli1 = allControls.Select(Function(textbox) textbox.Name)
        ' Salvo in una lista tutti i nomi dei controlli (query sintax)
        Dim nomiDiTuttiIControlli2 = From control In allControls Select control.Name

        ' Salvo in una lista tutti i nomi dei controlli visibili (method sintax)
        Dim nomiDiTuttiIControlliVisibili1 =  allControls.Where(Function(control) control.Visible).Select(Function(control) control.Name)
        ' Salvo in una lista tutti i nomi dei controlli visibili (query sintax)
        Dim nomiDiTuttiIControlliVisibili2 = From control In allControls Where control.Visible Select control.Name


        ' === Azioni specifiche per tipo

        If type = GetType(CheckBox) then

            Dim allCheckbox = allControls.Cast(Of CheckBox).ToList()

            ' Ciclo tutte le checkbox
            For Each checkbox As CheckBox In allCheckbox

                Dim checked = checkBox.Checked

            Next

        End If

        message.AppendLine("Totale '" + type.Name + "': " + allControls.Count.ToString())

    Next

    MessageBox.Show(message.ToString())

End Sub


Buona serata
Modificato da scioCoder il 07 marzo 2019 23:12 -
Modificato da scioCoder il 07 marzo 2019 23:15 -

Alessio
54 messaggi dal 10 aprile 2017
Buongiorno Alessio,
grazie per la risposta che nelle prossime ore mi studierò
cercherò di esser più chiara nell'esposizione (eventualmente) delle mie necessità
sai...mi sento sempre un po' in imbarazzo a chiedere "oltre" perché certamente siete super impegnati e mi sento come se vi rubassi del tempo prezioso con questi problemucci
per ora infinitamente grazie
ciao
lily
54 messaggi dal 10 aprile 2017
Alessio,
rieccomi
il codice ultimo tuo è perfetto riesco a vedere tutto ciò che più m'interessa
grazie
==============
premetto un po' per accademia un po' per il caso specifico entro in merito a quello che vorrei fare
- con vs progetto una form
- nel visualizzatore metto i controlli che m'interessa gestire
- assegno un nome le caratteristiche etc
[siam sempre in fase di sviluppo]
- mentre sviluppo ovviamente scrivo codice
- il codice lo provo etc
[classica modalità come si fa di solito]

quello che sto cercando di fare è un pezzo di codice che messo nella _Show dellE form mi vada a scrivere su db le principali caratteristiche dei controlli che son presenti nella form
la tabella sarà molte semplice
|NOME DELLA FORM|TIPO DEL CONTROLLO|NOME|TEST|ETC

ovviamente ci sarà una classe che mi va a gestire la tabella
cioè se tolgo un controllo o ne vario le sue caratteristiche la tabella sarà sempre aggiornata
===================
certo che sì potrei farlo a mano
mentre progetto la form popolo la tabella db ma così sarebbe troppo semplice

a runtime modificherò un parametro globale che NON mi andrà a fare più il codice che esegue in fase di sviluppo
a runtime ci sarà altro codice che si leggerà la tabella a seconda della form caricata [ovviamente tutto in memoria cioè mi carico a priori la tabella] e farà quel che deve (per esempio in funzione a determinate "regole" abiliterà o meno campi o bottoni o li nasconderà o si genererà form dinamiche nuove chi ne ha più ne metta

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.