Solved

create buttons dynamically asp.net c#

Posted on 2014-07-31
6
490 Views
Last Modified: 2014-08-03
List of items from a stored procedure sp1 with one parameter @Region (linked to Session["RegionID"]):

PK   Title      Region
1       A           1
2       B            1
.
.


returns list of PKs and Titles.

In a <td> tag, I hope to create number of buttons dynamically (one per title) with title as button caption (the returned list has 3 to 15 titles in it depending on the region value).

Question: Would you please give me something to get started with this?

Thank you.
0
Comment
Question by:Mike Eghtebas
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 23

Accepted Solution

by:
Jens Fiederer earned 350 total points
ID: 40233248
Let's say you have your captions in a variable q.

In the <td> you have an asp:Panel named container.

 foreach (var name in q)
            {
                Button b = new Button { Text = name };
                container.Controls.Add(b);
            }

Open in new window


You might want to set the buttons' Click events to do something useful as well.
0
 
LVL 34

Author Comment

by:Mike Eghtebas
ID: 40233592
Hi Jens,

Good direction resulting in good progress. As shown on the attached image, the buttons do not sit inside the panel.

Q1: How can I make the buttons to be inside the panel in two columns and as many rows necessary.
Q2: Could you please take a look at my code and improve its syntax. I am sure this could be done much cleaner.

It is desirable the buttons to be 90px wide x 40px high.

Shortly, I will add a question requesting some help in adding OnClick event(s) for the buttons.

We could have only one event for all of the buttons if we could somehow transmit PK field of the captions to the event. The PK is 2-digit first column on the image.

Thank you,

Mike
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

public partial class medCtrList : System.Web.UI.Page
{

    static Panel myPanel2 = new Panel();

    protected void Page_Load(object sender, EventArgs e)
    {
        Session["Region"] = "Region 1";
         Panel  myPanel = (Panel)this.FindControl("Panel1");
         myPanel2 = myPanel;
        ReadButtons();
    }

    static void ReadButtons()
    {
        using (SqlConnection connection = new SqlConnection("Data Source=USER-PC;Initial Catalog=ROD_July18;Integrated Security=True"))
        {
            // Create the command and set its properties.
            SqlCommand command = new SqlCommand();
            command.Connection = connection;
            command.CommandText = "SELECT t0... Sort DESC";
            command.CommandType = CommandType.Text;

            connection.Open();
            SqlDataReader reader = command.ExecuteReader();

           
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    string btnCaption = "";
                    btnCaption = reader.GetString(1);
                    makeButtonFor(btnCaption);
                }
            }
            else
            {
                // so something else
            }
     
            reader.Close();
        }
    }
    static void makeButtonFor(string caption)
    {
        Button b = new Button { Text = caption };
        myPanel2.Controls.Add(b);
    }
}

Open in new window

panel1.png
0
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 150 total points
ID: 40233642
You will need to use styling on the container to control the width and force to wrap into two columns. If you want the ID associated with the control then you will need to embed it in the controls ID somewhere, as buttons don't have properties for storing additional information;

Say you had markup like:
    <style>
        div { width: 200px; }
        input[type="submit"] { width: 90px; height: 40px; }
    </style>

    <div id="container" runat="server">

    </div>

Open in new window

Then the code could be:
...
while (reader.Read())
{
     int id = reader.GetInt32(0);
     string btnCaption = reader.GetString(1);
     makeButtonFor(id, btnCaption);
}
...

private void makeButtonFor(int id, string caption)
{
        Button b = new Button 
        { 
             ID = "Button"+id.ToString(),
             Text = caption 
        };
        container.Controls.Add(b);
}

Open in new window

0
Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

 
LVL 23

Expert Comment

by:Jens Fiederer
ID: 40234477
I would have to see the markup rather than just the code-behind to see why you are adding buttons to the wrong panel.

You don't HAVE to use a single panel, although that is the quickest way to program it....you can force columns using CSS as above, or you could construct a table and add the buttons to specific cells in that table if you prefer....or you could bind to a Repeater.

There are really lots of possibilities, and you can always check the "sender" in your event handler to see which button was pressed.

With the code page being
                <asp:Label runat="server" ID="result" />
                <Table>
                <asp:Repeater runat="server" ID="rpt">
                    <ItemTemplate>
                        <tr>
                            <td>
                                <asp:Button  runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>' OnClick="Unnamed_Click" />

                            </td>
                            <td>
                                <asp:Button runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Text2") %>' OnClick="Unnamed_Click" />
                            </td>
                        </tr>
                    </ItemTemplate>
                </asp:Repeater>

                </Table>

Open in new window


code behind like the below will set the label to the text of whichever button you pressed (assuming "all" is a list of titles):
            var list = new List<object>();
            foreach (var i in all)
            {
                list.Add(new { Text = i, Text2 = i + "foo" });
            }

            rpt.DataSource = list;
            rpt.DataBind();

Open in new window

0
 
LVL 23

Expert Comment

by:Jens Fiederer
ID: 40234481
Of course, this allows the REPEATER to construct the table ... there is nothing to stop you from creating an asp:Table in code behind and adding rows and cells and buttons to suit exactly what you want.

If you prefer to use CSS for the layout (which, if the reason for columns is visual rather than functional, is good style) and can assume HTML5 you could also use the new flexbox feature.
0
 
LVL 34

Author Closing Comment

by:Mike Eghtebas
ID: 40238296
Thank you very much.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
This article shows how to deploy dynamic backgrounds to computers depending on the aspect ratio of display
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question