2010-11-18 15 views
15

मुझे पता है कि इस सवाल से हजारों बार पूछा गया है, और मैंने इससे पहले संघर्ष किया है, लेकिन किसी कारण से, मैं जो हासिल करना चाहता हूं उसे पूरा नहीं कर सकता ... I एक गतिशील रूप से जोड़ा गया लिंकबटन है कि क्लिक किए जाने पर एक ही पैनल में गतिशील रूप से नियंत्रण (इस उदाहरण में, एक टेक्स्टबॉक्स) जोड़ देगा। लिंकबटन पर क्लिक किए जाने के साथ-साथ कई नियंत्रणों को लगातार जोड़ना है (यानी मैं इसे एक बार क्लिक करता हूं, एक बॉक्स, फिर दूसरा क्लिक मुझे 2 बॉक्स देगा, दूसरा क्लिक 3 जोड़ता है)। नीचे दिए गए कोड में, मैं प्रत्येक टेक्स्टबॉक्स नियंत्रण के लिए एक अद्वितीय आईडी बनाने के लिए वर्तमान दिनांक और समय क्रमबद्ध करता हूं।एएसपी.नेट गतिशील रूप से बनाए गए नियंत्रण और पोस्टबैक

जब मैं कोड निष्पादित करता हूं, तो "फ़िल्टर जोड़ें" पर क्लिक करने से एक नया टेक्स्टबॉक्स उत्पन्न होगा, लेकिन एक बार फिर से क्लिक किया जाएगा, एक नया बना देगा, और इससे पहले कि इसका निपटान होगा। इसके बजाय, मैं पिछले टेक्स्टबॉक्स के साथ-साथ इसके भीतर सबमिट किए गए किसी भी डेटा को जारी रखना चाहता हूं।

आपकी सहायता की सराहना की जाती है।

aspx में:

<asp:Panel ID="pnlFilter" runat="server"> 

</asp:Panel> 

aspx.cs में:

protected void Page_Init(object sender, EventArgs e) 
{ 
     LinkButton lb = new LinkButton(); 
     lb.ID = "lbAddFilter"; 
     pnlFilter.Controls.Add(lb); 
     lb.Text = "Add Filter"; 
     lb.Click += new EventHandler(lbAddFilter_Click); 
} 


void lbAddFilter_Click(object sender, EventArgs e) 
{ 
    TextBox tb = new TextBox(); 
    tb.ID = "tb" + DateTime.Now.ToBinary().ToString(); 
    pnlFilter.Controls.Add(tb); 
} 

उत्तर

16

किसी और के लिए ऐसा करने की कोशिश कर रहा है: नहीं। इसके बजाय, जानकारी के प्रवाह के बारे में सोचें और समझें कि ऐसा करने का एक बेहतर तरीका है। इनपुट नियंत्रण को गतिशील रूप से बनाए जाने की आवश्यकता नहीं है। वे स्थैतिक हो सकते हैं, और एक को भरने और सबमिट करने पर, उस जानकारी को कहीं जाना है (उदाहरण के लिए डेटाबेस, कैश, सत्र)। एक बार वहां, पोस्टबैक पर, अपनी पसंद के भंडारण में सभी वस्तुओं के माध्यम से लूप करें और उनके लिए एक डिस्प्ले बनाएं।

यही मैंने किया है और इसने जीवन को बहुत आसान बना दिया है। उम्मीद है कि यह किसी की मदद करता है।

+0

ऐसी स्थिति में आप क्या करेंगे जहां एक निश्चित आवेदन में प्रश्नावली (चुनाव) बनाए जाते हैं, और एक वेबसाइट सेवा प्रस्तुत की जाती है, वेबसाइट एक सर्वेक्षण लाती है और इसके लिए फ़ील्ड प्रस्तुत करती है? उस स्थिति में गतिशील रूप से सामग्री बनाने का एकमात्र उपयुक्त विकल्प नहीं है? – Sander

+0

हां, गतिशील रूप से सामग्री बनाने के क्रम में है, लेकिन यह बढ़ने की आवश्यकता नहीं है जैसा कि मैं करने की कोशिश कर रहा था; मुझे लगता है कि आपकी वेब सेवा हर बार सभी परिणाम लौटाती है, इस मामले में आपने हर बार उन सभी को प्रस्तुत किया था। व्यूस्टेट और कैशिंग के उपयोग के साथ, आपका प्रदर्शन बहुत अच्छा होना चाहिए। –

+1

आप एक प्रतिभाशाली हैं। मैं ओपी के रूप में एक ही चीज़ हासिल करने की कोशिश कर रहा था लेकिन इससे मुझे एहसास हुआ कि मैं कई नियंत्रण उदाहरण जोड़ने की बजाय, मैं सिर्फ एक मोडल विंडो में नया नियंत्रण दिखा सकता हूं और उसके मोडल में "सेव" पर, डेटा स्टोर पर प्रतिबद्ध हूं और फिर पेज पर बहुत आसानी से लोड करें। एक हज़ार धन्यवाद। मैंने 3 दिन बिताए हैं और आज रात सभी इसे समझने की कोशिश कर रहे हैं। –

0

कोशिश जोड़ने,

if(!Page.IsPostback) 
    --- your code that adds different controls. 
+0

मैंने पेज_इनिट के अंदर सबकुछ लपेट लिया है! IsPostBack अगर। ऐसा करने से लिंकबूटन और पृष्ठ की प्रारंभिक स्थिति लोड हो जाती है, लेकिन जब मैं उन लिंकबटन में से किसी एक पर क्लिक करता हूं, तो वे सभी गायब हो जाते हैं और पृष्ठ पर कुछ भी नहीं होता है। –

