在asp.net中填充动态表?

时间:2011-01-14 09:29:25

标签: c# asp.net dynamic

我真的很感谢你对此的帮助。这是我的问题:

我有一个产品对象的ArrayList。每个产品都有ID,名称和供应商。 当我迭代arraylist并创建一个表来将这个值放入单元格时,我遇到的问题是产品可以有多个供应商。如果是这种情况,则id和名称相同但在arraylist中具有不同的供应商。 到目前为止,我的代码通过为id和name创建空单元格并将其他供应商放入新单元格来解决此问题。

但是,为每个供应商创建新行并不好看。我想要的是,如果一个产品有多个供应商,我希望产品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;
    }

}

2 个答案:

答案 0 :(得分:1)

不使用代码隐藏生成表,而是使用GridView。 我在这里有一个示例,它在GridView的项模板中使用GridView和Repeater。 转发器为每个供应商提供无限列表。

标记:

<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>

绑定数据的代码(类型定义如下)

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();

我使用了样本TestProduct和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; }}

示例输出: alt text

答案 1 :(得分:0)

您可以在此处使用Hashtable:

        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); 
            }  

     }