Contare il numero di Caselle di testo e Caselle di controllo in un form

La mia richiesta è di contare il numero totale di casella di testo Casella di controllo presente direttamente all’interno del modulo con il id="form1", quando l’utente fa clic sul Pulsante 'btnGetCount'. Ecco il codice che ho provato, ma non conta nulla e il contatore rimane a zero, anche se ho tre Caselle di testo e Caselle di controllo nella forma. Tuttavia, se si rimuove ciclo foreach e passare TextBox control = new TextBox(); invece del presente codice, poi si conta la prima casella di testo e countTB restituisce il valore uno.

protected void btnGetCount_Click(object sender, EventArgs e)
    {
        Control control = new Control();

        int countCB = 0;
        int countTB = 0;
        foreach (Control c in this.Controls)
        {
            if (control.GetType() == typeof(CheckBox))
            {
                countCB++;
            }
            else if (control is TextBox)
            {
                countTB++;
            }
        }

        Response.Write("No of TextBoxes: " + countTB);
        Response.Write("<br>");
        Response.Write("No of CheckBoxes: " + countCB);
    }
  • questo.Controlli? Che dire di form1.Controlli?
  • Sono dinamica di aggiungere controlli al form?
  • Avevo provato anche ma ha prodotto lo stesso risultato.
  • No, non sto aggiungendo i controlli in modo dinamico.
  • provare foreach (WebControl c in this.Controls)
  • Ho provato, ma si butta InvalidCastException.Dando un momento difficile..
  • questo è un probabile duplicato di stackoverflow.com/questions/4863051/loop-through-textboxes

InformationsquelleAutor RahulD | 2013-07-17

 

4 Replies
  1. 4

    È necessario in modo ricorsivo loop attraverso altri controlli.

        <form id="form1" runat="server">
        <div>
        <asp:TextBox ID="txt" runat="server"></asp:TextBox>
        <asp:CheckBox ID="cb" runat="server"></asp:CheckBox>
        </div>
        </form>
    
    protected void Page_Load(object sender, EventArgs e)
    {
        var controls = form1.Controls;
        var tbCount = 0;
        var cbCount = 0;
        CountControls(ref tbCount, controls, ref cbCount);
    
        Response.Write(tbCount);
        Response.Write(cbCount);
    }
    
    private static void CountControls(ref int tbCount, ControlCollection controls, ref int cbCount)
    {
        foreach (Control wc in controls)
        {
            if (wc is TextBox)
                tbCount++;
            else if (wc is CheckBox)
                cbCount++;
            else if(wc.Controls.Count > 0)
                CountControls(ref tbCount, wc.Controls, ref cbCount);
        }
    }
    • Grazie mille per la risposta. Mi sembra molto buona, andando a cercare questo.
    • Provato questo codice, che funziona bene per le Caselle di testo, ma aggiunge un ulteriore conteggio per la Casella di controllo. Io debug. +1 🙂
    • Ho capito che non era il conteggio radiobutton anche come caselle di controllo a causa dell’ereditarietà, così sostituendo ‘è’ con GetType() e typeOf() della logica, funziona benissimo.
  2. 3

    Permette ti dà zero dal momento che si sta contando il tipo di Controllo che non è disponibile a modificare il codice per :

    protected void btnGetCount_Click(object sender, EventArgs e)
        {
    
            int countCB = 0;
            int countTB = 0;
            foreach (Control c in this.Controls)
            {
                if (c.GetType() == typeof(CheckBox))
                {
                    countCB++;
                }
                else if (c.GetType()== typeof(TextBox))
                {
                    countTB++;
                }
            }
    
            Response.Write("No of TextBoxes: " + countTB);
            Response.Write("<br>");
            Response.Write("No of CheckBoxes: " + countCB);
        } 
    • Sì, ho provato a punto di questo nella mia risposta. Non so perché mi è stato downvoted. Provato l’OP del codice e riprodotto 0. Provato ed ho postato e ha funzionato bene.
    • pcnThird hai Fatto altre modifiche? Ancora mi dà lo stesso risultato. PS: io non downvote voi.
    • Bene in else if dichiarazione che ho usato la stessa condizione come da te postato, ma più che altro, è praticamente la stessa.
    • Grazie mille per la risposta ragazzi. Ho fatto un piccolo cambiamento nel vostro e Alyafey codice cioè form1.Controlli invece di questo.Controlli e funziona benissimo. Grazie di nuovo. PS: pcnThird hai cancellato la tua risposta, era per fare +1.
  3. 0

    Credo che devi essere ricorsiva, this.Controls restituirà solo i controlli che sono i suoi figli immediati. Se il TextBox è all’interno di un gruppo di controllo all’interno c’è bisogno di vedere i contenitori di controlli.

    Vedere la risposta a questa altre stackoverflow: Come ottenere TUTTI i controlli figlio di un Windows Form forma di un tipo specifico (Pulsante/Textbox)?

    MODIFICA:
    Mi rendo conto che la risposta è per WinForms, ma la soluzione è ancora valida.

    • Grazie per l’input. Sto vivendo.
  4. 0

    Solo facendo qualche piccola modifica nel codice suggerito da Alyafey, pcnThird e Valamas ho scritto questo codice che funziona.

    protected void btnGetCount_Click(object sender, EventArgs e)
        {
    
            int countCB = 0;
            int countTB = 0;
            foreach (Control c in form1.Controls) //here is the minor change
            {
                if (c.GetType() == typeof(CheckBox))
                {
                    countCB++;
                }
                else if (c.GetType()== typeof(TextBox))
                {
                    countTB++;
                }
            }
    
            Response.Write("No of TextBoxes: " + countTB);
            Response.Write("<br>");
            Response.Write("No of CheckBoxes: " + countCB);
        } 
    • Così che cosa è stato il risultato ? era il bisogno di cambiare ?
    • Invece di questo.I controlli che ho fatto in form1.Controlli.. 🙂
    • Ho fatto una modifica nel codice, non nella mia. Un errore era stato rimosso da voi già sostituendo il controllo con la ‘c’. È ora di contare il numero di Caselle di testo e Caselle di controllo perfettamente.

Lascia un commento