首页 > 解决方案 > 在回发更改中继器项目后,RepeaterCommandEventArgs 不正确

问题描述

我正在努力正确地表达这一点,因为我不确定问题是什么,但我会试一试。

我在转发器中有一个事件列表。我在此列表上方有一个复选框,它执行回发并显示过期事件。

当它回发时,它在转发器中具有正确的信息,但是当我单击编辑 (ItemCommand) 时,它具有错误的事件 ID(而是在回发之前显示事件的 ID)。

我不确定中继器是否存在某种超出我知识范围的 id 映射。

这是我的一些代码,希望能让事情变得更清楚:

    protected void chkShowExpired_CheckedChanged(object sender, EventArgs e)
    {
        rptEvents.DataSource = Events.GetFiltered(null, null, chkShowExpired.Checked, null, null, null, null, "");
        rptEvents.DataBind();
    }

    protected void rptEvents_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "DeleteEvent":
                ...
            break;

            case "EditEvent":
                ...
            break;
        }
    }

标签: c#asp.net.netrepeater

解决方案


那么复选框事件将在索引更改事件之前触发。所以在复选框事件中,不能直接使用控件来获取行/选中的索引。您必须等到选定的索引转发器事件触发。

但是,我将按钮、复选框和各种控件放入该中继器中。

我所做的,甚至不打扰转发器事件模型。

只需在您的复选框事件或按钮事件或任何其他事件中执行此操作

protected void cmdUpdate_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;

RepeaterItem rItem = (RepeaterItem)btn.Parent;

TextBox tBox = (Textbox)rItem.FindControl("txtHotelName");

response.Write("hotel name = " + tBox.Text);
}

换句话说,只需拔出发件人。现在,这变成了简单的 jane asp.net 代码和按钮。您不必关心使用转发器事件模式,并触发说转发器的索引更改事件。

此外,还有一个很酷的技巧。

当您放入复选框时,下拉列表,按钮?

好吧,因为它在中继器内部,所以我们不能这样做,所有精彩的都调出属性表,或者更简单的是双击跳转到代码后面的控件。

但是,你可以做这个很酷的技巧 - 只需使用 intel-sense:

例如这个:

只需在标记中输入事件名称,当您点击“=”符号时,intel-sense 将为您提供创建事件的选项,如下所示:

在此处输入图像描述

因此,您现在可以单击创建新事件 - 似乎没有发生任何事情,但是如果您现在转到后面的代码,您会看到按钮事件(在此示例中)。

因此,通过选择 sender,然后是 sender.parent(这是中继器项目),那么我们真的不关心让中继器事件模型“索引更改”事件触发 - 你真的不在乎,因为你得到 /通过使用发件人的 .parent 来充分使用转发器行项目。

最终结果?您只需对这些控件及其事件进行编码,就像在中继器之外的任何其他控件一样。

一旦你把手放在那个中继器项目(行)上,那么你就可以自由地做任何你想做的事情了。


推荐阅读