:
これは私の最初の投稿です。私の誤解を許してください :D 私が直面している問題は次のとおりです。データ リスト内の「ImageButton」からイベントをキャッチしようとしていますが、いくつかの問題が発生しています。
何らかのアクションを実行するために起動されたボタンをキャッチする必要があります (そのため、それを特定する必要があります)。ボタンは、「DataList」に含まれるユーザー コントロール内にあり、ユーザー コントロール内に配置され、ページから読み込まれます (マスター ページもあります)。ここでネストされた順序を確認できます: Page->User-Control->DataList->User Control->ImageButton
Web アプリケーションは Web フォーム MVP パターンを使用して構築されているため、ページ (コントロールではない) にはすべてのロジックを管理し、データを送信して Web フォームをバインドし、必要なコントロールをロードするプレゼンターがあります。
メンバー.aspx
.......
<%@ Register Src="~/Controls/DataControl.ascx" TagName="DataBox" TagPrefix="dtC" %>
.......
<dtC:DataBox ID="DataBoxControl" runat="server" />
メンバー.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();
}
プレゼンターは次のようになります。
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" />
.......
アクションを実行する ID は、「ContactImage」コントロールでイメージ ボタン「CommandName」に割り当てられます。これは、ボタンがクリックされたときに取得する必要がある値です。実際、ContactImage ユーザー コントロールは内部で何も実行せず、発生したイベントをデータ リストの OnItemCommand に依存していますが、次の 2 つの問題があります。
- Page_Load の前にデータ リストをバインドできないため、「IsPostBack」が false のときにデータ バインドが行われていることを確認する必要があります。その場合、ContactImage がそのプロパティをフルフィルしようとして失敗するため、発生したイベントは発生しません (List がバインドされていないため、DataList Item は空です)。
- データ リスト バインディングが Page_Init (ユーザー コントロール内) に移動されると、イベントが発生しますが、OnItemCommand は何も受け取りません (データ リストをバインドするリストも空です)。
シンプルなWebサイトを構築し、それが機能し、イベントがItemCommandに到達するため、使用しているパターンが何らかの形で責任を負っているのだろうか
シンプルな Web サイト (ここでは動作しますが、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」は使用されておらず、イベントは問題なくキャッチされています。とにかく誰かがこの混乱を解くのを手伝ってくれたらとてもうれしいです.
前もって感謝します、
ハビエル