c# - 在回发更改中继器项目后,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;
}
}
解决方案
那么复选框事件将在索引更改事件之前触发。所以在复选框事件中,不能直接使用控件来获取行/选中的索引。您必须等到选定的索引转发器事件触发。
但是,我将按钮、复选框和各种控件放入该中继器中。
我所做的,甚至不打扰转发器事件模型。
只需在您的复选框事件或按钮事件或任何其他事件中执行此操作
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 来充分使用转发器行项目。
最终结果?您只需对这些控件及其事件进行编码,就像在中继器之外的任何其他控件一样。
一旦你把手放在那个中继器项目(行)上,那么你就可以自由地做任何你想做的事情了。