1

Accessデータソースからネストされたリピーターを使用して階層化リストを生成しようとしています。各アイテムには一意のIDがありますが、エリアごとに分類されています。

リストを次のようにしたいと思います。

  • エリア1
    • item1
    • item2
  • エリア2
    • item3
    • item4
  • など..。

試してみてください。Areaグループ要素が繰り返され続け、次のようになります。

  • エリア1
    • item1
  • エリア1
    • item2
  • エリア2
    • item3
  • エリア2
    • item4
  • など..。

私のマークアップは以下に掲載されています。

      <asp:Repeater ID="CategoryRepeater" runat="server" OnItemDataBound="CategoryRepeater_bound" EnableViewState="false">
            <HeaderTemplate>
                <ul>
            </HeaderTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
            <ItemTemplate>
                <li>
                    <%#((DataRowView)Container.DataItem)["Area"]%>
                </li>
                    <asp:Repeater ID="childRepeater" runat="server">
                        <HeaderTemplate>
                            <ul>
                        </HeaderTemplate>
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                        <ItemTemplate>
                            <li>
                                <%#((DataRowView)Container.DataItem)["ItemID"]%>
                            </li>                     
                        </ItemTemplate>
                    </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>




protected void Page_Load(object sender, EventArgs e)
{
    string cn = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=|DataDirectory|Source.mdb";

using (OleDbConnection conn = new OleDbConnection(cn))
  {

    OleDbCommand cmd = new OleDbCommand("Select ItemID, Area FROM [Location]", conn);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);


    DataSet ds = new DataSet();
    da.Fill(ds, "Table1");
    cmd.CommandText = "SELECT Area, ItemID, Drawing FROM [Location]";
    da.SelectCommand = cmd;
    da.Fill(ds, "Table2");
    ds.Relations.Add(new DataRelation("drTable", ds.Tables["Table1"].Columns["ItemID"], ds.Tables["Table2"].Columns["ItemID"]));
    CategoryRepeater.DataSource = ds.Tables["Table1"];
    CategoryRepeater.DataBind();
  }
}



protected void CategoryRepeater_bound(object source, RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
    {
        DataRowView drv = (DataRowView)e.Item.DataItem;

        Repeater rep = (Repeater)item.FindControl("childRepeater");
        rep.DataSource = drv.CreateChildView("drTable");
        rep.DataBind(); 

     }

}
4

2 に答える 2

2

子リピーターをタグの内側に配置する必要があり<li></li>ます。現時点では、タグの外側にあるため、HTMLレイアウトに大きな問題が発生します。また、ロジック全体が正しくありません。最初のクエリでは、次のような領域を選択しています。これSelect ItemID, Area FROM [Location]により、次のようなデータが返されます。

Area 1  Item 1
Area 1  Item 2
Area 2  Item 3
Area 2  Item 4

などなど、リピーターはそれに応じてグループ化します。したがって、親をこれらの結果にバインドすると、Area1、Area1、Area 2、Area 2 ...が得られます。データテーブルの使用は避け、LinqtoSQLやEntityFrameworkなどを使用します。しかし、あなたの場合、最速の修正は次のようになります。

ラベルを追加

<li>                           
    <asp:Label ID="lblArea" runat="server" Text='<%#((DataRowView)Container.DataItem)["Area"]%>' />                       
</li>

コード内

protected void Page_Load(object sender, EventArgs e)    {        
    string cn = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=|DataDirectory|Source.mdb";        
    using (OleDbConnection conn = new OleDbConnection(cn))      
    {            
        OleDbCommand cmd = new OleDbCommand("Select Area FROM [Location]", conn);        
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);                
        DataSet ds = new DataSet();        
        da.Fill(ds, "Table1");               
        CategoryRepeater.DataSource = ds.Tables["Table1"];                    
        categoryRepeater.DataBind();      
    }    
}

protected void CategoryRepeater_bound(object source, RepeaterItemEventArgs e) 
{             
    RepeaterItem item = e.Item;             
    if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)             
    {                             
        Repeater rep = (Repeater)item.FindControl("childRepeater");  
        Label lblArea = (Label)item.FindControl("lblArea");  

        OleDbCommand cmd = new OleDbCommand("Select ItemID, Drawind FROM [Location] WHERE Area = '" + lblArea.Text+ "'", conn);        
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);                
        DataSet ds = new DataSet();        
        da.Fill(ds, "Table1");               
        rep.DataSource = ds.Tables["Table1"];                    
        rep.DataBind();  
    }                  
}
于 2012-06-26T05:55:29.230 に答える
1

DataRelationを正しく設定していないと思います。コードに基づいて、親としてArea、子としてItemIdがあります。ただし、DataRelationを作成するときは、両方のテーブルの列をItemIdに設定します。これにより、子テーブルは親テーブルと1対1になります。

代わりに、列領域にDataRelationを設定する必要があります。それで私が信じる問題は解決するはずです。

ただし、親テーブルに同じ領域を持つ複数の行が含まれている場合は機能しないため、親テーブル(Table1)の入力に使用されるSQLを変更する必要がある場合があります。それが必要かどうかはすぐにはわかりませんが、そうなると思います。多分このように:

OleDbCommand cmd = new OleDbCommand("Select DISTINCT Area FROM [Location]", conn); 

お役に立てれば。

編集:不正な形式のhtmlについてのfenix2222による回答も参照してください。

于 2012-06-26T06:03:24.077 に答える