2011-01-14 9 views
0

Ich würde Ihre Hilfe sehr zu schätzen wissen. Das ist mein Problem:Populating dynamische Tabelle in asp.net?

Ich habe eine ArrayList von Produktobjekten. Jedes Produkt hat eine ID, einen Namen und einen Lieferanten. Wenn ich die Arraylist iteriere und eine Tabelle erstelle, um diesen Wert in Zellen zu setzen, komme ich zu dem Problem, dass ein Produkt mehr als einen Lieferanten haben kann. Wenn dies der Fall ist, sind die ID und der Name identisch, aber mit einem anderen Lieferanten in der Arraylist. Mein bisheriger Code kümmert sich darum, indem ich leere Zellen für ID und Name erstelle und den anderen Lieferanten in eine neue Zelle bringe.

Aber es sieht nicht gut aus, neue Zeilen für jeden Lieferanten zu erstellen. Ich möchte, dass wenn ein Produkt mehr als einen Lieferanten hat, ich alle Lieferanten in derselben Zelle in der Reihe für die Produkt-ID möchte.

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

} 
+0

Ich denke, Sie können Lieferanten durch eine Gruppierung Ursache in der sql.Pls versuchen mit diesem – kbvishnu

+0

Harie - ich habe keinen Zugriff auf die Datenbank mein Selbst, so dass ich wirklich nett wäre, wenn es in Code getan werden könnte. Wenn es unmöglich ist, muss ich natürlich Zugriff auf die Datenbank haben. – Andy

Antwort

0

Sie können hier eine Hashtable verwenden:

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

    } 
1

Anstatt eine Tabelle in der Erzeugung von Code-Behind verwenden ein Gridview. Ich habe hier ein Beispiel, das GridView und einen Repeater innerhalb der Artikelvorlage des GridView verwendet. Der Repeater spuckt für jeden Lieferanten eine unbegrenzte Liste aus.

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> 

Und Code, um die Daten zu binden (die Typdefinition sind unten)

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 Probe Testprodukt und TestSuppliers verwendet haben,

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

Probe Ausgabe: alt text