Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net] trovare ricorsivamente un controllo che abbia una data proprietà

    codice:
        Public Function getValueRadioSelected(control As Control, GroupName As String) As String
            Dim result As String = ""
            Dim trovato As Boolean = False
    
            For Each c As Control In control.Controls
                If TypeOf c Is RadioButton Then
                    Dim rb As RadioButton = DirectCast(c, RadioButton)
                    Dim nome As String = rb.GroupName
                    If nome = GroupName Then
                        If rb.Checked Then
                            result = rb.Attributes("value")
                            trovato = True
                            'Return result
                            Exit For
                        End If
                    End If
    
                End If
                If Not trovato Then getValueRadioSelected(c, GroupName)
            Next
            Return result
        End Function
    Mi sono impallato nel codice precedente.
    Partendo da un controllo contenitore, debbo trovare il controllo che:
    è di tipo RadioButton
    ha una data proprietà GroupName
    ha la proprietà checked a true

    Andando col debug trovo quello che cerco. La variabile result contiene il dato.
    Purtroppo continua la ricorsione e perde il suo valore

    Mi dareste una mano a venirne a capo?

    Pietro

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,290
    Ma perchè richiami ricorsivamente la funzione all'interno del ciclo?

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da URANIO
    Ma perchè richiami ricorsivamente la funzione all'interno del ciclo?

    ho premesso che la funzione è sbagliata e forse è quello lo sbaglio?
    Pietro

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Originariamente inviato da URANIO
    Ma perchè richiami ricorsivamente la funzione all'interno del ciclo?
    Credo che l' errore sia proprio lì anche perchè la funzione viene richiamata passandogli "c"...se non sbaglio riparte da un controllo "contenuto" da quello iniziale...
    Comunque, tralasciando le proprietà nel codice sopra che non conosco...è più semplice ed immediato qualcosa del genere:
    codice:
        Public Function getValueRadioSelected(ByVal control As Control, ByVal testo As String) As String
            Dim result As String = "non ho trovato niente..."
    
            For Each c As RadioButton In control.Controls
                If c.Text = testo Then
                    If c.Checked Then
                        result = c.Text
                        Exit For
                    End If
                End If
            Next
    
            Return result
        End Function

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ciao.
    Il problema è che il controllo cercato è o può essere, profondamente annidato dentro un controllo padre. Ecco perchè ci vuole, secondo me, una funzione ricorsiva (scritta bene, beninteso )

    Sto provando a cercare in rete e forse ho trovato qualcosa (in c#)
    Non ho ancora provato, ma penso che vada:
    codice:
    private RadioButton GetSelectedRadioButton(string groupName)
    {
        return GetSelectedRadioButton(Controls, groupName);
    }
    
    private RadioButton GetSelectedRadioButton(ControlCollection controls, string groupName)
    {
        RadioButton retval = null;
    
        if (controls != null)
        {
            foreach (Control control in controls)
            {
                if (control is RadioButton)
                {
                    RadioButton radioButton = (RadioButton) control;
    
                    if (radioButton.GroupName == groupName && radioButton.Checked)
                    {
                        retval = radioButton;
                        break;
                    }
                }
    
                if (retval == null)
                {
                    retval = GetSelectedRadioButton(control.Controls, groupName);
                }
            }
        }
    
        return retval;
    }
    ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.