AJAX ControlToolkitのTabContainerにコントロールを動的に追加すると、例外が発生する場合がある

文書番号 : 39062     文書種別 : 不具合     登録日 : 2015/07/31     最終更新日 : 2016/02/19
文書を印刷する
対象製品
InputMan for ASP.NET 7.0J
状況
修正済み
詳細
aspxファイルでページ上に配置しているコンボコントロールを、ページのLoadイベントでAJAX ControlToolkitのTabContainerまたはAccordion上に移動すると、ポストバック時に「オブジェクト参照がオブジェクト インスタンスに設定されていません。」という例外が発生します。

【再現コード】
[aspxファイル(Visual Basic, C#共通)]
・・・
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></asp:ToolkitScriptManager>
<asp:TabContainer ID="TabContainer1" runat="server" ActiveTabIndex="0">
    <asp:TabPanel runat="server" HeaderText="TabPanel1" ID="TabPanel1">
    </asp:TabPanel>
</asp:TabContainer>

<im_combo:GcComboBox ID="GcComboBox1" runat='server' HasLoadFromXml="True"></im_combo:GcComboBox>
・・・

[Visual Basic]
Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        TabContainer1.Tabs(0).Controls.Add(GcComboBox1)
    End Sub
    ・・・
End Class

[C#]
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TabContainer1.Tabs[0].Controls.Add(GcComboBox1);
    }
    ・・・
}

この現象はリストコントロールでも発生します。

なお、aspxファイルでTabContainerおよびAccordion上に、コンボおよびリストコントロールがすでに配置されている場合、本現象は発生しません。
回避方法
この問題はService Pack 5(v7.0.2016.219)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページからダウンロードできます。

Service Pack 5より前のバージョンでは以下の方法で回避可能です。
コンボコントロールをTabContainerへ追加する処理を、ページのLoadイベントでは行わず、OnPreInitイベントをオーバーロードして行います。

以下は、コンボコントロールおよびTabContainerを使用した場合の回避方法です。
リストコントロールやAccordionを使用している場合も同様の方法で回避できます。

[Visual Basic]
Protected Overrides Sub OnPreInit(e As EventArgs)
    MyBase.OnPreInit(e)
    TabContainer1.Tabs(0).Controls.Add(GcComboBox1)
End Sub

[C#]
protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
    TabContainer1.Tabs[0].Controls.Add(GcComboBox1);
}

もしくは、コンボコントロールをaspxファイルには配置せず、コードビハインドでインスタンスを生成しPage_InitイベントでTabContainerに追加します。

[Visual Basic]
Private GcComboBox1 As GrapeCity.Web.Input.IMCombo.GcComboBox

Protected Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
    GcComboBox1 = New GrapeCity.Web.Input.IMCombo.GcComboBox()
    TabContainer1.Tabs(0).Controls.Add(GcComboBox1)
End Sub

[C#]
private GrapeCity.Web.Input.IMCombo.GcComboBox GcComboBox1;

protected void Page_Init(object sender, EventArgs e)
{
    GcComboBox1 = new GrapeCity.Web.Input.IMCombo.GcComboBox();
    TabContainer1.Tabs[0].Controls.Add(GcComboBox1);
}