Ismail Gunes
Ismail Gunes

Reputation: 558

How to handle a group of textbox/label in an array

I have a serie of textboxes and labels form textbox 1-9 and label 1 to 9. With a click on a any label I clear the correspondant textbox.

I created a methode but it's like a baby toy comparison to my procedures in TP or VB. There must be a shortest well structered way. Any idea wiil be very much appreciated?

What I did :)))

    private void label1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "" ;
    }
    private void label2_Click(object sender, EventArgs e)
    {
        textBox2.Text = "" ;
    }
    private void label3_Click(object sender, EventArgs e)
    {
        textBox3.Text = "" ;
    }
    private void label4_Click(object sender, EventArgs e)
    {
        textBox4.Text = "" ;
    }
    private void label5_Click(object sender, EventArgs e)
    {
        textBox5.Text = "" ;
    }
    private void label6_Click(object sender, EventArgs e)
    {
        textBox6.Text = "" ;
    }
    private void label7_Click(object sender, EventArgs e)
    {
        textBox7.Text = "" ;
    }
    private void label8_Click(object sender, EventArgs e)
    {
        textBox8.Text = "" ;
    }
    private void label9_Click(object sender, EventArgs e)
    {
        textBox9.Text = "" ;
    }

Upvotes: 3

Views: 5765

Answers (8)

user4977952
user4977952

Reputation:

If you don't like to write code much, i have a program can write it fast. For example, if you input "lable1.Text = textbox1.Text;" and "15" the program will output into a textbox:

lable1.Text = textbox1.Text;
lable2.Text = textbox2.Text;
lable3.Text = textbox3.Text;
lable4.Text = textbox4.Text;
lable5.Text = textbox5.Text;
lable6.Text = textbox6.Text;
...
lable15.Text = textbox15.Text;

Go here to know more and download: Download Counter Replacer

Upvotes: 0

Ismail Gunes
Ismail Gunes

Reputation: 558

With two solutions of @sinatr I've created one other method because both are given an error message.

   private void label_Click (object sender , EventArgs e)
    {
        string id = (sender as Control).Tag.ToString();
        int newidx = Convert.ToInt32(id);
        _textBox[newidx].Clear();
    }

THIS WORKS!

Sure! I've added juste here this

 namespace  WindowsFormsApplication1
{
public partial class 
 DefBiscuit : Form
{
    public TextBox[] _textBox;

And

In form_load this

_textBox = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9 };

Upvotes: 0

Jens Kloster
Jens Kloster

Reputation: 11277

I would suggest you create a UserControl

  • Arrange a Lable and a TextBox
  • handle the label_click event

and uses that UserControl on your form instead.

something like this:

public class LableAndTextBox : UserControl
{
 public LableAndTextBox()
 {
   InitializeComponents();
 }

 public void label_Click(object sender, EventArgs e)
 {
   textBox.Text = string.Empty;
 }
}

Edit - make sure you create the userControl, in a seperate assembly - for compile reasons..

Upvotes: 0

Sinatr
Sinatr

Reputation: 21999

You can utilize Tag property to mark controls. Then you can iterate through them (preferably starting from most parent control - form and with the use of recursion! or, if you are sure, from the container, which holds the group of controls).

// assign tag "1" to "9" to labels and texboxes
// subscribe all labels to same event label_Click
private void label_Click(object sender, EventArgs e)
{
    string id = (sender as Control).Tag.ToString();
    // iterate or recurse
    FindTextboxWithId(id).Clear();
}
// it shouldn't be hard to write FindTextboxWithId

Other possibility is to create private arrays of controls, in the form constructor, just to ease referencing them.

public TextBox[] _textBox;

public Form1()
{
    InitializeComponent();
    _textBox = new TextBox[] {textBox1, texBox2, ..., textBox9};
}

// assign tag "0" to "8" to labels and texboxes
// subscribe all labels to same event label_Click
private void label_Click(object sender, EventArgs e)
{
    int index = int.Parse((sender as Label).Tag);
    _textBox[index].Clear();
}

Third possibility is to utilize containers, to example, TableLayoutPanel. You can create 2 column container where first column is Label's and second is TextBox'es. Then just fill 9 rows and have fun in OnClick (to find sender position, to find texbox position, to find textbox and to finally clear it).

Upvotes: 2

iTURTEV
iTURTEV

Reputation: 331

And a javascript solution:

 <asp:TextBox ID="txt1" runat="server"></asp:TextBox>
    <asp:Label ID="lbl1" runat="server" AssociatedControlID="txt1" onclick="clearTextBox(this)">Clear</asp:Label>

function clearTextBox(sender){
        var assocControlId = sender.htmlFor;
        var el = document.getElementById(assocControlId);
        if (el)
            el.value = '';
    }

Upvotes: 0

Kjartan
Kjartan

Reputation: 19111

Quick solution:

Rename your labels like: label_1, label_2, ... label_22, then you can use the following common event-handler for all clicks.

An improvement on this would be to just pass labelNr to a separate number, which would then use that to find the textbox by name, instead of using a swith to check all of them. I don't have time to try that now, but I'm sure you can figure it out somehow.. ;)

    private void label1_Click(object sender, EventArgs e)
    {
        var labelNr = ((Label) sender).Name.Split('_').Last();

        switch (labelNr)
        {
            case "1":
                textBox_1.Clear();
                break;
            case "22":
                textBox_22.Clear();
                break;
        }
    }

Update: Seems Tim Schmelter had the answer here. To steal a small detail from him: Use Controls.Find("textBox" + labelNr, true) as he shows above instead of the switch here, and you should be set.

Upvotes: 0

wam090
wam090

Reputation: 2873

To make your code less redundant, you can loop over the controls in your application:

Control Class, so when clicking on a label you will have to search for the textBox's Tag that you will set for each textBox.

foreach (Control C in this.Controls)
{
   //Code Here...

}

Upvotes: 0

Tim Schmelter
Tim Schmelter

Reputation: 460158

Perhaps one handler for all and using Controls.Find:

private void label_Click(object sender, EventArgs e)
{
    var label = (Label)sender;
    string lastDigits = new string(label.Name.SkipWhile(c => !Char.IsDigit(c)).ToArray());
    var textBox = Controls.Find("textBox" + lastDigits, true).FirstOrDefault() as TextBox;
    if(textBox != null)
        textBox.Text = "" ;
}

Although relying on those meaningless variable names is not best practise.

Upvotes: 0

Related Questions