基本的に MultiView のラッパーである CompositeControl を作成しましたが、ビュー内で GridView や FormView などのデータバインドされたコントロールを使用しようとすると、次のエラーが発生します。
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
クラスを最小限に抑えましたが、まだエラーが発生しています。クラスは次のようになります。
[DefaultProperty("Pages"), ParseChildren(true, "Pages"), ToolboxData("<{0}:TestTabs runat=\"server\"></{0}:TestTabs>")]
public class TestTabs : CompositeControl {
private MultiView _multiViewControl;
private Collection<View> _pages;
public Collection<View> Pages {
get {
if (_pages == null) _pages = new Collection<View>();
return _pages;
}
}
protected override void CreateChildControls() {
_multiViewControl = new MultiView();
foreach (View page in Pages) { _multiViewControl.Views.Add(page); }
if (_multiViewControl.Views.Count > 0) _multiViewControl.ActiveViewIndex = 0;
this.Controls.Add(_multiViewControl);
base.CreateChildControls();
}
}
そして、マークアップは次のとおりです。
<cc:TestTabs ID="testTabs" runat="server">
<asp:View runat="server">
<asp:FormView ID="fvTest" runat="server">
<ItemTemplate>
<asp:Label ID="lblTest" runat="server" Text='<%#Eval("TestField")%>' />
</ItemTemplate>
</asp:FormView>
</asp:View>
</cc:TestTabs>
FormView を CompositeControl の外に移動すると、問題なくデータバインドされます。また、標準の MultiView を使用すると、正常に動作します。
何か案は?よろしくお願いします(初投稿のため、情報が抜けていたらすみません)
編集:さらに奇妙なことに、FormView を別の ascx UserControl に抽出し、それをビュー内に配置すると、機能します!