AJAX ControlToolkitのTabContainerにコントロールを動的に追加すると、ポストバックにより入力値が不正になる場合がある
対象製品
InputMan for ASP.NET 8.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上に、コンボおよびリストコントロールがすでに配置されている場合、本現象は発生しません。
【再現コード】
[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 1(v8.0.2015.929)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページからダウンロードできます。
Service Pack 1より前のバージョンでは次の方法で回避可能です。
コンボコントロールを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);
}
不具合を修正した最新のサービスパックは、アップデートページからダウンロードできます。
Service Pack 1より前のバージョンでは次の方法で回避可能です。
コンボコントロールを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);
}