System.Web.UI.WebControls.ListView でカスタマイズした ItemTemplate を使いたい(失敗)

.NET Framework 3.5 で新設された ListView について、ListView.ItemTemplate プロパティListView.InstantiateItemTemplate メソッド を override すれば、型付DataSet を Container 変数に割り当てた状態でテンプレートを作成できるんじゃないかとやってみた。

…が失敗した。.NET Framework のソースコード閲覧をしてみて、継承するやり方では結局駄目であることを確認した。

ソースコード閲覧については @IT Visual Studio 2008で見る.NET Frameworkのソースコード を参考に。

一応やろうとしたコードの断片はこんな:

using System;
using System.ComponentModel;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ExampleLibrary
{
    public class カスタマイズされたListView : ListView
    {
        [Browsable(false)]       
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [TemplateContainer(typeof(カスタマイズされたListViewDataItem), BindingDirection.OneWay)]
        [TemplateInstance(TemplateInstance.Multiple)]
        public override ITemplate ItemTemplate
        {
            get
            {
                return base.ItemTemplate;
            }
            set
            {
                base.ItemTemplate = value;
            }
        }

        protected override void InstantiateItemTemplate(Control container, int displayIndex)
        {
            if (container is ListViewDataItem)
            {
                カスタマイズされたListViewDataItem dataitem = new カスタマイズされたListViewDataItem((ListViewDataItem)container);
                ItemTemplate.InstantiateIn(dataitem);
                // Controls.Add(dataitem); // この時点だと DataItem の中身がなくて失敗
                // container の追加はそれはそれで ListView 側で別のタイミングで行われてしまう
            }
            else
            {
                base.InstantiateItemTemplate(container, displayIndex);
            }
        }
    }

    public class カスタマイズされたListViewDataItem : Control, INamingContainer
    {
        private SearchDataSet.ExampleTableRow _currentRow = null;
        private ListViewDataItem _listviewdataitem;

        public カスタマイズされたListViewDataItem(ListViewDataItem _listviewdataitem)
        {
            _listviewdataitem.DataBind();
            this._listviewdataitem = _listviewdataitem;
        }

        public SearchDataSet.ExampleTableRow CurrentRow {
            get {
                if (_currentRow == null)
                {
                    object item = _listviewdataitem.DataItem;
                    if (item is DataRowView)
                    {
                        _currentRow = ((DataRowView)item).Row as SearchDataSet.ExampleTableRow;
                    }
                }
                return _currentRow;
            }
        }

        public string 名前取得()
        {
            return CurrentRow.名前;
        }
    }
}
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。