Search code examples
asp.nethtml-tablecode-behindhtmlcontrols

Build a table (with rows & columns) in code-behind (ASPX page)


Within codebehind in an ASPX page I get few details about the employees (read from external data source). Finally I would like to show in the below fashion. The display of below may be showin incorrect but is a simplpe table with header/column approach.

___________________________________________________________________________________
|                        DEPT        | HR                                          | |__________________________________________________________________________________|
|     Employee Image                 | Emp Name       | Hire Date                  |
|____________________________________|_____________________________________________|
|        Steve.gif                   | Steve Jobs     |  22/05/1979                |
|____________________________________|_____________________________________________|
|        Mark.gif                    | Mark Miller    |  22/05/1949                |
|____________________________________|_____________________________________________|
|                        DEPT        | Operations                                  | |__________________________________________________________________________________|
|     Employee Image                 | Emp Name       | Hire Date                  |
|____________________________________|_____________________________________________|

The data is collected from various data sources and is finally available within the codebehind. I want to display in the above fashion.

What is the best approach? I thought of creating a htmldivcontrol and adding all these values. Finally I will bind div tag to the page.

Currently I am trying with approach but want to know if there are any better approaches.

Please share your views and exaamples. _


Solution

  • The best approach in my opinion, would be to use a Repeater like this:

    <asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_RowDataBound">
            <ItemTemplate>
                <table runat="server" style="color: White; background-color: #3A4F63;" visible="false"
                    id="headerTable">
                    <tr>
                        <td colspan="3" align="center">
                            <asp:Label ID="headerTitle" runat="server"></asp:Label>
                        </td>
                    </tr>
                    <tr>
                        <td style="width: 200px; background-color: #3A4F63; color: White;">
                            Image 
                        </td>
                        <td style="width: 200px;">
                            Name
                        </td>
                        <td style="width: 200px;">
                            Hire Date
                        </td>
                    </tr>
                </table>
                <!-- These are the actual data items -->
                <!-- Bind to your specific properties i.e. Employees. -->
                <table>
                    <tr>
                        <td style="width: 200px;">
                            <asp:Image ID="img" runat="server" ImageUrl='<%#Eval("ImageUrl") %>'></asp:Image>
                        </td>
                        <td style="width: 200px;">
                            <asp:Label ID="lblName" runat="server" Text='<%#Eval("Name") %>'></asp:Label>
                        </td>
                        <td style="width: 200px;">
                            <asp:Label ID="lblHireDate" runat="server" Text='<%#Eval("HireDate") %>'></asp:Label>
                        </td>
                    </tr>
                </table>
            </ItemTemplate>
        </asp:Repeater>
    

    And then on your code behind, something like:

    private string currentDepartment =string.Empty;
    
    protected void rpt_RowDataBound(object sender, RepeaterItemEventArgs e)
    {
    
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
            //Binding to Employee object.
            if (currentDepartment!= (e.Item.DataItem as Employee).Department) {
            currentDepartment = (e.Item.DataItem as Employee).Department;
                e.Item.FindControl("headerTable").Visible = true;
                (e.Item.FindControl("headerTitle") as Label).Text = (e.Item.DataItem as Employee).Department;
            }
                else {
                e.Item.FindControl("headerTable").Visible = false;
            }
        }
    }
    

    You would need to bind your grid to a List<Employee> where Employee would be defined like so:

    public class Employee
    {
       public string Department {get;set;}
       public string ImageUrl {get;set;}
       public DateTime HireDate {get;set;}
       public string Name {get;set;}
    }
    

    But they must be ordered by Department previously to being bound.

    Sample code to Populate the repeater

    private void bindGridView()
    {
        List<Employee> emps = new List<Employee>();
        for (int i = 0; i < 5; i++)
        {
            Employee e = new Employee();
            if (i % 2 == 0)
            {
                e.Department = "Human resources";
                e.HireDate = DateTime.Now.AddDays(-i);
                e.ImageUrl = @"http://www.freedigitalphotos.net/images/gal_images/av-_146.jpg";
            }
            else
            {
                e.Department = "Information Technology";
                e.HireDate=DateTime.Now.AddMonths(-i);
                e.ImageUrl = "http://www.freedigitalphotos.net/images/gal_images/av-_314.jpg";
    
            }
    
            e.Name = "Employee " + i;
            emps.Add(e);
    
        }
        rpt.DataSource = emps.OrderBy(x=>x.Department);
        rpt.DataBind();
    }
    

    Produces

    enter image description here