简体   繁体   中英

Loop all textbox and collect values in c# asp.net

I'm trying to get a list of strings from the database.

For each string in the list i want to add a label & textbox to the page.

On button submit I want to collect the textbox value as well as the corresponding label value then save it to the database.

I need help retrieving the values from the textboxes.

What I have so far:

Panel1 is on the aspx page

    protected List<string> items = MyClass.GetItems();


    protected void Page_Load(object sender, EventArgs e)
    {
        GenerateItemsTable();
    }

    private void GenerateItemsTable()
    {
        Table table = new Table();
        table.ID = "Table1";
        //PlaceHolder1.Controls.Add(table);
        Panel1.Controls.Add(table);

        foreach (var x in items)
        {
            TableRow row = new TableRow();
            for (int y = 0; y < 1; y++)
            {
                TableCell labelCell = new TableCell();
                labelCell.Controls.Add(CreateLabel(x));
                labelCell.CssClass = "tdLabel";
                row.Cells.Add(labelCell);

                TableCell txbCell = new TableCell();
                txbCell.Controls.Add(CreateRadNumericTextBox(x));
                txbCell.Width = 30;
                row.Cells.Add(txbCell);

                TableCell dataTypeCell = new TableCell();
                dataTypeCell.Text = "<span style='font-size: 10px; color: #777'>(student count)</span>";
                dataTypeCell.Width = 100;
                row.Cells.Add(dataTypeCell);

                TableCell fourthCell = new TableCell();
                if (x == items[items.Count - 1])
                {
                    RadButton rb = new RadButton();
                    rb.ID = "submit";
                    rb.Text = "Submit Guidance";
                    rb.Skin = "Forest";
                    rb.Click += new EventHandler(submit_Click);
                    rb.AutoPostBack = true;
                    fourthCell.Controls.Add(rb);
                    row.Cells.Add(fourthCell);
                }
                else
                {
                    row.Cells.Add(fourthCell);
                }

            }
            table.Rows.Add(row);
        }
    }

    private RadNumericTextBox CreateRadNumericTextBox(string x)
    {
        RadNumericTextBox rntb = new RadNumericTextBox();
        rntb.ID = x;
        rntb.Width = 40;
        return rntb;
    }

    private Label CreateLabel(string x)
    {
        Label l = new Label();
        l.ID = "label_" + x;
        l.Text = "<label>" + x + "</label>";
        return l;
    }

    protected void submit_Click(object sender, EventArgs e)
    {
        foreach (Control x in FindControl("Panel1").FindControl("Table1").Controls)
        {
            if (x is RadNumericTextBox)
            {
                //how to get the data??????/
            }
        }
    }

(thanks to those that actually read the whole post)

-----------------updated solution--------------------------------------------

I decided to change it and store the list from the db at page_load. With the list stored i loop through the list and use FindControl() to access the textboxes. Something like this..

//a couple containers
protected class ItemVal
{
    public int Value { get; set; }
    public string Name { get; set; }
}
protected List<ItemVal> items = new List<ItemVal>(); 


//get the list from that database
protected void GetItems()
{
    foreach (var x in MyClass.GetItems())
    {
        ItemVal i = new ItemVal();
        i.Name = x;
        items.Add(i);
    }
}

//submit
protected void submit_Click(object sender, EventArgs e)
{
    foreach (var x in items)
    {
        RadNumericTextBox rntb = FindControl(x.Name) as RadNumericTextBox;
        x.Value = (int)rntb.Value;
    }
}

You need to cast x to a RadNumericTextBox and then pull out the property values you want, like this:

RadNumericTextBox theRadNumericTextBox = x as RadNumericTextBox;
string val = theRadNumericTextBox.Text;

Then for the other controls you want, you will need to put if conditions for their types, like this:

if (x is Label)
{
    Label theLabel = x as Label;
    string valLabel = theLabel.Text;
}

Here is the full code for the method:

protected void submit_Click(object sender, EventArgs e)
{
    foreach (Control x in FindControl("Panel1").FindControl("Table1").Controls)
    {
        Label theLabel;
        RadNumericTextBox theRadNumericTextBox;

        if (x is RadNumericTextBox)
        {
            RadNumericTextBox theRadNumericTextBox = x as RadNumericTextBox;
            string val = theRadNumericTextBox.Text;
        }

        if (x is Label)
        {
            Label theLabel = x as Label;
            string valLabel = theLabel.Text;
        }

        // Either store up in a list or save to the database on each loop; it is recommended to store a list and send all the changes at once for a database save, but that is your choice
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM