วิธีค้นหาตัวควบคุมในส่วนหัวหรือส่วนท้ายของตัวทำซ้ำ


120

ฉันสงสัยว่าจะพบตัวควบคุมใน HeaderTemplate หรือ FooterTemplate ของตัวควบคุม Asp.Net Repeater ได้อย่างไร

ฉันสามารถเข้าถึงได้ในเหตุการณ์ ItemDataBound แต่ฉันสงสัยว่าจะได้รับอย่างไรหลังจากนั้น (ตัวอย่างเช่นการดึงค่าของอินพุตในส่วนหัว / ส่วนท้าย)

หมายเหตุ: ฉันโพสต์คำถามนี้ที่นี่หลังจากพบคำตอบเพื่อให้ฉันจำได้ (และคนอื่นอาจคิดว่าสิ่งนี้มีประโยชน์)

คำตอบ:


175

ตามที่ระบุไว้ในความคิดเห็นสิ่งนี้ใช้ได้เฉพาะหลังจากที่คุณ 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);
    }
}

เป็นเพียงบันทึกเล็ก ๆ น้อย ๆ - คุณต้องใช้ตัวพิมพ์ใหญ่ "c" ใน Controls [0] ในตัวอย่างส่วนท้ายของคุณ
Mike Cole

8
คำตอบนี้เจ็บตา
Lloyd Powell

10
ใช้งานได้ดี เพียงบันทึกเดียว - ใช้งานได้เฉพาะหลังจากที่คุณมีฐานข้อมูลทวนสัญญาณของคุณ
Aaron

2
นี่เป็นวิธีที่น่าเกลียดในการทำเช่นนี้ ... แต่ได้ผลสำหรับฉัน ขอบคุณมาก! ฉันจะให้คุณมากกว่า +1 ถ้าเป็นไปได้
Cruril

ดีนี่คือรหัสที่กำลังดำเนินอยู่ ..
Mohammad Jahangeer Ansari

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, upvote
Roberto Alarcon

3
เห็นด้วยทางออกที่ดีกว่ามาก เพียงบันทึกการอ้างอิงไปยังตัวควบคุม
Sprintstar

1
วิธีนี้เป็นวิธีที่ดีกว่ามาก
Tomas Beblar

5

คุณสามารถใช้การอ้างอิงเกี่ยวกับการควบคุมในเหตุการณ์ ItemCreated แล้วใช้ในภายหลัง


13
คุณเพียงแค่ถามว่าคุณจะเข้าถึงได้อย่างไรในภายหลังคำตอบที่ปาสคาลให้ไว้สำหรับการตั้งค่าการอ้างอิง ณ จุดนั้นเพื่อใช้ในภายหลังนั้นถูกต้องสมบูรณ์
Kasaku

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 Event:

 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;
}

ค้นหาและส่งการควบคุม (ตามคำตอบ VB ของ Piyey)


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.