2011-10-31 10 views
6

से प्रोग्रामेटिक रूप से बल पूर्ण पोस्टबैक मेरे पास एक अपडेट पैनल में ग्रिड व्यू है। यह एक विरासत एएसपी है: ग्रिड व्यू, इसलिए इसमें थोड़ा "मुझे निर्यात करें" आइकन है जो बस यही करता है। यह एक एक्सएलएस फ़ाइल के साथ "निर्यात" क्लिक का जवाब देकर काम करता है। समस्या यह है कि यदि आप एक स्मार्ट पैनल के अंदर स्मार्ट ग्रिड व्यू डालते हैं, तो एएसपी.नेट सोचता है कि एक्सएलएस फ़ाइल पैनल में लिखी जानी चाहिए, जो स्पष्ट रूप से हम नहीं चाहते हैं। इसके लिए, मुझे हर बार एक पूर्ण पोस्ट-बैक चाहिए।अपडेटपेनल

  1. ASP.NET में 4 संस्करण से पहले:

    मेरे अद्यतन पैनल सभी प्रोग्राम के

    समाधान जो इस सटीक परिदृश्य (जिनमें से कई इतने पर कहीं और कवर कर रहे हैं) में काम नहीं करते उत्पन्न कर रहे हैं , यदि आपने आईडी को नियंत्रण से छोड़ा है तो यह एक अपडेट पैनल के भीतर से भी एक पूर्ण पोस्टबैक करेगा। मेरा सवाल केवल नवीनतम और महानतम .NET 4 के लिए है।

  2. ScriptManager.RegisterPostBackControl आशाजनक लग रहा है। यह नियंत्रण पोस्ट-बैक को ईवेंट पैनल के रूप में सही पैनल आईडी का उपयोग करता है, लेकिन अन्यथा मदद नहीं करता है।

  3. अद्यतन पैनल में पोस्टबैक ट्रिगर जोड़ना। मेरे अपडेट पैनल प्रोग्रामेटिक रूप से जेनरेट किए जाते हैं, और एमएस यह बताता है कि यह समर्थित नहीं है। मेरे परीक्षण इंगित करते हैं कि वे सही हैं: मैंने इसे हर तरह से करने की कोशिश की, लेकिन यह काम नहीं करता है।

  4. मुझे स्मार्ट ग्रिड व्यू के विचार से खुद को तोड़ने का विचार पसंद नहीं है, लेकिन मैंने इन परिस्थितियों में अद्यतन पैनेल के बाहर एक अतिरिक्त नियंत्रण डालने की कोशिश की। पैनल के अंदर उस बटन पर क्लिक को अनुकरण करने के लिए पैनल के अंदर मेरे निर्यात बटन पर क्लाइंट-साइड क्लिक करने का विचार क्लाइंट जावास्क्रिप्ट द्वारा रीडायरेक्ट किया जाना चाहिए। हालांकि यह काम नहीं करता है क्योंकि मैं स्पष्ट रूप से पृष्ठ पर "बाहरी" नियंत्रण नहीं जोड़ सकता - मुझे लगता है कि "नियंत्रण संग्रह को डेटाबिंड, इनिट, लोड, प्रीरेंडर या अनलोड लोड चरणों के दौरान संशोधित नहीं किया जा सकता है।" त्रुटि।

  5. पैनल के बाहर "निर्यात" नियंत्रण को स्थानांतरित करने के लिए jQuery का उपयोग करना। एमएस में नियंत्रण की कुछ सूची होनी चाहिए जो उन्हें लगता है कि पैनल में "इन" हैं, और डीओएम के भीतर भौतिक स्थान कोई फर्क नहीं पड़ता।

क्या किसी के पास कोई काम है कि यह काम कैसे करें? मुझे पता है कि इस में काम करना चाहिए, लेकिन यह वही बात नहीं है।

उत्तर

4

मेरे लिए, समाधान 3 काम करता है।

मैं पृष्ठ पर UpdatePanel गतिशील रूप से जोड़ता हूं, सामग्री टेम्पलेट में Button जोड़ता हूं और PostBackTrigger जोड़ता हूं। मैंने Click इवेंट हैंडलर जोड़ा जिसमें मैं वर्तमान दिनांक/समय के साथ एक लेबल (UpdatePanel के बाहर) अपडेट करता हूं।

