0

I have to add a selection of data from the database to a table dynamically. To do so I have created a table that has rows added to it in a loop. However it only really adds the final row. I assume it's something to do with the naming? Below is the code I'm using. It returns the table, formatted correctly with the header, but only one row of data...

protected Table listVolunteers()
{
    // Query to get volunteer information
    string query = "SELECT gvo_id, gvo_name, gvo_email, gvo_mobile_ph, gvo_dob, gvo_status FROM volunteer";

    // Table will hold the following information on volunteers:
    // ID, Name, Email, Mobile, DOB, Status
    // As well as a check box to do mass delete, a view button and an edit button on each
    Table result = new Table();
    result.ID = "volunteers";
    result.CssClass = "list";
    result.CellSpacing = 0;

    // Creater table header
    TableHeaderRow header = new TableHeaderRow();
    header.CssClass = "header";
    TableHeaderCell id = new TableHeaderCell();
    id.CssClass = "id";
    id.Width = 10;
    id.Text = "ID";
    header.Cells.Add(id);
    TableHeaderCell name = new TableHeaderCell();
    name.CssClass = "name";
    name.Text = "NAME";
    header.Cells.Add(name);
    TableHeaderCell email = new TableHeaderCell();
    email.CssClass = "email";
    email.Text = "EMAIL";
    header.Cells.Add(email);
    TableHeaderCell mobile = new TableHeaderCell();
    mobile.CssClass = "mobile";
    mobile.Width = 70;
    mobile.Text = "MOBILE #";
    header.Cells.Add(mobile);
    TableHeaderCell dob = new TableHeaderCell();
    dob.CssClass = "dob";
    dob.Width = 50;
    dob.Text = "D.O.B";
    header.Cells.Add(dob);
    TableHeaderCell status = new TableHeaderCell();
    status.CssClass = "status";
    status.Width = 50;
    status.Text = "STAT";
    header.Cells.Add(status);
    TableHeaderCell check = new TableHeaderCell();
    check.CssClass = "check";
    check.Width = 13;
    header.Cells.Add(check);
    TableHeaderCell view = new TableHeaderCell();
    view.CssClass = "button";
    view.Width = 50;
    header.Cells.Add(view);
    TableHeaderCell edit = new TableHeaderCell();
    edit.CssClass = "button";
    edit.Width = 50;
    header.Cells.Add(edit);
    // Add header to table
    result.Rows.Add(header);

    //Declaration for following code

    TableCell rid = new TableCell();
    rid.CssClass = "id";
    TableCell rname = new TableCell();
    rname.CssClass = "name";
    TableCell remail = new TableCell();
    remail.CssClass = "email";
    TableCell rmobile = new TableCell();
    rmobile.CssClass = "mobile";
    TableCell rdob = new TableCell();
    rdob.CssClass = "dob";
    TableCell rstatus = new TableCell();
    rstatus.CssClass = "status";
    TableCell rcheck = new TableCell();
    rcheck.CssClass = "check";
    TableCell rview = new TableCell();
    rview.CssClass = "button";
    TableCell redit = new TableCell();
    redit.CssClass = "button";
    CheckBox chk = new CheckBox();
    chk.Checked = false;
    Button btnView = new Button();
    btnView.Text = "View";
    Button btnEdit = new Button();
    btnEdit.Text = "Edit";

    string rowClass = "odd";
    Vector<TableRow> rows = new Vector<TableRow>();
    // Add volunteers to table
    try
    {
        using (conn)
        {
            conn.Open();
            cmd = new OleDbCommand(query, conn);
            rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                DateTime temp = new DateTime();

                rid.Text = rdr.GetValue(0).ToString();
                rname.Text = rdr.GetValue(1).ToString();
                remail.Text = rdr.GetValue(2).ToString();
                rmobile.Text = rdr.GetValue(3).ToString();
                DateTime.TryParse(rdr.GetValue(4).ToString(), out temp);
                rdob.Text = temp.ToString("dd/MM/yy");
                rstatus.Text = rdr.GetValue(5).ToString();

                chk.ID = rid.Text;
                btnView.PostBackUrl = string.Format("/VolunteerView.aspx?ID={0}", rid.Text);
                btnEdit.PostBackUrl = string.Format("/VolunteerEdit.aspx?ID={0}", rid.Text);

                rcheck.Controls.Add(chk);
                rview.Controls.Add(btnView);
                redit.Controls.Add(btnEdit);

                TableRow row = new TableRow();
                if (rowClass == "even")
                    rowClass = "odd";
                else
                    rowClass = "even";

                row.CssClass = rowClass;

                // Add cells to row
                row.Cells.Add(rid);
                row.Cells.Add(rname);
                row.Cells.Add(remail);
                row.Cells.Add(rmobile);
                row.Cells.Add(rdob);
                row.Cells.Add(rstatus);
                row.Cells.Add(rcheck);
                row.Cells.Add(rview);
                row.Cells.Add(redit);



                // Add row to table
                rows.Add(row);
            }

            TableRow[] array = new TableRow[rows.Count];

            for (int i = 0; i < rows.Count; i++)
            {
                array[i] = rows[i];
            }

            result.Rows.AddRange(array);
        }
    }
    catch (Exception e)
    {
        TableCell error = new TableCell();
        TableRow row = new TableRow();
        error.ColumnSpan = 9;
        error.CssClass = "error";
        error.Text = "An error occurred while loading the volunteers";
        row.Cells.Add(error);
        result.Rows.Add(row);
    }
    finally
    {
        if (rdr != null)
            rdr.Close();
    }
    if (conn != null)
        conn.Close();

    return result;
}

