2011-01-14 15 views
0

本当にありがとうございます。これは私の問題です:asp.netで動的テーブルにデータを設定していますか?

私は製品オブジェクトのArrayListを持っています。各製品にはID、名前、サプライヤがあります。 私はarraylistを繰り返し、この値をセルに入れるテーブルを作成すると、製品に複数のサプライヤが存在するという問題が発生します。この場合、idとnameは同じですが、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; 
    } 

} 
+0

私はsql.Plsでグルーピングの原因を使用してサプライヤを選択できると思います – kbvishnu

+0

Harie - 私はデータベースにアクセスできませんので、コードで行うことができれば本当にいいと思います。それが不可能なら、私は原因がデータベースにアクセスする必要があります。 – Andy

答えて

0

あなたはここにハッシュテーブルを使用することができます。

 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

代わりのコードビハインドでテーブルを生成するGridViewを使用します。 ここでは、GridViewのItem Template内に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> 

とデータをバインドするためのコード、私はサンプルTestProductとTestSuppliersを使用しました

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

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

関連する問題