开发者

Populating dynamic table in asp.net?

I would really appreciate your help on this. This is my problem:

I have a ArrayList of product objects. Each product has a id, name and a supplier. When I iterate the arraylist and creates a table to put this value into cells I come to the problem that a product can have more than one supplier. If this is the case the id and name are the same but with a different supplier in the arraylist. My code so far takes care of this by creating empty cells for id and name and put the other supplier in a new cell.

But, it doesn't look good to create new rows for every supplier. What I want is that if a product has more than one supplier I want all the suppliers in the same cell on the row for the product id.

string id = string.Empty;
int count = 0;
public void CreateResultTable(ArrayList result)
{
    TableRow row;
    TableCell cell;

    if (result != null && result.Count > 0)
    {
        foreach (Item item in result)
        {

       开发者_开发知识库     if (count == 0)
            {
                row = new TableRow();
                id = item.id;

                cell = new TableCell();
                cell.Text = item.id;
                row.Cells.Add(cell);

                cell = new TableCell();
                cell.Text = item.product;
                row.Cells.Add(cell);

                cell = new TableCell();

                ArrayList levList = item.suppliers;
                if (levList != null)
                {

                    string lev = string.Empty;
                    for (int i = 0; i < levList.Count; i++)
                    {
                        lev += levList[i];
                    }
                    cell.Text = lev;
                    row.Cells.Add(cell);

                }
                else
                    cell.Text = string.Empty;
                    row.Cells.Add(cell);

                count++;
            }
            else if (id != item.id)
            {

                row = new TableRow();
                id = item.id;

                cell = new TableCell();
                cell.Text = item.id;
                row.Cells.Add(cell);

                cell = new TableCell();
                cell.Text = item.product;
                row.Cells.Add(cell);

                cell = new TableCell();

                ArrayList levList = item.suppliers;
                if (levList != null)
                {

                    string lev = string.Empty;
                    for (int i = 0; i < levList.Count; i++)
                    {
                        lev += levList[i];
                    }
                    cell.Text = lev;

                }
                else
                    cell.Text = string.Empty;
                row.Cells.Add(cell);


            }
            else
            {
                row = new TableRow();
                cell = new TableCell();
                cell.Text = string.Empty;
                row.Cells.Add(cell);

                cell = new TableCell();
                cell.Text = string.Empty;
                row.Cells.Add(cell);

                cell = new TableCell();
                ArrayList levList = item.suppliers;
                if (levList != null)
                {
                    string lev = string.Empty;
                    for (int i = 0; i < levList.Count; i++)
                    {
                        lev += levList[i];
                    }
                    cell.Text = lev;
                    row.Cells.Add(cell);
                }
                else
                    cell.Text = string.Empty;
                row.Cells.Add(cell);
            }

            SearchResultLev.Rows.Add(row);



        }


        SearchResultLev.Visible = true;
        SearchResult.Visible = false;
        NoSearchResult.Visible = false;
    }

    else
    {
        SearchResultLev.Visible = false;
        SearchResult.Visible = false;
        NoSearchResult.Visible = true;
    }

}


Instead of generating a table in code-behind use a GridView. I've a sample here which uses GridView and a Repeater inside the GridView's Item Template. The repeater spits out a unbounded list for each supplier.

Markup:

<asp:GridView ID='GridView1' runat='server' AutoGenerateColumns='false'>
      <Columns>
            <asp:BoundField HeaderText='Product ID' DataField='ID' />
            <asp:BoundField HeaderText='Name' DataField='Name' />
            <asp:TemplateField HeaderText='Suppliers'>
                <ItemTemplate>                    
                    <asp:Repeater DataSource='<%# Bind("Suppliers") %>' runat="server"   ID='Repeater1'>
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <li><%# Eval("Name") %></li>
                        </ItemTemplate>
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                    </asp:Repeater>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
</asp:GridView>

And code to bind the data (the type definition are below)

GridView1.DataSource = new List<TestProduct> 
        {
            new TestProduct
            {
                Name = "Test",
                ID = "1",
                Suppliers = new List<TestSupplier>
                {
                    new TestSupplier {  Name="Supplier1" },
                    new TestSupplier { Name = "Supplier2" },
                    new TestSupplier { Name =" A very long supplier name"}
                }
            }
        };

        GridView1.DataBind();

I've used sample TestProduct and TestSuppliers,

public class TestProduct
    {
        public String ID { get; set; }
        public String Name { get; set; }
        public List<TestSupplier> Suppliers { get; set; }
    }

public class TestSupplier { public String Name { get; set; }}

sample output:

Populating dynamic table in asp.net?


You can use a Hashtable here:

        Hashtable htProductCell = new Hashtable();
        if (!htProductCell.Contains(item.product))
        {
            //add a new row for the item
            htProductCell.Add(item.product, cell);
        }
        else
        {
            TableCell cell = (TableCell)htProductCell[item.product];
            ArrayList levList = item.suppliers; 
            if (levList != null) 
            { 
              string lev = string.Empty; 
              for (int i = 0; i < levList.Count; i++) 
              { 
                lev += levList[i]; 
              } 
              cell.Text += lev; 
              row.Cells.Add(cell); 
            }  

     }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