1

मुझे विश्वास है कि आप पर प्रत्येक नियंत्रण फिर से बनाने होंगे हर पोस्टबैक।

मुझे पता है कि पुनरावर्तक नियंत्रण अपने बच्चों के बारे में पर्याप्त जानकारी संग्रहीत करता है ताकि उन्हें डेटाबेस बनाया जा सके ... आप इसे थोड़ा सा काम बचाने के लिए उपयोग कर सकते हैं।

+0

आपको प्रत्येक पोस्टबैक पर उन्हें फिर से बनाना होगा सही है। कहीं आपको स्टोर करने की ज़रूरत है कि आपके पास कितने पहले से हैं। शायद व्यूस्टेट या कुछ में। – Remy

11
void lbAddFilter_Click(object sender, EventArgs e) 
{ 
    TextBox tb = new TextBox(); 
    tb.ID = "tb" + DateTime.Now.ToBinary().ToString(); 
    pnlFilter.Controls.Add(tb); 
} 

कि काम करने के लिए नहीं जा रहा है - यह रूप में आप अपने प्रश्न में लगाए गए अनुमान एक जीवन चक्र मुद्दा है। इसके साथ आप कई तरीकों से काम कर सकते हैं, लेकिन होनस वाग्नेर का सुझाव सबसे लचीला है।

यहां क्या हो रहा है यह है कि आप नियंत्रण कह रहे हैं। ईवेंट हैंडलर में जोड़ें और नियंत्रण सूची में नियंत्रण जोड़ा जा रहा है, और अगले अनुरोध पर (क्या यह आंशिक पोस्टबैक, पूर्ण पोस्टबैक, या नया पेज हिट हो), वह नियंत्रण चला गया है क्योंकि आपने इसे कहीं भी नहीं रखा है।

यहाँ अपने पृष्ठ घटना जीवन चक्र में अभी हो रहा है है:

  1. पृष्ठ OnInit कॉल करता है और कहते हैं आपके LinkButton
  2. उपयोगकर्ता LinkButton
  3. पृष्ठ पोस्टबैक अनुरोध शुरू करने के लिए OnInit कॉल क्लिक करता है।LinkButton निर्मित है
  4. ईवेंट हैंडलर कहा जाता है, जो गतिशील रूप से अपने पाठ बॉक्स बनाता है और नियंत्रण संग्रह
  5. उपयोगकर्ता फिर
  6. पृष्ठ LinkButton फिर से जोड़ने की OnInit कॉल LinkButton क्लिक करता है में शामिल करता है। PnlFilter.Controls संग्रह इस बिंदु पर खाली है, किसी भी तत्व को छोड़कर जिसे आपने अपने मार्कअप में स्थिर रूप से घोषित किया है।
  7. इवेंट हैंडलर कहा जाता है और नियंत्रण सूची में एक नया टेक्स्टबॉक्स जोड़ा जाता है।

मुझे यकीन है कि यह एक अच्छी आदत है नहीं कर रहा हूँ, लेकिन मैं एक मॉडल इस (ध्यान दें कि मैं इस कोड का परीक्षण नहीं किया है - यह समायोजन की आवश्यकता हो सकती) के लिए इसी तरह से सफलता मिली है:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    LinkButton lb = new LinkButton(); 
    lb.ID = "lbAddFilter"; 
    pnlFilter.Controls.Add(lb); 
    lb.Text = "Add Filter"; 
    lb.Click += new EventHandler(lbAddFilter_Click); 

    // regenerate dynamically created controls 
    foreach (var control in PersistedControls) 
    { 
     pnlFilter.Controls.Add(GenerateControl(control)); 
    } 
} 

private IList<Control> _persistedControls; 
private const string PersistedControlsSessionKey = "thispage_persistedcontrols"; 
private IList<Control> PersistedControls 
{ 
    if (_persistedControls == null) 
    { 
     if (Session[PersistedControlsSessionKey] == null) 
      Session[PersistedControlsSessionKey] = new List<Control>(); 
     _persistedControls = Session[PersistedControlsSessionKey] as IList<Control>; 
    } 
    return _persistedControls; 
}  

void lbAddFilter_Click(object sender, EventArgs e) 
{ 
    TextBox tb = new TextBox(); 
    tb.ID = "tb" + DateTime.Now.ToBinary().ToString(); 
    PersistedControls.Add(tb); 
    pnlFilter.Controls.Add(tb); 
} 

ध्यान दें कि मैं सत्र स्टोर में वास्तविक नियंत्रण वस्तुओं को जोड़ने के बारे में निश्चित नहीं हूं - मुझे विश्वास है कि नियंत्रण आईडी के साथ समस्याएं हैं जो पोस्टबैक पर त्रुटियों का कारण बनती हैं (शायद एक नियंत्रण क्रमिक नहीं है?)। मैंने जिस समाधान में विकसित किया, मैंने जेनरेट कंट्रोल विधि के समतुल्य में एक नया टेक्स्टबॉक्स/लेबल/कॉम्बोबॉक्स/आदि उत्पन्न किया, और पर्सिड कंट्रोल संग्रह में एक कस्टम कंटेनर क्लास संग्रहीत किया जिसमें यूआई नियंत्रण के विभिन्न गुण शामिल थे जिन्हें मुझे उत्पन्न करने की आवश्यकता होगी यह प्रत्येक पृष्ठ Init पर।

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