リピーターのヘッダーまたはフッターでコントロールを見つける方法


120

Asp.Net RepeaterコントロールのHeaderTemplateまたはFooterTemplateでコントロールがどのように見つかるか疑問に思いました。

私はItemDataBoundイベントでそれらにアクセスできますが、それらを取得する方法(たとえば、ヘッダー/フッターの入力の値を取得するため)を考えていました。

注:答えを見つけた後で、この質問をここに投稿しました。覚えているだけです(そして、おそらく他の人が役立つと思うかもしれません)。

回答:


174

コメントで述べたように、これはリピーターをDataBoundした後でのみ機能します。

ヘッダーでコントロールを見つけるには:

lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");

フッターでコントロールを見つけるには:

lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");

拡張メソッドあり

public static class RepeaterExtensionMethods
{
    public static Control FindControlInHeader(this Repeater repeater, string controlName)
    {
        return repeater.Controls[0].Controls[0].FindControl(controlName);
    }

    public static Control FindControlInFooter(this Repeater repeater, string controlName)
    {
        return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
    }
}

ほんの少しの注意書き-フッターの例でControls [0]の「c」を大文字にする必要があります。
Mike Cole

8
この答えは私の目を傷つけます。
ロイドパウエル

10
これはうまくいきます。ただ1つのメモ-これは、リピーターにデータバインドした後でのみ機能します。
アーロン

2
これはこれを行うには醜い方法です...しかし、それは私にとってはうまくいきます。本当にありがとう!できれば+1以上を差し上げます。
Cruril 2013年

良い、これは実行中のコード..です
ムハンマド・Jahangeerアンサリ

53

より良いソリューション

アイテムタイプは、ItemCreatedイベントで確認できます。

protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) {
    if (e.Item.ItemType == ListItemType.Footer) {
        e.Item.FindControl(ctrl);
    }
    if (e.Item.ItemType == ListItemType.Header) {
        e.Item.FindControl(ctrl);
    }
}

4
具体的にはItemDataBoundと言いました。これはItemCreatedです。賛成票です。
Roberto Alarcon、2011

3
同意された、はるかに優れたソリューション。コントロールへの参照を保存するだけです。
Sprintstar

1
これは、はるかに良い方法です。
Tomas Beblar 2015

5

ItemCreatedイベントのコントロールの参照を取得して、後でそれを使用できます。


13
あとでどのようにアクセスするかを単に尋ねただけですが、パスカルがその時点で参照を設定して後で使用することについて回答は完全に有効です。
かさく2009

4

Repeaterへのコントロールの検索(ヘッダー、アイテム、フッター)

public static class FindControlInRepeater
{
    public static Control FindControl(this Repeater repeater, string controlName)
    {
        for (int i = 0; i < repeater.Controls.Count; i++)
            if (repeater.Controls[i].Controls[0].FindControl(controlName) != null)
                return repeater.Controls[i].Controls[0].FindControl(controlName);
        return null;
    }
}

2

これはVB.NETにあり、必要に応じてC#に変換するだけです。

<Extension()>
Public Function FindControlInRepeaterHeader(Of T As Control)(obj As Repeater, ControlName As String) As T
    Dim ctrl As T = TryCast((From item As RepeaterItem In obj.Controls
                   Where item.ItemType = ListItemType.Header).SingleOrDefault.FindControl(ControlName),T)
    Return ctrl
End Function

そしてそれを簡単に使用してください:

Dim txt as string = rptrComentarios.FindControlInRepeaterHeader(Of Label)("lblVerTodosComentarios").Text

フッターとアイテムコントロールも機能するようにしてください=)


2

これを行うための最善かつクリーンな方法は、Item_Createdイベント内にあります。

 protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e)
        {
            switch (e.Item.ItemType)
            {
                case ListItemType.AlternatingItem:
                    break;
                case ListItemType.EditItem:
                    break;
                case ListItemType.Footer:
                    e.Item.FindControl(ctrl);
                    break;
                case ListItemType.Header:
                    break;
                case ListItemType.Item:
                    break;
                case ListItemType.Pager:
                    break;
                case ListItemType.SelectedItem:
                    break;
                case ListItemType.Separator:
                    break;
                default:
                    break;
            }
    }

0
private T GetHeaderControl<T>(Repeater rp, string id) where T : Control
{
    T returnValue = null;
    if (rp != null && !String.IsNullOrWhiteSpace(id))
    {
        returnValue = rp.Controls.Cast<RepeaterItem>().Where(i => i.ItemType == ListItemType.Header).Select(h => h.FindControl(id) as T).Where(c => c != null).FirstOrDefault();
    }
    return returnValue;
}

コントロールを見つけてキャストします。(PiyeyのVB回答に基づく)


0

ItemDataBoundの場合

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)//header
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
    else if (e.Item.ItemType == ListItemType.Footer)//footer
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.