2008-11-10 16 views
6

पर एएसपी.NET पृष्ठ पर नहीं आग लगती है, मेरे पास एक LINQ क्वेरी के परिणामों के साथ एक ग्रिड व्यू पॉप्युलेट है। मैं कोड में डेटासोर्स सेट कर रहा हूं, फिर उस पर डेटाबिंड को कॉल कर रहा हूं। ग्रिड व्यू के रोडाटाबाउंड ईवेंट में, मैं क्वेरी परिणामों के आधार पर कुछ ग्रिड व्यू फ़ील्ड में लिंक छुपा रहा हूं। (उदाहरण के लिए, प्रश्न में पंक्ति के "अभिभावक दिखाएँ" लिंक को छिपाते हुए कोई मूल पंक्ति नहीं है।)ग्रिड व्यू रोडाटाबाउंड पोस्टबैक

यह प्रारंभ में ठीक काम करता है। लेकिन पोस्टबैक पर (जब मैं डेटाबैंड पर कॉल नहीं करता हूं, लेकिन ग्रिड व्यू व्यूस्टेट के माध्यम से पॉप्युलेट रहता है), डेटा प्रदर्शित करता है, लेकिन रोडाटाबाउंड ईवेंट (जाहिर है) आग नहीं आता है, और मेरे लिंक छिपे नहीं जाते हैं।

पोस्टबैक के बाद लिंक छिपाने का सबसे अच्छा तरीका क्या है?

+0

क्या आपके पास AJAX UpdatePanel के अंदर ग्रिड है? वह पोस्टबैक पकड़ सकता है। –

+0

नहीं, इस विशेष पृष्ठ पर कोई अपडेटपेनल्स नहीं। –

उत्तर

2

यहाँ कैसे मैं इस को हल करने समाप्त हो गया है:

  1. मैं केवल पढ़ने के लिए गुणों के साथ एक serializable श्रेणी का निर्माण: एक पंक्ति के पी, और प्रत्येक कड़ी के लिए एक बूलियन यह बताते हैं कि यह सक्षम है या नहीं। हम इसे LinkVisibility पर कॉल करेंगे।
  2. मैंने उपरोक्त वर्ग के उदाहरणों को पकड़ने के लिए कीडकोलेक्शन से विरासत में एक धारावाहिक वर्ग बनाया है।
  3. मैंने उस संग्रह के उदाहरण वाले एक व्यूस्टेट-समर्थित संपत्ति बनाई है।
  4. मेरी खोज प्रक्रिया में (ग्रिड व्यू को पॉप्युलेट करना), मैं संग्रह को साफ़ करता हूं।
  5. रोडाटाबाउंड में, जो प्रारंभ में लिंक दिखाता/छुपाता है, मैं प्रत्येक पंक्ति के संग्रह में LinkVisibility उदाहरण जोड़ता हूं।
  6. पेज में। लोड, जब IsPostBack सत्य है, तो मैं ग्रिड व्यू पंक्तियों के माध्यम से लूप करता हूं।मैं संग्रह में पीके द्वारा प्रत्येक के लिए LinkVisibility देखता हूं (डेटाकेनेम्स ग्रिड व्यू में सेट है), और मैंने तदनुसार लिंक सेट किए हैं।

मुझे नहीं पता कि यह करने का यह सबसे अच्छा तरीका है, लेकिन यह निश्चित रूप से काम करता है, जो मैंने कोशिश की है उससे कहीं ज्यादा कह सकता हूं।

0

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

शायद यह सवाल पूछने के लिए कि 'हटाए गए लिंक अभी भी व्यूस्टेट में क्यों दिखाई देते हैं?'।

1

1) आपके पास एक विधि - ProcessDataRows() हो सकती है जिसे एक बार grid_DataBound (...) पर कॉल किया जाएगा। और फिर जब आपको पोस्टबैक के बाद इसकी आवश्यकता होती है।

और जिस तरह से आप चाहें तो सभी पंक्तियों को संसाधित करते हैं।

2) आपके पास ShowParentLink() जैसी विधियां हो सकती हैं। तो ग्रिड में LinkButton करने के लिए बाध्य कर रहे हैं यही कारण है कि (यदि आप एक ItemTemplate का उपयोग कर रहे हैं) और लिंक

Visible='<%#ShowParentLink()%>' 
0

एक पृष्ठ है पोस्टबैक घटनाओं संसाधित नहीं कर सकता जब तक कि यह बिल्कुल पुनर्निर्माण किया गया है के रूप में यह पहले था होगा (पोस्टबैक)। यदि आप पृष्ठ-इनिट के दौरान अपने लिंक दोबारा छिपाते हैं, तो आपके क्लिक ईवेंट और इस तरह आग लगनी चाहिए। दुर्भाग्यवश, कुछ नमूना कोड देखे बिना मैं अधिक विशिष्ट नहीं हो सकता।

इसके अलावा डेटा RowDataBound आग नहीं है क्योंकि आप डेटा बाध्यकारी नहीं हैं। आप बेहतर शब्द की कमी के लिए व्यूस्टेट से पृष्ठ का पुनर्निर्माण कर रहे हैं- "दृश्यमान बाध्यकारी"।

0

एक और समाधान LINQ क्वेरी में तर्क डालना है, ताकि आप "शोपैंटलिंक" जैसे बूलियन LINQ फ़ील्ड के साथ समाप्त हो जाएं। फिर आप उस मूल्य पर हाइपरलिंक फ़ील्ड की दृश्यमान संपत्ति को बाध्य कर सकते हैं - कोई RowDataBound आवश्यक नहीं है।

0
void Process Rows() 
{ 
    ... do something 
    ... process complete 
    datagrid.DataBind(); 
} 
2

रोडाटाबाउंड घटना केवल तभी होती है जब ग्रिड व्यू का डेटा पोस्टबैक के दौरान बदल जाता है। घटना गति के लिए संक्षिप्त-सर्किट है इसलिए यह अनावश्यक रूप से सटीक डेटा को फिर से उत्पन्न नहीं कर रहा है। इसके बजाय एचटीएमएल में हेरफेर करने के लिए रोक्रेटेड इवेंट का उपयोग करें - डेटा बदल गया है या नहीं, इस पर ध्यान दिए बिना यह प्रत्येक पोस्टबैक पर आग लगती है।

0
protected void btnHazardRating_Click(object sender, EventArgs e) 
{ 
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound); 

    gvPanelRole.DataSource = dtGo; 
    gvPanelRole.DataBind(); 
    ModalPopup.Show(); 

} 
+0

एसओ पर आपका स्वागत है, यहां, यह समझाने का एक अच्छा अभ्यास है कि आपके समाधान का उपयोग क्यों करें और न कि कैसे। इससे आपका उत्तर अधिक मूल्यवान हो जाएगा और आप इसे कैसे करते हैं इसकी बेहतर समझ रखने के लिए आगे पाठक की सहायता करेंगे। मैं यह भी सुझाव देता हूं कि आप हमारे अक्सर पूछे जाने वाले प्रश्न देखें: http://stackoverflow.com/faq। – ForceMagic

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