Click here to Skip to main content
15,346,659 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi Experts,

My winform has various texboxes inside panels and outside the panels.
I want to set their properties like backcolor, enabled etc in a separate class.
but we are unable to do it.

I have also tried like this: "foreach(Control c in Controls)", but unable to access that control exits in panel.

Kindly suggest me the best.

--- Anil Kumar.

Thanks for prompt replies. In that scenario i have already implemented successful code for datagridview as below: -

code for the form having DataGridView:
ConnetDataBase conDB = new ConnetDataBase();
conDB.FillDataGrid(Sql, dgvUserList);

code for class: -
class ConnetDataBase

public void FillDataGrid( string Sql,DataGridView dgvName)
        adapter = new SqlDataAdapter(Sql, connection);
        DataSet ds = new DataSet();
         dgvName.DataSource = ds.Tables[0];
    catch (Exception ex)


This works fine for any datagridview calling from any forms.
But for textbox or other controls how can it may be implemented ?

--- Anil kumar
Updated 29-Apr-19 13:27pm

If you want to access the controls inside a panel you have to address the panel's controls collection.

So to get this working you'll have to check the controls type and if it's a panel you'll have to go over all the panels controls again.
This snippet might help you :

foreach (Control cntol in this.Controls)
    Type type = cntol.GetType();
    //if (type.Name == "Panel")
    if(cntol is Panel)
        foreach (Control panelControls in cntol.Controls)
            //Access the panel's controls here
        // Access the controls outside of the panels here
Rojeh 18-Apr-11 8:53am
My 5
Tarun.K.S 18-Apr-11 9:01am
Kim Togo 18-Apr-11 9:01am
My 5. But instead of
if (type.Name == "Panel")


if (cntrol is Panel)

type.Name is by default empty.
Tarun.K.S 18-Apr-11 9:34am
Thanks and sure I shall use this now. :)
BobJanova 18-Apr-11 10:05am
Controls other than panels can have sub-controls, though they usually don't. Why not just remove the if test entirely and traverse all subtrees? Most of them will have 0 element Controls arrays anyway.
Sergey Alexandrovich Kryukov 18-Apr-11 14:36pm
Tarun, you cover only two levels, but the recursive recursion costs no more and is universal.
Also, GetType is incorrect (and slow). It is incorrect because it is not polymorphous operation and will not cover sub-classes. You really need "as" dynamic cast and nothing else (not even "is" because it would entail unwanted extra case in next line).
(So, I did not vote, but the answer is not passing, so you have to do something about it...)

Please see my Solution.
Tarun.K.S 19-Apr-11 2:01am
Yes you are right SA, I should have used recursion here. Thanks for the pointers, I shall keep that in mind.
Thank you for understanding.
The background colour of many controls is inherited, if you don't set it explicitly.

In the general case, assuming you are wanting to set these control properties based on something in your business logic, it is better to use data binding than to write explicit property manipulation code, which can get very complex and hard to keep in sync surprisingly quickly. Create a presenter (or controller or model-view) class for the form, or perhaps more if it is pulling data from logically different locations, and data bind the properties of the controls to properties of that class.
Sergey Alexandrovich Kryukov 18-Apr-11 14:38pm
These are useful notes, my 5.
The setup function can be anything, not just color all in the same color (which would not require any traversing of the controls).
You did not fully answer the question though, but I did, please see.
BobJanova 18-Apr-11 16:19pm
You're absolutely correct, I did not fully answer the question as written, because that way lies madness ;) but I believe your answer is correct as it stands.
Sergey Alexandrovich Kryukov 18-Apr-11 16:45pm
Well, thank you, Bob.
I understand your approach; you did not have to answer in full; again, your information is useful.
You need to use recursion in this case:

static void SetupTextBox(TextBox textBox) {
   //text.Box.BackColor = ...
   //whatever setup you need
static void SetupTextBoxes(Control parent) {
   TextBox textBox = parent as TextBox;
   if (textBox != null)
   foreach(Control control in parent.Controls)


or, in the method of your form:

Sander Rossel 18-Apr-11 16:52pm
Very nice. Never looked at it like that. 5 from me.
Sergey Alexandrovich Kryukov 18-Apr-11 16:55pm
Thank you.
This is simple and very basic.
Sander Rossel 18-Apr-11 17:01pm
Simple thinking can be very hard sometimes! :laugh:
Sergey Alexandrovich Kryukov 18-Apr-11 17:25pm
Who would argue against that!
Thank you.
Espen Harlinn 18-Apr-11 17:42pm
A 5 :)
Sergey Alexandrovich Kryukov 18-Apr-11 22:14pm
Thank you :-)
Tarun.K.S 19-Apr-11 2:02am
Yep recursion! 5d.
Thank you, Tarun.
anil_kumar_bhakta 19-Apr-11 3:54am
Very nice!
Thank you very much, Anil.
I see some good answers here. So this answer is simply adding to what has already been said, which also works. Hoewever, with the previous code example if you will use a TabControl or GroupBox instead of a Panel your code will not work anymore. The following snippet, which makes use of a recursive method, should fix this. C# is not my main language, bear with me please ;)

private void button1_Click(object sender, EventArgs e)
            ColorControls(this); // A Form is also a Control.

        private void ColorControls(Control ctl)
        // Loop through the controls in a Control.
        foreach (Control c in ctl.Controls)
           if (c.Controls.Count > 0)
                // If the control contains multiple Controls (Container Controls))
                // then loop through those controls.
            // If there are no more controls then check if
            // this control is a TextBox (or any type you want).
                if (c is TextBox)
                    // Set background color.
                    c.BackColor = Color.Red;

Hope it helps.
ricmil42 18-Apr-11 14:16pm
Yup, works for any level of nested controls.
Sergey Alexandrovich Kryukov 18-Apr-11 14:41pm
A bit of redundant code here, my 4.
No need to check up Count, "is" is redundant: you really need to use "as" because it provides the check and the cast at the same time. You did not have cast at all, because you assume that the property is universal. But what to do is some property to be set up is TextBox-specific? So, your code is less universal without any gain.
Please see my Answer.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900