Проблема с Ajax TabContainer в ServerControl'е
От: hdd-killer  
Дата: 17.09.10 11:14
Оценка:
Создал серверный контрол (CompositeControl), поместил в него Ajax'овский TabContainer. В результате после перехода на любую вкладку TabContainer-а кроме первой, событие возникает не один раз, а при каждом постбэке. При переходе на первую вкладку (TabIndex = 0) событие не возникает вообще. Совсем уж не адекватно ведут себя другие Ajax-контрлы, в частности ComboBox.

Вот код контрала:


    [ToolboxData("<{0}:MyControl runat=\"server\"></{0}:MyControl>")]
    public class MyControl: CompositeControl
    {
        private TabContainer tc = new TabContainer();
        private Label l = new Label(){ Text = "No changed", ViewStateMode = ViewStateMode.Disabled};

        protected override void CreateChildControls()
        {
            Panel pnl = new Panel();
            Controls.Add(pnl);
            tc.ActiveTabChanged += tc_ActiveTabChanged;
            tc.AutoPostBack = AutoPostBack;
            tc.Tabs.Add(New TabPanel());
            tc.Tabs.Add(New TabPanel());
            tc.Tabs.Add(New TabPanel());

            pnl.Controls.Add(l);
            pnl.Controls.Add(tc);
        }

        protected void tc_ActiveTabChanged(object sender, EventArgs e)
        {
            l.Text = "changed";
        }
   }


При использовании получаем, что событие в моем контроле отрабатывает при каждом постбэке, когда выбрана не нулевая вкладка, и не отрабатывает вообще, если выбрана нулевая. Если TabContainer просто кинуть на форму, все в порядке:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<%@ Register Assembly="MyControl" Namespace="WebApplication1" TagPrefix="cc2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Page_Load()
    {
            Label1.Text = "no changed";
    }

    protected void TabContainer1_ActiveTabChanged(object sender, EventArgs e)
    {
            Label1.Text = "changed";
    }
 
    protected void Button1_Click(object sender, EventArgs e)
    {

    }
   
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
      В контроле:<br />
      <cc2:MyControl ID="MyCtr" runat="server"></cc2:MyControl>
      Не в контроле:<br />
      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
      <asp:TabContainer ID="TabContainer1" AutoPostBack="true" runat="server" 
                onactivetabchanged="TabContainer1_ActiveTabChanged" ActiveTabIndex="0">
            <asp:TabPanel runat="server" HeaderText="TabPanel1" ID="TabPanel1">
            </asp:TabPanel>
            <asp:TabPanel ID="TabPanel2" runat="server" HeaderText="TabPanel2">
            </asp:TabPanel>
      </asp:TabContainer>

      <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </form>
</body>
</html>


Делаю вроде все по манам майкрософта, проще уже некуда. Подскажите, в чем может быть проблема, что я делаю не так. Куда копать хотя бы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.