0

我有一个 ASP.Net Web 用户控件,它代表列表中的单个条目。为了允许用户对项目重新排序,每个项目都有用于在列表中向上或向下移动项目的按钮。单击其中一个会向父页面引发一个事件,然后父页面会随机播放占位符控件中的项目。

列表条目中的代码片段:

Public Event UpClicked As System.EventHandler
Protected Sub btnUp_Click(ByVal sender As Object, ByVal e As System.EventArgs)
              Handles btnUp.Click
    RaiseEvent UpClicked(Me, New EventArgs())
End Sub

和父容器:

    rem (within the code to add an individual item to the placeholder)
    AddHandler l_oItem.UpClicked, AddressOf UpClicked


Protected Sub UpClicked(ByVal sender As Object, ByVal e As EventArgs)
    MoveItem(DirectCast(sender, ScriptListItem), -1)
End Sub

它最初在测试中看起来像每隔一次到达 UpClicked 的发件人的值(由其属性验证)是相邻的 ListItem,而不是我刚刚单击的那个 - 第一次点击总是错误的,然后第二次点击正确控制。

目前,测试似乎表明按钮的点击事件每隔一段时间就会被忽略。控件中的单击事件上的断点根本没有被击中,尽管事件肯定正在建立。

为什么?

4

1 回答 1

0

要冒泡事件,您可以让用户控件定义事件:

public event SomeEventHandler UpClicked;

其中引用了这个:

public class SomeEventArgs {
   public ListItem Selected { get; set; }
}
public delegate void SomeEventHandler(object sender, SomeEventArgs e);

您可以在此处存储多个属性;您可以存储任意数量的详细信息。但是您可以使用此事件参数将所有信息传递给页面......问题可能是您如何调用事件;确保在您的用户控件中执行以下操作:

public event SomeEventHandler UpClicked;

protected void OnUpClicked(SomeEventArgs e)
{
   if (UpClicked != null) UpClicked(this, e);
}

protected void button_click(object sender, EventArgs e)
{
    this.OnUpClicked(new SomeEventArgs { Selected = this.list.SelectedItem; });
}

HTH。

于 2010-03-09T13:17:59.230 回答