Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

拡張メソッドでRepeaterコントロールのRepeaterItemを型指定されたDataRowに変換する

拡張メソッドでRepeaterコントロールのRepeaterItemを型指定されたDataRowに変換します。

どういうこと?

型指定されたDataTableをRepeaterコントロールのDataSourceにバインドする場合、RepeaterItemを型指定されたDataRowに変換する拡張メソッドを定義すると便利です。

どうして?

DataRowの型を型引数で渡せるので一度メソッドを記述してしまえば、汎用的に使用できます。

どうすれば?

ソースコードを記載します。

ソースコード
using System;
using System.Data;
using System.Web.UI.WebControls;

namespace Extensions {
    public static class DataSetExtensions {
        /// <summary>
        /// <see cref="System.Web.UI.WebControls.RepeaterItem" /> のインスタンスを型指定されたDataRowに変換します。
        /// </summary>
        /// <typeparam name="T">型指定されたDataRowの型。</typeparam>
        /// <param name="self"><see cref="System.Web.UI.WebControls.RepeaterItem" /> のインスタンス</param>
        /// <returns>変換されたDataRow。</returns>
        public static T ToDataRow<T>(this RepeaterItem self) where T : DataRow {
            T dataRow = self.DataItem as T;
            if(dataRow != null)
                return dataRow;

            DataRowView rowView = self.DataItem as DataRowView;
            if(rowView == null) {
                throw new System.ArgumentException("RepeaterコントロールにDataTableが関連付けられていません。");
            }
            return rowView.Row as T;        
        }
    }
}
使い方

こんな風に使います。

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <div>
            <%# Container.ToDataRow<HogeDataSet.FugaRow>().foo %>
        </div>
    </ItemTemplate>
</asp:Repeater>