नीचे मेरा परीक्षण सेटअप देखें।

मार्कअप

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:Panel ID="Panel1" runat="server"></asp:Panel> 
<asp:Label ID="Label1" runat="server"></asp:Label> 

कोड के पीछे

protected void Page_Load(object sender, EventArgs e) 
{ 
    string buttonId = "Button1"; 

    UpdatePanel updatePanel = new UpdatePanel(); 
    updatePanel.ID = "UpdatePanel1"; 

    Button button = new Button(); 
    button.ID = "Button1"; 
    button.Text = "Post back"; 
    button.Click += new EventHandler(button_Click); 

    updatePanel.Triggers.Add(new PostBackTrigger() { ControlID = buttonId}); 

    updatePanel.ContentTemplateContainer.Controls.Add(button); 

    Panel1.Controls.Add(updatePanel); 
} 

void button_Click(object sender, EventArgs e) 
{ 
    Label1.Text = string.Format("Current date/time: {0}", DateTime.Now.ToString()); 
} 

आशा इस मदद करता है।

+0

यह मेरे लिए इस तरह से काम नहीं करता है। यदि मैं पैनल बनाते समय "पोस्टबैक ट्रिगर" जोड़ता हूं, तो यह विफल हो जाता है कि बटन.आईडी पहले से मौजूद नहीं है (उचित), लेकिन अगर मैं इसे अपने कस्टम नियंत्रण में जोड़ता हूं तो इसका कोई प्रभाव नहीं पड़ता है - कुछ जीवन चक्र की बात बताता है । मैं इसे छूंगा। – philw

+0

अगर मैं उस नियंत्रण में ऑनइनिट() पर बटन नियंत्रण बटन डालता हूं जिसमें अद्यतन पैनल होते हैं, जो सुझाए गए अनुसार काम करता है। यदि इसके बजाय मैंने इसे रखा जहां मुझे इसकी आवश्यकता है, पैनल के अंदर कस्टम नियंत्रण के ऑनइनिट() में (अद्यतन पैनल ढूंढने के लिए नियंत्रण पदानुक्रम का बैक अप खोजना), तो यह काम नहीं करता है। अधिक प्रयोग .. – philw

+0

