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

私の主な間違いは、 DataBinder.Eval()メソッドの代わりにEval()を使用することでした。画面上での結果は同じですが、Eval()はOnItemDataBoundイベントをトリップしません。マークアップをDataBinder.Eval()に切り替えると、すべてが適切に機能しました。皆さん、アイデアをありがとう。

于 2012-08-22T17:30:16.567 に答える