[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 11013
  • Last Modified:

FindControl in Windows Form

Hi!

I have a Windows Form and I need to find a control in the form but I can't find out how to do it in a Windows Form!
I tried this:

((TextBox)this.FindControl(Form1.ActiveForm,"cn")).Text = "my text";

            private Control FindControl(Control Parent,string Target)
            {
                  Control FoundIt = null;
                  int i=0;
                  do
                  {
                        if(Parent.Controls[i].Name == Target)
                        {
                              FoundIt = Parent.Controls[i];
                        }
                        else
                        {
                              if(Parent.Controls[i].Controls.Count > 0)
                                    FoundIt = FindControl(Parent.Controls[i], Target);
                              i++;
                        }
                  }
                  while(FoundIt!=null || i>Parent.Controls.Count);
                  return FoundIt;
            }

But it don't work, it says tat the refrence of the object is not set to a instance of an object (or something like that)
0
aleborg
Asked:
aleborg
  • 4
  • 2
  • 2
  • +2
1 Solution
 
AlexFMCommented:
Can you describe what are you trying to do? I see that you use recursion, why? Recursive function must always have stop condition, and FindControl doesn't have it.
0
 
Fahad MukhtarDistinguished EngineerCommented:
Control myControl = new Control ();
foreach (Control c in this.Controls)
if (c.Name == "textBox1")
      {
      myControl = c;                              
      MessageBox.Show(myControl .Name );
      }
0
 
ThaloxCommented:

I think your quit-condition is not right.

try this
while(FoundIt == null && i<Parent.Controls.Count);

to stop, if found, or no more controls...

this should work,

Thalox
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
ThaloxCommented:
...
and I would use a while-loop, not do-while, because there could be controls, with no childs
0
 
aleborgAuthor Commented:
What I'm trying to do in this code is to find a textbox with a special name.
I have some "rows" in my form, each row has a drobpdownlist and some textbox, each control in a row is named txtArt1, txtText1, txtPris1
the number, 1 is the number of the row and txtArt is the DropdownList.
All dropdownlists are connected to private void txtArt1_SelectedIndexChanged(object sender, System.EventArgs e) on selectedindexchanged.

And txtArt1_SelectedIndexChanged looks like this:
            private void txtArt1_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                  ComboBox dd = ((ComboBox)sender);
                  string cn = dd.Name.Replace("txtArt","");
                  
                  FakturaDLL.Products pr = new FakturaDLL.Products();
                  if(pr.GetProduct(dd.Text))
                  {
                        ((TextBox)this.FindControl(this.ParentForm,"txtText"+cn)).Text = pr.ProdText.ToString();
                        //txtPris1.Text = pr.ProdPrice.ToString(); - do the same thing with txtPris
                  }
                  else
                        MessageBox.Show("Produkten kunde inte hittas!");
            }

So what I'm trying to do is, that when txtArt is changed, the textboxes on the same row chould be updated.
0
 
aleborgAuthor Commented:
Tried this:
      ((TextBox)this.FindControl("txtText"+cn, this.Controls)).Text = pr.ProdText.ToString();

            private Control FindControl(string Target,Control.ControlCollection cont)
            {
                  Control myControl = new Control ();
                  foreach (Control c in cont)
                  {
                        if (c.Name == Target)
                        {
                              myControl = c;                        
                        }
                        else
                        {
                              if(c.Controls.Count >0)
                                    myControl=FindControl(Target,c.Controls);
                        }
                  }
                  return myControl;
            }

But it don't work, te reason that I wan't recursion is that all controls are placed in a tabcontrol so I need to check all controls and controls in the controls in the form.
If I have all controls in the form and not in a tabcontrol and use this private Control FindControl(string Target) and don't have recursion it works!
What am I doing wrong?
0
 
Fahad MukhtarDistinguished EngineerCommented:

simply put the my code in a function which accepts a stting and returns a control.. call this function first time using:

FindControl(textBox2.Text, this);

and heres the FindControl
private void FindControl(string text, Control Parent)
{
                  
      Control myControl = new Control ();
      foreach(Control c in Parent.Controls)
      {
            if (c.Name == text)
            {
                  myControl = c;                              
                  MessageBox.Show(myControl.Name );
            }
            if (c.Controls.Count >0)
                  FindControl(text,c); // recursive call
                        
            }                  
}
0
 
aleborgAuthor Commented:
That's What I've done but it complains and says that the conversion isn't valid on this line:
((TextBox)this.FindControl("txtText"+cn, this)).Text = pr.ProdText.ToString();

My code:
            private void txtArt1_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                  ComboBox dd = ((ComboBox)sender);
                  string cn = dd.Name.Replace("txtArt","");
                  
                  FakturaDLL.Products pr = new FakturaDLL.Products();
                  if(pr.GetProduct(dd.Text))
                  {
                        ((TextBox)FindControl("txtText"+cn, this)).Text = pr.ProdText.ToString();
                        ((TextBox)FindControl("txtPris"+cn, this)).Text = pr.ProdPrice.ToString();
                  }
                  else
                        MessageBox.Show("Produkten kunde inte hittas!");
            }
            
            private Control FindControl(string Target,Control Parent)
            {

                  Control myControl = new Control ();
                  foreach (Control c in Parent.Controls)
                  {
                        if (c.Name == Target)
                        {
                              myControl = c;
                        }
                        else
                        {
                              if(c.Controls.Count >0)
                                    myControl = FindControl(Target,c);
                        }
                  }
                  return myControl;    
            }
if i do this in FindControl:
if (c.Name == Target)
{
      myControl = c;
      MessageBox.Show(c.Name);
}
Then I can see that the right name is returned so nothing seems to be wrong with the function
0
 
aleborgAuthor Commented:
Solved it:
         private Control FindControl(string Target,Control Parent)
          {

               Control myControl = new Control ();
               foreach (Control c in Parent.Controls)
               {
                    if (c.Name == Target)
                    {
                         myControl = c;
                         break;
                    }
                    else
                    {
                         if(c.Controls.Count >0)
                              myControl = FindControl(Target,c);
                    }
               }
               return myControl;    
          }
0
 
starlite551Commented:
private Control FindControl(string controlName,Control Parent)
{
               Control ct = new Control();
               bool flag = false;
               
               foreach(Control c in Parent.Controls)
               {
                         if(c.Name == controlName)
                         {
                                    ct = c;  
                                    falg = true;
                         }    
               }

               if(flag == true)
               {
                       retrun ct;
               }
               return null;  
}
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 4
  • 2
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now