2 Answers 2

1

Try using the ImportRow method()

result.ImportRow(row);

You can replace where you are doing the following :

// Add row to table
rows.Add(row);

And use the ImportRow method. That's all there is to it, you should not need further code.

Sign up to request clarification or add additional context in comments.

2 Comments

There is no ImportRow method for the Table class, you're thinking of the DataTable class.
Ah sorry about that thought you were using the DataTable class. However, I think that if you use the DataList, or DataGridView, design the table in HTML, and then bind the records you would like by adding custom records in a custom built datatable at run time, it would be a better approach.
0

Okay so I solved the problem thanks to this post.

Pretty much all I had to do was ensure I was creating a new row / cell in the loop. To show you what I mean, the following shows my now functioning loop.

while (rdr.Read())
{
    DateTime temp = new DateTime();

    // This is the code that was added in.
    rid = new TableCell();
    rname = new TableCell();
    remail = new TableCell();
    rmobile = new TableCell();
    rdob = new TableCell();
    rstatus = new TableCell();
    rcheck = new TableCell();
    rview = new TableCell();
    redit = new TableCell();
    chk = new CheckBox();
    btnView = new Button();
    btnEdit = new Button();
    // Because I was creating new controls I also had to move my css classes to the loop as well
    rid.CssClass = "id";
    rname.CssClass = "name";
    remail.CssClass = "email";
    rmobile.CssClass = "mobile";
    rdob.CssClass = "dob";
    rstatus.CssClass = "status";
    rcheck.CssClass = "check";
    rview.CssClass = "button";
    redit.CssClass = "button";
    chk.Checked = false;
    btnView.Text = "View";
    btnEdit.Text = "Edit";

    rid.Text = rdr.GetValue(0).ToString();
    rname.Text = rdr.GetValue(1).ToString();
    remail.Text = rdr.GetValue(2).ToString();
    rmobile.Text = rdr.GetValue(3).ToString();
    DateTime.TryParse(rdr.GetValue(4).ToString(), out temp);
    rdob.Text = temp.ToString("dd/MM/yy");
    rstatus.Text = rdr.GetValue(5).ToString();

    chk.ID = rid.Text;
    btnView.PostBackUrl = string.Format("/VolunteerView.aspx?ID={0}", rid.Text);
    btnEdit.PostBackUrl = string.Format("/VolunteerEdit.aspx?ID={0}", rid.Text);

    rcheck.Controls.Add(chk);
    rview.Controls.Add(btnView);
    redit.Controls.Add(btnEdit);

    row = new TableRow();
    if (rowClass == "even")
        rowClass = "odd";
    else
        rowClass = "even";

    row.CssClass = rowClass;

    // Add cells to row
    row.Cells.Add(rid);
    row.Cells.Add(rname);
    row.Cells.Add(remail);
    row.Cells.Add(rmobile);
    row.Cells.Add(rdob);
    row.Cells.Add(rstatus);
    row.Cells.Add(rcheck);
    row.Cells.Add(rview);
    row.Cells.Add(redit);



    // Add row to table
    result.Rows.Add(row);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.