Передача щелчка по кнопке от одного пользовательского элемента управления другому - PullRequest
4 голосов
/ 18 января 2012

У меня есть два пользовательских элемента управления на одной странице.Один содержит ListView, который отображает навигационные ссылки, второй пользовательский элемент управления должен обновляться, когда пользователь нажимает на ссылку кнопки в ListView.Как я могу это сделать?

1 Ответ

6 голосов
/ 18 января 2012
  1. UserControl A должен обрабатывать нажатие кнопки и вызывать пользовательское событие , объявленное в UserControl
  2. Страница обрабатывает это событие и вызывает открытый метод UserControl B, который обновляетего содержимое

Вы можете передавать необходимую информацию из UserControl A на страницу через EventArgs (или передавать сам UserControl в качестве аргумента и использовать его открытые свойства).

Страница затем передает аргументыв UserControl B через параметр метода или путем изменения его общедоступных свойств перед вызовом Update -Metod.


Вот пример кода, который вы запросили.Извините за бессмысленные названия, но вы еще не сказали, что это такое.Вместо этого вы должны использовать читаемые переменные, свойства, методы и имена событий.

Уменьшено UserControl A с ListView:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UsercontrolA.ascx.vb" Inherits="WebApplication1.UserControlA" %>
<asp:ListView ID="ListView1" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" 
        CommandName="LinkClick" 
        CommandArgument='<%#Eval("ID") %>' 
        runat="server" 
        Text='<%#Eval("Text") %>'></asp:LinkButton>
    </ItemTemplate>
</asp:ListView>

Удалено связывание данных ListView из codebehind, потому чтоэто не имеет значения.Важной частью является обработка ItemCommand ListView и создание настраиваемого события:

Public Event LinkClicked(sender As UserControlA, id As Int32)

Private Sub LV_ItemCommand(sender As Object, e As ListViewCommandEventArgs) Handles ListView1.ItemCommand
    If e.CommandName = "LinkClick" Then
        Dim id = CType(e.CommandArgument, Int32)
        ' This is the best way for UC's to commmunicate with the page: '
        RaiseEvent LinkClicked(Me, id)
    End If
End Sub

Simple UserControl B с не более чем меткой (ascx):

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UserControlB.ascx.vb" Inherits="WebApplication1.UserControlB" %>
<asp:Label ID="Label1" runat="server"></asp:Label>

С Update -методом в коде:

Public Sub Update(showID As Int32)
    Me.Label1.Text = String.Format("Link {0} clicked", showID.ToString)
End Sub

Наконец, вот Page (aspx)

<uc1:UsercontrolA ID="UC_A" runat="server" />
<br />
<uc2:UserControlB ID="UC_B" runat="server" />

Он управляет обоими пользовательскими элементами управления.Он обрабатывает событие из UserControl A и вызывает Update -метод, который обеспечивает UserControl B:

Private Sub LinkClicked(sender As UserControlA, id As Integer) Handles UC_A.LinkClicked
    Me.UC_B.Update(id)
End Sub

Преимущество этого подхода к событию заключается в том, что UserControls остаются повторно используемыми.Вы можете использовать UserControl A и на других страницах, даже если они не обрабатывают это событие.Это часть контроллера, чтобы решить, что нужно и что делать.

UserControls, как правило, не должны зависеть от конкретных контроллеров, в противном случае они жестко связаны и не могут использоваться повторно.Это было бы также хорошим источником для неприятных ошибок.UserControl может быть контроллером для других вложенных (пользовательских) элементов управления, но не для самой страницы.

Сводка по связи :

  • Страница -> UserControl -> общедоступные свойства и методы
  • UserControl -> Страница -> События
  • UserControl -> UserControl -> controller-UserControl принимает роль страницы (см. Выше)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...