【问题标题】:Accessing RepeaterItem Controls in an EventHandler在 EventHandler 中访问 RepeaterItem 控件
【发布时间】:2009-06-02 01:19:44
【问题描述】:

我有一个带有中继器的页面。我正在编写一个事件处理程序,以便当用户单击我的 WebControl 按钮时,所述按钮的事件处理程序使用 FindControl 遍历转发器中的项目,然后使用一些控件的值。不过,似乎在加载页面后,会填充中继器项目,但是当单击按钮将其发回时,当我遍历中继器项目时,我看到它们都是空的。我不完全理解排序,但我假设这是因为我的迭代代码试图访问尚未设置的 RepeaterItems。

中继器代码在我的 OnLoad 方法中。除此之外,我的事件处理程序在被点击后尝试遍历这些项目。这基本上就是我想要做的:

protected void MyButton_Click(object sender, EventArgs e)
{
    foreach(RepeaterItem item in MyRepeater.Items)
    {
        MyLabel = (Label)item.FindControl("MyLabel");
    }
}

该按钮位于转发器的 FooterTemplate 中。

<asp:Button runat="server" OnClick="SubmitChecklist_Click" cssclass="BlueSubmit" id="SubmitChecklist" text="Submit" />

提前致谢。

编辑:澄清一下,当我尝试做某事时,我得到的确切错误是 NullReferenceException,例如,Response.Write(MyLabel.Text)

编辑:在今天对其进行了更多研究之后,这就是我所理解的正在发生的事情:转发器在回发时是数据绑定的。然后,当我从生成的下拉列表中进行选择并点击我的按钮时,它会再次发回。此时,中继器再次数据绑定到它的初始值。因此,如果我必须回发才能获得用户的选择,我该如何在按钮的事件处理程序中执行此操作,以便在该转发器再次获得数据绑定之前获取所选值?

【问题讨论】:

  • 你在哪里连接你的事件处理程序?您发布的代码应该没问题 - 这是未设置项目的问题。
  • 你能从对象发送者那里得到任何信息吗?
  • 我能够响应。写来自发件人的哈希码,所以我假设是这样。
  • @Lance -- 我对事件没有经验,所以我对你的问题并不肯定。我在 .aspx 中声明了按钮,这就是我过去所做的一切。
  • 将按钮移出中继器时会发生什么?

标签: c# asp.net


【解决方案1】:

听起来,问题在于您可能在加载时将数据绑定到转发器,但没有首先检查以确保它不是回发。

示例:

  1. 您请求页面。在负载火灾。您将数据绑定到中继器。
  2. 您在 reapter 中操作数据,然后点击您的按钮
  3. 页面通过回发刷新,触发 onload 事件。数据被反弹到您的中继器,并且之前输入的所有数据都已失效。
  4. onclick 事件被触发,您的代码尝试检索不再存在的值。

确保 onLoad 事件中的数据绑定代码嵌套在回发检查中

if (!Page.IsPostBack)
{
   Repeater.DataSource = Datatable;
   Repeater.DataBind();
}

【讨论】:

  • 我认为这就是问题所在。我的数据绑定确实发生在 if(Page.IsPostBack){} 中。当页面不是回发时,我会显示一个下拉列表。用户选择一个项目,然后点击提交,触发回发。在回发中,我有基于用户选择的转发器数据绑定。转发器包含输入项,所以我在页脚模板上有一个 asp:Button,在该按钮的事件处理程序中,我想使用来自转发器的输入值。
  • 您是否在检查以确保在遍历项目时没有尝试访问页眉或页脚。检查每个项目的 ItemType 属性以确保它是 ListItem 或 AlternateItem 而不是 HeaderItem 或 FooterItem(在此示例中,我可能将对象名称稍微偏离了一点。独立确认。)
【解决方案2】:

我也见过同样的事情。我不明白为什么,但是直到所有事件都被触发后,数据才真正被绑定。我最终在班级级别提供了我的数据源,然后建立了索引。

private DataTable myTable;
protected void Page_Load(object sender, EventArgs e)
{
    //populate dataTable
    if (!IsPostBack)
    {
        //databind to repeater
    }
}

protected void Submit_Click(object sender, EventArgs e)
{
    foreach (RepeaterItem item in repeater1.Items)
    {
        DataRow row = myTable.Rows[item.ItemIndex];
    }
}

理想?当然不是,但它有效。

【讨论】:

  • 我实际上刚刚开始工作。我没有依赖 OnLoad 中的 IsPostBack,而是为选择一个月后页面所处的两种不同状态创建了两个单独的事件处理程序。
【解决方案3】:

我没有依赖 OnLoad 中的 IsPostBack,而是通过在用户选择第一个选项后将转发器的数据绑定放在事件处理程序中来分离所有不同的状态,而不是依赖 OnLoad 的 IsPostBack。这有点令人费解,但我认为这次我做对了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多