2009-05-29 158 views
2

访问的RepeaterItem控件我有一个在它的中继器的页面。我正在编写一个事件处理程序,以便当用户单击我的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异常,当我尝试做一些事情,例如回复于(MyLabel.Text)

编辑:寻找到更后的今天,这就是我所理解的情况:转发器是回发的数据绑定。当我从生成的下拉列表中选择并点击我的按钮时,它会再次发布。此时,中继器再次将数据绑定到初始值。所以,如果我必须为了得到用户的选择回传,我怎么能去这个按钮的事件处理程序,这样我可以得到中继器之前选定的值被再次数据绑定?

+0

你在哪里接线你的事件处理程序?您发布的代码应该没问题 - 这是没有设置的项目的问题。 – 2009-05-29 21:24:48

+0

你能从对象发件人那里得到任何信息吗? – jrcs3 2009-05-29 21:27:45

+0

我能够Response.Write发件人的哈希码,所以我假设如此。 – 2009-05-29 21:31:46

回答

0

我不是依靠OnLoad中的IsPostBack,而是通过在用户选择第一个选项后将事件处理程序的数据绑定放入事件处理程序的内部,而不是依靠OnLoad的IsPostBack来分离所有不同的状态。这有点复杂,但我认为我这次做的是正确的。

3

的问题,这听起来像,就是你可以在数据绑定到您的转发器上的负载,而不是首先检查,以确保它不是一个回。

例如:

  1. 您请求的页面。在加载火灾。您将数据绑定到中继器。
  2. 您在reapter maniupulate数据然后单击您的按钮
  3. 的页面刷新,回发,发射onload事件。数据将被重新提交给您的中继器,并且所有以前输入的数据都将被取消。
  4. onclick事件被触发,你的代码试图检索不再存在的价值。

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

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

我已经看到了同样的事情中。我不明白为什么,但是在所有事件发生之前,数据并没有真正被绑定。我最终在课堂上提供了我的数据源,然后建立索引。

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]; 
    } 
} 

理想?当然不是,但它的工作原理。