यह सुनिश्चित नहीं है कि इससे मदद मिलेगी, लेकिन इस प्रश्न को चेकआउट करें (विशेष रूप से उत्तर): [FilePiewel में FormView में फ़ाइल अपलोड करें] (http://stackoverflow.com/questions/3555917/fileupload-in-formview-inside -an-updatepanel) – jdavies

0

मैंने सीएसवी निर्यात करने की क्षमता के साथ एक समान विरासत ग्रिड व्यू नियंत्रण बनाया। जिस तरह से मैंने इसे संभाला है, निर्यात बटन को एक विशेष रूप से तैयार किए गए क्वेरीस्ट्रिंग पैरामीटर "?SortablePagableGridViewExportToCSV=XXX" के साथ वर्तमान पृष्ठ पर एक सरल <a href> बनाना है जहां XXX मेरे नियंत्रण के UniqueID है। मैं अपने नियंत्रण की रेंडर विधि को ओवरराइड करता हूं, और वहां मैं अनुरोध पैरामीटर मैन्युअल रूप से जांचता हूं कि यह निर्यात पैराम भेजा गया था या नहीं। यदि ऐसा है, तो मैं नीचे के रूप में सीएसवी सामग्री प्रकार शीर्षलेख और प्रतिक्रिया लिखते हैं।

Me.Page.Response.Clear() 
Me.Page.Response.ClearContent() 
Me.Page.Response.ClearHeaders() 
Me.Page.Response.ContentType = "text/csv" 
Me.Page.Response.AddHeader("Content-Disposition", "attachment;filename=" & Me.ExportToCsvFileName) 
Me.Page.Response.End() 

कुंजी Page.Response.End() पर कॉल है, जो सभी आगे की प्रक्रिया को रोकता है। यह एक जीईटी अनुरोध है इसलिए मुझे अपडेटपेनल एसिंच पोस्टबैक या उसके जैसा कुछ भी चिंता करने की ज़रूरत नहीं है। ब्राउज़र इस स्थिति में खूबसूरती से व्यवहार करता है, डाउनलोड लिंक पॉप अप करता है लेकिन उपयोगकर्ता को वर्तमान पृष्ठ पर रखता है। ब्राउजर यूआरएल नहीं बदलता है, और उपयोगकर्ता डाउनलोड लिंक पर राइट-क्लिक भी कर सकता है और यदि चाहें तो सेव टार्गेट का उपयोग करें।

+0

आपको निश्चित रूप से "प्रतिक्रिया" सामग्री की आवश्यकता है, लेकिन मेरा प्रश्न थोड़ा और विशिष्ट है। समस्या यह है कि एमएस कोड जो उनके अद्यतन पैनल "snaffles" डाउनलोड फ़ाइल से संबंधित है। एक अपडेट पैनल के बाहर यह वर्णन करता है जैसा कि आप वर्णन करते हैं, लेकिन अंदर नहीं। – philw

+0

@philw, क्या आपने इस तकनीक को स्वयं की कोशिश की है? यह मेरे लिए .NET 4.0 का उपयोग कर UpdatePanel के भीतर से काम कर रहा है। इस मामले में UpdatePanel को कोई फर्क नहीं पड़ता क्योंकि यह बिल्कुल पोस्ट नहीं कर रहा है, बल्कि सामान्य जीईटी अनुरोध कर रहा है, जो कि किसी भी अपडेटपेनल AJAX कोड से फंस नहीं जाता है। –

+0

प्रतिक्रिया सामग्री, ज़ाहिर है - आपको सामग्री की लंबाई भी जोड़नी होगी या आपको कोई प्रगति संकेतक नहीं मिलेगा। मुझे लगता है (स्मृति से) मैं वास्तव में याद नहीं कर सकता कि हमने समस्या को कैसे ठीक किया! – philw

3

मुझे एहसास है कि यह एक साल पहले पूछा गया था, लेकिन अगर यह किसी और की मदद करता है, तो समाधान 2 मेरे लिए काम करता है।

((ScriptManager)this.Page.Master.FindControl("scrptmgr")).RegisterPostBackControl(lnkbtn); 

एक ही रास्ता मैं यह काम करने के लिए प्राप्त कर सकते हैं नियंत्रण (इस मामले lnkbtn में) दिखाई दे रहा है जब कोड के ऊपर लाइन चलाता है।

संपादित - अधिक परीक्षण के बाद यह अब लगता है कि इस विधि केवल काम करता है अगर वहाँ एक पूर्ण पोस्टबैक करने के लिए नियंत्रण दर्ज की है और वास्तव में बात यह है कि क्लिक करने के बीच में कोई Postbacks हैं। समाधान या हैक प्रत्येक पृष्ठ लोड पर पूर्ण पोस्टबैक करने के लिए नियंत्रण पंजीकृत करना है।

+0

दिलचस्प - मैंने इसके चारों ओर एक और तरीके से काम किया (कैसे याद नहीं कर सकता)। "पोस्टबैक" चेतावनी हो सकती है कि यह मेरे लिए क्यों काम नहीं करता है। – philw

+0

मेरी शाम को बचाया। मेरे मामले में, मेरे पास अपना स्वयं का कार्यक्रम था जो केवल मुख्य नियंत्रण से बंधे थे जिसमें अपडेटपैनल था। पेज के ऑनइनिट में मेरा कोड: एलेजेन सिलेक्टर। चयन चेंज + = एलेजेन सिलेक्टर_SelectionChanged; ((स्क्रिप्ट मैनेजर) यह। पेज.मास्टर.फिंडकंट्रोल ("स्क्रिप्ट मैनेजर"))। रजिस्टरपोस्टबैक कंट्रोल (एलेजेन सिलेक्टर); – Tillito

0

यदि पेज पोस्टबैक को मजबूर करना चाहिए (एक बटन मानें) को नियंत्रित करने के लिए - एक ग्रिड व्यू टेम्पलेटफील्ड है, तो आपको UpdatePanel ट्रिगर के लिए नियंत्रण आईडी स्थापित करने में कुछ समस्याएं हो सकती हैं ... इस मामले में आप बस टेम्प्लेटफील्ड बटन पर जाएं और अपनी "पोस्टबैक यूआरएल" संपत्ति को ... उसी पृष्ठ पर ही सेट करें!

इस तरह, इसे क्लिक करने पर, यह एक पूर्ण पोस्टबैक को मजबूर करेगा ...

संबंधित मुद्दे