将ItemCommand添加到CompositeDataBoundControl

时间:2008-11-18 20:08:21

标签: c# asp.net

我有一个CompositeDataBoundControl并且我试图向它添加一个ItemCommand,ala是System.Web.UI.WebControls.Repeater - 所以就像一个numpty,我只是想如果我反射并添加了这样的代码,它应该工作:

private static readonly object EventItemCommand = new object();

protected override bool OnBubbleEvent(object sender, EventArgs e)
{

   // throw new Exception();
    bool flag = false;
    if (e is RepeaterCommandEventArgs)
    {
        this.OnItemCommand((RepeaterCommandEventArgs)e);
        flag = true;
    }
    return flag;
}


protected virtual void OnItemCommand(RepeaterCommandEventArgs e)
{
    RepeaterCommandEventHandler handler = (RepeaterCommandEventHandler)base.Events[EventItemCommand];
    if (handler != null)
    {
        handler(this, e);
    }
}

public event RepeaterCommandEventHandler ItemCommand
{
    add
    {
        base.Events.AddHandler(EventItemCommand, value);
    }
    remove
    {
        base.Events.RemoveHandler(EventItemCommand, value);
    }
}

不幸的是,即使我有事件限制,它似乎也没有发射。我尝试沿着IPostBackEventHandler的路线走下去,但它仍然不太正确(我可以在没有args的情况下关闭一个空事件,但我看不到用RepeaterCommandEventArgs调用OnItemCommand的好方法

任何想法如何让这个工作?

过去4个小时我一直坐在办公室试图让这个工作!救命啊!

2 个答案:

答案 0 :(得分:2)

在Repeater控件的情况下,RepeaterItem对象实际上引发了bubble事件并提供了RepeaterCommandEventArgs:

protected override bool OnBubbleEvent(object source, EventArgs e)
{
    if (e is CommandEventArgs)
    {
        RepeaterCommandEventArgs args = new RepeaterCommandEventArgs(this, source, (CommandEventArgs) e);
        base.RaiseBubbleEvent(this, args);
        return true;
    }
    return false;
}

如果你没有在你的控件中使用RepeaterItem,你可能永远不会得到RepeaterCommandEventArgs。请尝试检查CommandEventArgs。还要确保调用控件的OnBubbleEvent方法。

答案 1 :(得分:0)

我使用自定义的“RepeaterItem”(例如RecipeItem) - 我似乎无法获取OnBubbleEvent(已经覆盖它并从RepeaterItem中窃取了东西)来触发项目。

没关系,我是个白痴。注释掉DataBind();!