2012-01-20 1590 views
0

Я разрабатываю чат-систему. В этом я создаю динамические вкладки в контейнере табуляции, когда я изменяю выбранный индекс окна списка пользователей. На этих вкладках я создаю 2 текстовых поля и 1 кнопку динамически и добавляя обработчик для события нажатия кнопки. Я сохраняю tabid в состоянии сеанса и воссоздавая все вкладки в событии page_init. Я могу запустить событие нажатия кнопки на панели вкладок, в котором я не могу получить доступ к этим динамически созданным текстовым полям, но я могу получить доступ к метке, которую я создал статически. Я использовал метод findcontrol(), но в нем отображается сообщение об ошибке: «Использовать новую команду для создания экземпляров текстовых полей». Он показывает что-то вроде того, что я не создал экземпляры текстового поля.не удалось получить доступ к динамически созданным элементам управления в tabcontainer в asp.net с помощью vb.net

Любая помощь очень ценится!

+0

Почему вы создаете эти 2 текстовые поля и кнопку динамически? Вместо этого вы должны обернуть их в UserControl. Это облегчает работу. Кроме того, я еще не понял, что вы пытаетесь сделать. Пользователь выбирает элемент ListBox в одной TabPanel, который вызывает создание n-TabPanels. Можете ли вы объяснить это более подробно? –

+0

Я показываю подписываемых пользователей в списке, когда пользователь выбран из списка пользователей. Я создаю вкладку с двумя текстовыми полями и набираю и одну кнопку для отправки данных. Если я выбрал другого пользователя, я воссоздаю старую вкладку и создаю новую вкладку с новым идентификатором и добавлю два текстовых поля и отправлю ей кнопку, как и раньше. Я не собираюсь обернуть их в пользовательский контроль, можете ли вы объяснить это мне примером? Вы хотите увидеть мой исходный код? – krrish

ответ

0

Вот полный рабочий пример:

Page-ASPX:

<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" CombineScripts="true"> 
</asp:ToolkitScriptManager> 
<div> 
    <asp:UpdatePanel ID="UpdTabContainer" ChildrenAsTriggers="false" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
    <asp:TabContainer ID="TabContainer1" runat="server" AutoPostBack="true"> 
     <asp:TabPanel ID="TabUserList" runat="server" HeaderText="UserList"> 
      <ContentTemplate> 
       <asp:UpdatePanel ID="UpdUserList" runat="server" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <asp:ListBox ID="ListBox1" SelectionMode="Single" AutoPostBack="true" OnSelectedIndexChanged="UserChanged" runat="server"> 
          <asp:ListItem Text="User 1" Value="1"></asp:ListItem> 
          <asp:ListItem Text="User 2" Value="2"></asp:ListItem> 
          <asp:ListItem Text="User 3" Value="3"></asp:ListItem> 
         </asp:ListBox> 
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="TabContainer1" EventName="ActiveTabChanged" /> 
        </Triggers> 
       </asp:UpdatePanel> 
      </ContentTemplate> 
     </asp:TabPanel> 
    </asp:TabContainer> 
    </ContentTemplate> 
    </asp:UpdatePanel> 
</div> 

Codebehind:

Public Class TabContainerSample 
    Inherits System.Web.UI.Page 

    Property CreatedTabIDs As List(Of Int32) 
     Get 
      If Session("CreatedTabIDs") Is Nothing Then 
       Session("CreatedTabIDs") = New List(Of Int32) 
      End If 
      Return DirectCast(Session("CreatedTabIDs"), List(Of Int32)) 
     End Get 
     Set(value As List(Of Int32)) 
      Session("CreatedTabIDs") = value 
     End Set 
    End Property 

    Private Sub TabContainerSample_Init(sender As Object, e As System.EventArgs) Handles Me.Init 
     For Each userID In CreatedTabIDs 
      AddTab(userID) 
     Next 
    End Sub 

    Private Sub AddTab(tabID As Int32) 
     Dim ucLogin = DirectCast(Page.LoadControl("LoginControl.ascx"), LoginControl) 
     ucLogin.UserID = tabID 
     AddHandler ucLogin.LoggedIn, AddressOf userLoggedIn 
     Dim newTabPanel = New AjaxControlToolkit.TabPanel 
     newTabPanel.ID = String.Format("Tab{0}", tabID) 
     newTabPanel.HeaderText = String.Format("TabPanel {0}", tabID) 
     newTabPanel.Controls.Add(ucLogin) 
     TabContainer1.Tabs.Add(newTabPanel) 
    End Sub 

    Protected Sub UserChanged(sender As Object, e As EventArgs) 
     Dim tabID = Int32.Parse(DirectCast(sender, ListBox).SelectedValue) 
     If Not CreatedTabIDs.Contains(tabID) Then 
      AddTab(tabID) 
      CreatedTabIDs.Add(tabID) 
      Me.UpdTabContainer.Update() 
     End If 
    End Sub 

    Private Sub userLoggedIn(login As LoginControl) 
     ' do something ' 
    End Sub 

End Class 

UserControl, например, Логин-Control:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="LoginControl.ascx.vb" Inherits="WebApplication1.LoginControl" %> 
<asp:UpdatePanel ID="UpdLoginControl" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
    User-ID: <asp:Label ID="LblUserID" runat="server" Text="0"></asp:Label> 
    <br /><asp:TextBox ID="TxtUserName" runat="server"></asp:TextBox> 
    <br /><asp:TextBox ID="TxtPassord" runat="server"></asp:TextBox> 
    <br /><asp:Button ID="BtnLogin" runat="server" Text="Login" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Codeb ehind:

Public Class LoginControl 
    Inherits System.Web.UI.UserControl 

    Public Event LoggedIn(sender As LoginControl) 

    Public Property UserID As Int32 
     Get 
      Return Int32.Parse(Me.LblUserID.Text) 
     End Get 
     Set(value As Int32) 
      Me.LblUserID.Text = value.ToString 
     End Set 
    End Property 

    Private Sub BtnLogin_Click(sender As Object, e As System.EventArgs) Handles BtnLogin.Click 
     Dim userName = TxtUserName.Text 
     Dim password = TxtPassord.Text 
     ' validate UserName and Password, if valid you can raise your custom LoggedIn-Event' 
     Dim loggedIn As Boolean = True 
     If loggedIn Then 
      RaiseEvent LoggedIn(Me) 
     End If 
     Me.UpdLoginControl.Update() 
    End Sub 
End Class 

Если у вас есть еще один вопрос, спросите.

+0

Привет, Тим Спасибо за ваш ответ. Выполняется ли событие BtnLogin_Click? в этом случае я попытался изменить значение текстового поля при нажатии кнопки входа в систему. i.e, я добавил txtUserName.text = «ваше имя», когда я нажал кнопку. но он не обновляется, когда я нажимал кнопку. вы можете объяснить мне это? Я новичок в ASP.NET. пожалуйста, не возражаете, если я вас раздражаю для простых вопросов. – krrish

+0

@krish: Хорошо, я не знал, что вы хотите изменить TextBox-Text в Button-Click. Вы должны обернуть содержимое UserControl в его собственную UpdatePanel. Я отредактировал свой ответ, чтобы уточнить, что я имею в виду (обратите внимание также на «UpdLoginControl.Update» в codebehind). –

+0

Большое вам спасибо ... Его работа ... я отправлю, если я найду какие-то проблемы дальше .... – krrish

Смежные вопросы