पुनरावर्तक शीर्ष लेख या पाद लेख में नियंत्रण कैसे प्राप्त करें


120

मैं सोच रहा था कि एक Asp.Net पुनरावर्तक नियंत्रण के हेडरटेम्पलेट या FooterTemplate में नियंत्रण कैसे मिलेगा।

मैं उन्हें ItemDataBound घटना पर एक्सेस कर सकता हूं, लेकिन मैं सोच रहा था कि उन्हें कैसे प्राप्त किया जा सकता है (उदाहरण के लिए हेडर / पाद लेख में इनपुट का मान प्राप्त करने के लिए)।

नोट: मैंने इस प्रश्न को यहां उत्तर खोजने के बाद पोस्ट किया ताकि मुझे यह याद रहे (और शायद अन्य लोगों को यह उपयोगी लगे)।

जवाबों:


174

जैसा कि टिप्पणियों में कहा गया है, यह केवल आपके द्वारा किए गए डेटा के बाद आपके पुनरावर्तक के लिए काम करता है।

हेडर में एक नियंत्रण खोजने के लिए :

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

बस एक छोटा सा नोट - आपको अपने पाद उदाहरण में Control [0] में "c" को कैपिटल करने की आवश्यकता है।
माइक कोल

8
इस जवाब से मेरी आँखें दुखती हैं।
लॉयड पावेल

10
यह बहुत अच्छा काम करता है। सिर्फ एक नोट - यह केवल आपके काम के बाद आपके रिपीटर को डिटैबाउंड करने का काम करता है।
आरोन

2
यह ऐसा करने के लिए इतना बदसूरत तरीका है ... लेकिन यह मेरे लिए काम करता है। बहुत बहुत शुक्रिया यार! यदि संभव हो तो मैं आपको +1 से अधिक दे दूंगा।
Cruril

अच्छा, यह एक रनिंग कोड है ..
मोहम्मद जांगेसर अंसारी

53

बेहतर समाधान

आप आइटम में आइटम प्रकार जाँच कर सकते हैं:

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
आपने विशेष रूप से कहा गया कि आइटमडाउबाउंड, यह आइटम क्रिएट किया गया है, अपवोट।
रॉबर्टो अलर्कन

3
सहमत, बेहतर समाधान। बस नियंत्रण के लिए एक संदर्भ सहेजें।
स्प्रिंटस्टार

1
इसे करने का यह एक बेहतर तरीका है।
टॉमस बीबर

5

आप ItemCreated ईवेंट पर नियंत्रण पर एक संदर्भ ले सकते हैं, और फिर बाद में इसका उपयोग कर सकते हैं।


13
आपने बस पूछा कि आप इसे बाद में कैसे एक्सेस करेंगे, जवाब पास्कल ने उस बिंदु पर एक संदर्भ सेट करने के लिए दिया जो बाद में उपयोग करने के लिए पूरी तरह से मान्य है।
कासाकू

4

पुनरावर्तक (हेडर, आइटम, पाद) में नियंत्रण प्राप्त करें

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

नियंत्रण को ढूँढता और रखता है। (पियरे के वीबी उत्तर पर आधारित)


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");
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.