2009-02-11 14 views
10

असल में, मैं अपनी वस्तु वापस चाहता हूं ...मेरी ग्रिड व्यू पंक्तियों से एक वस्तु वापस प्राप्त करना

मेरे पास एक ईमेल ऑब्जेक्ट है।

public class Email{ 
    public string emailAddress; 
    public bool primary; 
    public int contactPoint; 
    public int databasePrimaryKey; 

    public Email(){} 
} 

मेरे उपयोगकर्ता नियंत्रण में, मैं ईमेल ऑब्जेक्ट्स की एक सूची।

public List<Email> EmailCollection; 

और मैं इसे अपने उपयोगकर्ता नियंत्रण के अंदर एक ग्रिड व्यू में बाध्य कर रहा हूं।

if(this.EmailCollection.Count > 0){ 
    this.GridView1.DataSource = EmailCollection; 
    this.GridView1.DataBind(); 
} 

यह वास्तव में भयानक हो सकता है, अगर मैं एक ईमेल वस्तु वापस बाहर GridView की बाद में मिल सकता है।

कैसे मैं ऐसा क्यों करें?

मैं भी केवल GridView को ईमेल ऑब्जेक्ट के गुणों में से कुछ के रूप में अच्छी बाइंडिंग कर रहा हूँ और वे मद टेम्पलेट्स में डाल रहे हैं।

<Columns> 

<asp:TemplateField HeaderText="Email Address"> 
    <ItemTemplate> 
     <asp:TextBox ID="TextBox1" runat="server" Text=<%# Eval("EmailAddress") %> Width=250px /> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Primary"> 
    <ItemTemplate> 
     <asp:CheckBox runat="server" Checked=<%# Eval("PrimaryEmail") %> /> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Contact Point"> 
    <ItemTemplate> 
     <CRM:QualDropDown runat="server" Type=ContactPoint InitialValue=<%# Eval("ContactPoint") %> /> 
    </ItemTemplate> 
</asp:TemplateField> 

</Columns> 

क्या GridView भी ऐसा कर सकता है? क्या मुझे अपनी खुद की चीज रोल करने की ज़रूरत है? यह वास्तव में अच्छा होगा अगर यह मेरे लिए ऐसा करेगा।


अधिक विस्तृत करने के लिए।

मैं viewstate में सूची संकलन को सहेजा जा रहा हूँ।

जो मैं अंततः प्राप्त करने की कोशिश कर रहा हूं, वहां नियंत्रण में कहीं सेव बटन होगा, जब ईवेंट आग लगती है तो मैं ग्रिड व्यू में एक डाटरो से एक ईमेल ऑब्जेक्ट बनाना चाहता हूं जो तुलना करने के लिए मेरी मूल सूची संग्रह। फिर यदि कोई परिवर्तन है, तो मैं डेटाबेस में उस पंक्ति को अपडेट करूंगा। मैं सोच रहा था कि अगर मैं एक सूची संग्रह को ग्रिड व्यू में डाल सकता हूं, तो शायद मैं इसे वापस प्राप्त कर सकता हूं।

शायद मैं अपने ईमेल वस्तु जो एक DataRow लेता है के लिए एक नया निर्माता बनाने के? लेकिन फिर वहाँ जटिलताओं का एक बहुत है कि उस में चला जाता है ...

उत्तर

3

ठीक है, मैंने अपनी सूची ईमेल चयन के माध्यम से लूपिंग समाप्त कर दी, जिसे व्यूस्टेट में सहेजा गया था।

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

ग्रिड व्यूरो पर मुझे एक ग्रिड व्यू 1 का उपयोग करना होगा। पंक्तियां [i] .ल्स [जे] .इंडकंट्रोल ("myControl1") तब से उचित मूल्य प्राप्त करें, चाहे वह एक चेक बॉक्स, टेक्स्ट बॉक्स या ड्रॉप हो सूची।

मुझे लगता है कि एक GridViewRow ऑब्जेक्ट में DataItem प्रॉपर्टी है, जिसमें मेरा ईमेल ऑब्जेक्ट है, लेकिन यह केवल रोबाउंड चरण के दौरान उपलब्ध है।

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

protected void SaveButton_OnClick(object sender, EventArgs e){ 
    for (int i = 0; i < this.EmailCollection.Count; i++) 
    { 
     Email email = this.EmailCollection[i]; 
     GridViewRow row = this.GridView1.Rows[i]; 

     string gv_emailAddress = ((TextBox)row.Cells[0].FindControl("EmailAddress")).Text; 
     if (email.EmailAddress != gv_emailAddress) 
     { 
      email.EmailAddress = gv_emailAddress; 
      email.Updated = true; 
     } 
     ... 
    } 
} 

मैं अभी भी अधिक कुशल समाधान के लिए खुला हूं।

5

ASP.NET Databinding ऑब्जेक्ट हेरफेर के मामले में एक-तरफ़ा आपरेशन है। हालांकि, डेटा स्रोत संपत्ति प्रतिक्रिया भर में अपनी EmailCollection के लिए एक संदर्भ में शामिल होंगे:

EmailCollection col = (EmailCollection)this.GridView1.DataSource; 

लेकिन मुझे लगता है कि क्या आप वास्तव में चाहते हैं एक नियंत्रण है कि उपयोगकर्ता इनपुट के आधार पर अपने EmailCollection manipulates है और में इसे पुनः प्राप्त अगला अनुरोध। यहां तक ​​कि वेबफॉर्म भी नकली नकली कर सकते हैं कि बॉक्स से बाहर की स्थिति।

0

आप इस इसके लिए सबसे आसान viewstate उपयोग करने के लिए की तरह एक वस्तु पर धारण करने के लिए, यद्यपि आप डेटा प्रतिलिपि बनाएंगे लेकिन एक छोटी सी वस्तु के लिए यह ठीक किया जाना चाहिए चाहते हैं।

ViewState.Add("EmailObj", Email); 

EMail email = (Email)ViewState["EmailObj"]; 
0

बस एक विचार, मूल रूप से एक रोल अपनी खुद की नहीं है, लेकिन ऐसा करने के लिए मुश्किल: सूची है कि आप viewstate या सत्र में एक डेटा स्रोत के रूप में उपयोग

स्टोर, और है एक छिपी हुई फ़ील्ड gridview में पंक्ति से मेल खाने वाली वस्तु के लिए अनुक्रमणिका या कुंजी हो।

दूसरे शब्दों में, ग्रिडव्यू में प्रत्येक पंक्ति "जानता है" सूची में कौन सी ईमेल ऑब्जेक्ट पर आधारित है।

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