Kobarin's Development Blog

C#やASP.NETなどについての記録です。

ObjectDataSourceからクラスを呼び出してバインドする

Repeater等のデータリスト系コントロールから、データソースとしてObjectDataSource(以降ODS)を指定した際にクラスを呼び出す方法です。


私個人のやり方ですが、SQL文の定義を1つに集約するため、最近はSqlDataSourceやODSを個別に定義せず、クラスをObjectDataSourceから呼び出しています。
以下にサンプルを示します。
まずRepeaterのデータソースにODSを指定します。
ODSではFruitsクラスのItemsメソッドを呼び出し、パラメータに色タイプ(colorType)としてRedを指定しています。
Itemsメソッドでは、FruitクラスをGeneric化し返しています。

<asp:Repeater ID="rp1" runat="server" DataSource="ods1">
  <HeaderTemplate><ol></HeaderTemplate>
  <ItemTemplate>
    <li><%# Eval("Name") %>(<%# Eval("Price", "{0}円") %>)</li>
  </ItemTemplate>
  <FooterTemplate></ol></FooterTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ods1" runat="server" SelectMethod="Items" TypeName="Products.Fruits">
  <SelectParameters>
    <asp:Parameter DefaultValue="Red" Name="colorType" Type="String" />
  </SelectParameters>
</asp:ObjectDataSource>

クラス

namespace Products
{
  public class Fruits
  {
    public Fruits(){ }
    public List<Fruit> Items(string colorType)
    {
      List<Fruit> fruits = new List<Fruit>();
      switch(colorType)
      {
        case "Red":
          fruits.Add(new Fruit("Apple", 100);
          fruits.Add(new Fruit("Cherry", 250);
          break;
        case "Yellow":
          fruits.Add(new Fruit("Banana", 200);
          fruits.Add(new Fruit("Pineapple", 400);
          break;
        default: break;
      }
      return fruits;
    }
  }

  public class Fruit
  {
    public Fruit(string name, int price)
    {
      Name = name;
      Price = price;
    }
    public string Name{ get; set; }
    public int Price{ get; set; }
  }
}

実行結果

1. Apple(100円)
2. Cherry(250円)