:
Это мой первый пост, поэтому я прошу вас простить мои ошибки: D Проблема, с которой я сталкиваюсь, заключается в следующем: я пытаюсь поймать событие из некоторого 'ImageButton' внутриСписок данных, но у меня возникли некоторые проблемы.
Мне нужно перехватить любую кнопку, которая срабатывает, чтобы выполнить какое-либо действие (поэтому мне нужно определить его).Кнопка находится внутри пользовательского элемента управления, который содержится в «DataList», который находится внутри пользовательского элемента управления, который загружается со страницы (которая также имеет мастер-страницу).Вы можете увидеть вложенный порядок здесь: Page-> User-Control-> DataList-> User Control-> ImageButton
Я должен сказать, что веб-приложение построено с использованием шаблона MVP веб-форм, поэтому страницы (не элементы управления) имеютPresenter, который управляет всей логикой и отправляет данные для связывания веб-форм, загружая необходимые элементы управления.
Members.aspx
.......
<%@ Register Src="~/Controls/DataControl.ascx" TagName="DataBox" TagPrefix="dtC" %>
.......
<dtC:DataBox ID="DataBoxControl" runat="server" />
Members.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
_presenter = IoCFactory.Instance.CurrentContainer.Resolve<IMembersPresenter>();
_presenter.Init(this, IsPostBack);
}
......
public void ShowFriendPanel(IList<ContactInfo> friendList)
{
DataBoxControl.FriendsList = friendList.ToList();
}
Presenter выглядит следующим образом:
public override void Init(IMemberView view, bool isPostBack)
{
base.Init(view,isPostBack);//authentication and basic stuff
IList<ContactInfo> friendContactList = _userAccountDao.GetFriendsOfUser(CurrentUser.Id, 0, int.MaxValue);
if ((friendContactList.Count > 0))
{
ShowFriendsBox(friendContactList);
}
И элемент управления DataBoxControl содержит список данных, который содержит другой пользовательский элемент управления
<asp:DataList ID="dataDL" runat="server" OnItemDataBound="dataDL_ItemDataBound" OnItemCommand="dataDL_ItemCommand" >
<ItemTemplate>
<ci1:ContactImage runat="server" ID="ContactImageControl" Height="59px" Width="59" Show="All" />
</ItemTemplate>
</asp:DataList>
И конечный элемент управления пользователя (ContactImage.ascx) содержит WebЭлемент управления 'ImageButton'
......
<asp:ImageButton ID="deleteButton" ImageUrl="/images/remove_contact_icon.png" runat="server" />
.......
Идентификатор действия назначен в элементе управления ContactImage для кнопки изображения «CommandName», и это значение мне нужно получить при нажатии кнопки.На самом деле, пользовательский элемент управления ContactImage ничего не делает внутри, и я полагаюсь на запущенное событие на OnItemCommand в списке данных, но у меня есть две проблемы:
- Я не могу связать список данных до Page_Load, поэтому я имеюпроверять привязку данных, когда IsPostBack имеет значение false;в этом случае сработавшее событие не происходит, потому что не удается ContactImage при попытке заполнить его свойства (Элемент DataList пуст, потому что List не привязан).
- Если привязка Списка данных перемещена в Page_Init (вКонтроль пользователя) событие запускается, но OnItemCommand вообще ничего не получает (и Список для привязки Списка данных также пуст).
Интересно, отвечает ли используемый мной шаблонкаким-то образом, потому что я создал простой веб-сайт, и он работает, и событие достигает ItemCommand
Simple Website (здесь он работает, но шаблон MVP не используется) Event.aspx
<h2>
Events
</h2>
<p>
Events into Data List
</p>
<asp:DataList ID="DataListWihtEvents" RepeatDirection="Horizontal" RepeatColumns="4" OnItemCommand="DataList_ItemCommand" runat="server">
<ItemTemplate>
<tnc:TopControl ID="TopControlNested" runat="server" Number="<%# (Container.DataItem) %>" />
</ItemTemplate>
<SeparatorTemplate> </SeparatorTemplate>
</asp:DataList>
<br />
<asp:Label ID="ShowButtonFiredUpTitle" runat="server" Text="Here goes the button that was fired up: " />
<asp:Label ID="ShowButtonFiredUp" runat="server" Font-Bold="True" />
Event.aspx.cs
public partial class Events : System.Web.UI.Page
{
protected List<int> Numbers = new List<int>();
protected void Page_Init(object sender, EventArgs e)
{
for (int i = 1; i < 5; i++)
{
Numbers.Add(i);
}
DataListWihtEvents.DataSource = Numbers;
DataListWihtEvents.DataBind();
}
protected void DataList_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandSource.GetType() == typeof(Button))
{
var b = (Button) e.CommandSource;
ShowButtonFiredUp.Text = b.CommandName;
}
}
TopNestedControl.ascx
<% @ Register Src = "~ / Controls / BottomNestedControl.ascx" TagName = "BottomControl" TagPrefix = "bnc"%>
TopNestedControl.ascx.cs
public partial class TopNestedControl : System.Web.UI.UserControl
{
public int Number { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
BottomNestedControl.Number2 = Number;
}
}
BottomNestedControl.ascx
<asp:Button ID="ShowNumberButton" runat="server" Text="Button" CommandName="button fired up!" />
BottomNestedControl.ascx.cs
public partial class BottomNestedControl : System.Web.UI.UserControl
{
public int Number2 { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ShowNumberButton.Text = "Button " + Number2;
ShowNumberButton.CommandName = "#" + Number2;
}
}
В другихстраницы, я использую делегатов для обработки событий, нотам не используется DataList, и событие перехватывается без проблем.Я был бы очень рад, если бы кто-нибудь помог мне разобраться в этом беспорядке.
Заранее спасибо,
Хавьер