我有一个带有转发器的页面。我正在编写一个事件处理程序,以便当用户单击我的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)
编辑:今天进一步研究之后,这就是我理解的情况:转发器在数据回发时是数据绑定的。当我从生成的下拉列表中进行选择并按下我的按钮时,它会再次发回。此时,转发器再次数据绑定到它的初始值。所以,如果我必须回发以获得用户的选择,我怎样才能在按钮的事件处理程序中进行此操作,这样我才能在转发器再次获得数据绑定之前获取所选值?
答案 0 :(得分:3)
这个问题,听起来是,你可能会在加载时将数据绑定到转发器,但不是先检查以确保它不是回发。
示例:
确保onLoad事件中的数据绑定代码嵌套在回发检查中
if (!Page.IsPostBack)
{
Repeater.DataSource = Datatable;
Repeater.DataBind();
}
答案 1 :(得分: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];
}
}
理想?当然不是,但它有效。
答案 2 :(得分:0)
我没有依赖OnLoad中的IsPostBack,而是通过在用户选择第一个选项后将转发器的数据绑定放在事件处理程序中而不是依赖于OnLoad的IsPostBack来分离所有不同的状态。这有点令人费解,但我想我这次正确的做法。