質問

以下のリピーターがあり、コードビハインドでlblAを見つけようとして失敗しました。マークアップの下には、私が行った試みがあります:

<asp:Repeater ID="rptDetails" runat="server">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><strong>A:</strong></td>
            <td><asp:Label ID="lblA" runat="server"></asp:Label>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>
</table>

最初に試しました

Label lblA = (Label)rptDetails.FindControl("lblA");

しかし、lblAはヌルでした

その後、試しました

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");

ただし、mリピーターに1つのアイテムテンプレートが含まれていても、アイテムは0でした

役に立ちましたか?

解決

属性 OnItemDataBound =&quot; myFunction&quot;

を設定する必要があります

そして、コード内で次のことを行います

void myFunction(object sender, RepeaterItemEventArgs e)
{
   Label lblA = (Label)e.Item.FindControl("lblA");
}

偶然にも、ネストされたリピーターに対してこのまったく同じアプローチを使用できます。 IE:

<asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction">
<ItemTemplate>
   <asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction">
   <ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate>
   </asp:Repeater>
</ItemTemplate>
</asp:Repeater>

そして、あなたのコードで:

void outerFunction(object sender, RepeaterItemEventArgs e)
{
   Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
   innerRepeater.DataSource = ... // Some data source
   innerRepeater.DataBind();
}
void innerFunction(object sender, RepeaterItemEventArgs e)
{
   Label myLabel = (Label)e.Item.FindControl("myLabel");
}

あまりにも頻繁に、内側のリピーターでアイテムを手作業でバインドしている人を見かけますが、自分で物を作るのがどれほど難しいか気づいていません。

他のヒント

同じ問題が発生しました。

アイテムのループ中に、アイテムタイプがありません。リピーターの最初のアイテムは header であり、ヘッダーには探しているasp要素がありません。

これを試してください:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}

VB.netのコード

    Protected Sub rptDetails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptDetails.ItemDataBound    
      If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
        Dim lblA As Label = CType(e.Item.FindControl("lblA"), Label)
        lblA.Text = "Found it!"
      End If
    End Sub

最初にバインドする必要があります。
例)

rptDetails.DataSource = dataSet.Tables["Order"];

rptDetails.DataBind();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top