2010-08-20 13 views
10

मेरे एएसपी.नेट फॉर्म में पोस्टबैक (एक बटन पर क्लिक करें) के बाद डेटालिस्ट का एएसपी.NET/DataItem शून्य है, मेरे फॉर्म का सभी डेटाटाइम शून्य है। क्यूं कर? पोस्टबैक के बाद भी डेटालिस्ट की सामग्री को पुनर्प्राप्त करने के लिए मुझे क्या करना चाहिए?पोस्टबैक

protected void buttonAddRecord_Click(object sender, EventArgs e) 
    { 
     foreach (DataListItem item in listFields.Items) 
     { 
      // item.DataItem == null WTF? 
     } 
    } 

protected void Page_Load(object sender, EventArgs e) 
    { 
     BindFields(); 
    } 

private void BindFields() 
    { 
     object setting = MySettings.GetSetting(); 

     if (!Null.IsNull(setting)) 
     { 
      listFields.DataSource =  
       DataProvider.GetData(int.Parse(setting.ToString())); 
      listFields.DataBind(); 
     } 

     listFields.Visible = listFields.Items.Count > 0; 
     emptyMessage.Visible = listFields.Items.Count == 0; 
    } 

उत्तर

8

मेरा उत्तर here मिला।

जॉन ने क्या कहा, डाटा स्रोत आइटम डाटाबेस के समय केवल उपलब्ध हैं। वे अब प्रारंभिक लोडिंग के बाद पहुंच योग्य नहीं हैं।

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

दरअसल, मैं पोस्ट में एक आईडी स्टोर करने के लिए एक HiddenField का इस्तेमाल किया और मैं इसके बजाय यह DataItem (जो डेटा बाइंडिंग घटना बाहर नहीं किया जा सकता है) के रूप में प्राप्त करने की कोशिश की डेटाबेस से डेटा का अनुरोध करें।

HiddenField नियंत्रण कि सर्वर से पोस्ट में कायम होने की जरूरत है एक मूल्य दुकान में प्रयोग किया जाता है।

+0

ठीक है मुझे कोई अन्य विकल्प नहीं दिख रहा है। और यह अब तक बहुत अच्छी तरह से काम कर रहा है। – asmo

+0

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

+0

यह आवश्यकतानुसार दो बार डेटाबेस कॉल करने के लिए एक अच्छा तरीका लगता है। लगता है कि डेटालिस्ट के पास एक खराब मॉडल हो सकता है। – NetMage

1

जांचें कि क्या आप वास्तव में डेटाबैंड() प्रत्येक पोस्टबैक के बाद डेटालिस्ट को जांचते हैं। आम तौर पर जब आप उन्हें फिर से बाध्य नहीं करते हैं तो पोस्टबैक के बाद आपको डेटालिस्ट, ग्रिड व्यू, ड्रॉपडाउनलिस्ट (और अन्य नियंत्रण) खाली हो जाते हैं।

+1

संकेत के लिए धन्यवाद, लेकिन मैं वास्तव में पोस्टबैक पर भी डेटालिस्ट को पुनर्विचार करता हूं। मैंने डीबगर में भी जांच की, और डेटासोर्स पोस्टबैक पर बाध्य हो गया। – asmo

7

DataItem डाटाबेसिंग के दौरान ही उपलब्ध है।

LoadClick से पहले आता है ताकि आप वैसे भी अपना डेटा ओवरराइट कर रहे हों।

यह करें:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindFields(); 
    } 
} 

आप DataBinding और अद्यतन/सम्मिलित को संभालने के लिए एक डेटास्रोत (ObjectDataSource) की तरह उपयोग करना चाहिए।

अपडेट/सलाह:

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

+0

मैं पहले से ही डेटालिस्ट का उपयोग कर रहा हूं (शीर्षक देखें)। और मुझे प्लेसहोल्डर का उपयोग करने के लिए मजबूर होना पड़ता है क्योंकि मैं पहले से नहीं जानता कि प्रत्येक फ़ील्ड का नियंत्रण प्रकार क्या होगा। दरअसल, मेरे डेटालिस्ट के प्रत्येक डेटालिस्ट इटैम में एक प्लेसहोल्डर नियंत्रण होता है जो डेटा बाध्यकारी पर निर्धारित किया जाएगा। – asmo

+0

तो आप उन प्लेसहोल्डर्स में क्या डाल रहे हैं? – Jeroen

+0

प्रत्येक प्लेसहोल्डर में एक नियंत्रण होता है, जैसे टेक्स्टबॉक्स, चेकबॉक्स, रेडियोबटन सूची, ड्रॉपडाउनलिस्ट, आदि। मैं गतिशील होने के बाद से सटीक नियंत्रण प्रकार नहीं जान सकता। प्रत्येक प्लेसहोल्डर एक फॉर्म में एक फ़ील्ड का प्रतिनिधित्व करता है, उदाहरण के लिए, नाम, पता, ईमेल, पसंदीदा भोजन इत्यादि। – asmo