0

我有一个通过数据源填充的 ASP.NET 中继器。数据加载并完美呈现在屏幕上,但是在加载阶段通过代码访问该转发器中的任何数据行的所有尝试均不成功。一旦转发器在屏幕上呈现,我就可以在表单提交上完美地访问所有内容,但是在我尝试过的每个与负载相关的事件(Load、Init、PreRender、DataBind 等)中,它都显示为空。是否有必要以编程方式在代码后面而不是 ASPX 标记中填充转发器,以便在加载阶段访问这些数据,或者我只是做错了什么?

ASPX 片段:

<div runat="server" id="rpt3" style="display: block;">
<p class="approvalHeaderText">
Rejected Items</p>
<asp:Repeater ID="RptRejected" runat="server" DataSourceID="SQL_EmployeeGetRejectedEdits">
<ItemTemplate>
<tr class="gridToggleWhite gridVisible" id="<%# Eval("RecID") %>_cont">
<td>
<%# Eval("OrderID")%>
</td>

代码片段背后的代码 - 在几个事件中尝试过(假设所有变量都已声明):

For i = 0 To RptRejected.Items.Count - 1
'Obtain current week's Expenses
curExpVal = RptRejected.Items(i).FindControl("ExpensePay")
If Not IsNothing(curExpVal) Then
If curExpVal.Text = "" Then
insertExp = 0
Else
insertExp = CSng(curExpVal.Text)
End If
Else
insertExp = 0
End If
Next
4

3 回答 3

1

您可以使用该ItemDataBound事件(并且您不需要循环):

Sub rpt3_ItemDataBound(Sender As Object, e As RepeaterItemEventArgs)
  If (e.Item.ItemType = ListItemType.Item) OrElse _
            (e.Item.ItemType = ListItemType.AlternatingItem) Then

    Dim curExpVal = e.Item.FindControl("ExpensePay")
    If Not IsNothing(curExpVal) Then
      If curExpVal.Text = "" Then
        insertExp = 0
      Else
        insertExp = CSng(curExpVal.Text)
      End If
    Else
      insertExp = 0
    End If
  End If

End Sub
于 2012-08-20T15:29:13.357 回答
0

R1_Load 和 R1_ItemDataBound 应该用于填充您的数据,而 R1_ItemCommand 应该用于处理按钮操作。

aspx

<asp:Repeater runat="server" ID="R1" OnItemCommand="R1_ItemCommand" OnItemDataBound="R1_ItemDataBound"
    OnLoad="R1_Load">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <asp:TextBox runat="server" ID="txt"></asp:TextBox><asp:Button runat="server" ID="btn"
                    Text="Add" CommandName="AddOne" />
            </td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table> </FooterTemplate>
</asp:Repeater>

aspx.cs

protected void R1_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var items = new List<int>();
        for (int i = 0; i < 5; i++)
        {
            items.Add(i);
        }
        R1.DataSource = items;
        R1.DataBind();
    }
}

protected void R1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var txt = e.Item.FindControl("txt") as TextBox;
        txt.Text = Convert.ToString(e.Item.DataItem);
    }
}

protected void R1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "AddOne")
    {
        var txt = e.Item.FindControl("txt") as TextBox;
        txt.Text = (Convert.ToInt32(txt.Text) + 1).ToString();
    }
}
于 2012-08-20T15:53:41.847 回答
0

我的主要错误是使用Eval()而不是DataBinder.Eval()方法。虽然屏幕上的结果相同,但Eval()不会触发 OnItemDataBound 事件。一旦我将标记切换到DataBinder.Eval(),一切就都到位了。谢谢大家,你的想法。

于 2012-08-22T17:30:16.567 回答