2008-10-20 11 views
9

नामवैल्यू संग्रह को ग्रिड व्यू में बाध्य करने के लिए मुझे किस प्रकार का संग्रह उपयोग करना चाहिए? जब सीधे काम करना यह काम नहीं करता था।बाइंड नाम ValueCollection से GridView?

aspx

<asp:GridView ID="resultGV" runat="server" AutoGenerateColumns="False" Width="100%"> 
    <Columns> 
     <asp:BoundField DataField="Key" HeaderText="Key" /> 
     <asp:BoundField DataField="Value" HeaderText="Value" /> 
    </Columns> 
</asp:GridView> 

कोई टिप बहुत स्वागत में aspx.cs

private void BindList(NameValueCollection nvpList) 
    { 
    resultGV.DataSource = list; 
    resultGV.DataBind(); 
    } 

कोड में कोड। धन्यवाद। एक्स

उत्तर

8

क्या आप नाम < स्ट्रिंग का उपयोग कर सकते हैं, स्ट्रिंग > NameValueCollection के बजाय। चूंकि शब्दकोश < टी, T > लागू करता IEnumerable आप इतनी के रूप में LINQ इस्तेमाल कर सकते हैं:

resultGV.DataSource = from item in nvpDictionary 
         select new { Key = item.Key, Value = item.Value }; 
resultGV.DataBind(); 

[संपादित करें] वास्तव में आप सीधे रूप में शब्दकोश का उपयोग करने में सक्षम हो सकता है:

resultGV.DataSource = nvpDictionary; 
resultGV.DataBind(); 

यदि यह नक्शा नहीं है जिस तरह से आप चाहते हैं कुंजी/मूल्य हमेशा आप LINQ पर वापस जा सकते हैं। LINQ आपको जो भी चाहें फ़ील्ड का नाम बदलने की अनुमति देगा।

[संपादित करें] यदि आप < टी, टी > का उपयोग करने के लिए नहीं बदल सकते हैं, तो विधि में एक शब्दकोश के रूप में NameValueCollection की एक प्रति बनाएं और इसे बाध्य करें।

private void BindList(NameValueCollection nvpList) 
{ 
    Dictionary<string,string> temp = new Dictionary<string,string>(); 
    foreach (string key in nvpList) 
    { 
     temp.Add(key,nvpList[key]); 
    } 

    resultGV.DataSource = temp; 
    resultGV.DataBind(); 
} 

आप इस एक बहुत करते हैं, आप एक शब्दकोश में बदलने के लिए एक विस्तार विधि लिखते हैं, और यह इतना इस्तेमाल कर सकते हैं।

public static class NameValueCollectionExtensions 
{ 
    public static Dictionary<string,string> ToDictionary(this NameValueCollection collection) 
    { 
     Dictionary<string,string> temp = new Dictionary<string,string>(); 
     foreach (string key in collection) 
     { 
      temp.Add(key,collection[key]); 
     } 
     return temp; 
    } 
} 

private void BindList(NameValueCollection nvpList) 
{ 
    resultGV.DataSource = nvpList.ToDictionary(); 
    resultGV.DataBind(); 
} 
+0

मैं इसे एक्सचेंज ऑब्जेक्ट के रूप में शब्दकोश में नहीं बदल सकता और मैं अभी भी नेट 2.0 का उपयोग कर रहा हूं। लेकिन फिर भी धन्यवाद। हर राय मदद करता है। –

+0

ध्यान रखें कि नाम ValueCollection में डुप्लिकेट कुंजी हो सकती है, जबकि शब्दकोश नहीं है। तो आप एक शब्दकोश में कनवर्ट करते समय परेशानी/खोने की जानकारी में भाग सकते हैं। – magnattic

2

अंत में मैंने आपके विस्तार कार्यान्वयन में सुझाए गए समाधान का उपयोग किया, लेकिन विस्तार के बिना ही।

private void BindList(NvpList nvpList) 
    { 
    IDictionary dict = new Dictionary<string, string>(); 

    foreach (String s in nvpList.AllKeys) 
     dict.Add(s, nvpList[s]); 

    resultGV.DataSource = dict; 
    resultGV.DataBind(); 
    } 

शायद कुछ सहायक वर्ग करें जो स्थैतिक होंगे और कई लोगों के बजाय एक स्थान पर मेरे लिए अनुवाद करें। यह एक्सटेंशन काफी आसान है ... :-)

धन्यवाद। एक्स

6

यह थोड़ा मुश्किल है, क्योंकि enumerator केवल कुंजी देता है। आप एक नेस्टेड Repeater है, तो

<asp:GridView id="gv" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:TemplateField HeaderText="Key"> 
     <ItemTemplate><%# Container.DataItem %></ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Value"> 
     <ItemTemplate> 
      <%# ((NameValueCollection)gv.DataSource)[(string)Container.DataItem] %> 
     </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+0

यदि आप नेस्टेड डेटाबाउंड रिपेटर-जैसे नियंत्रण को NameValueCollection के साथ उपयोग कर रहे हैं तो आवश्यक परिवर्तन के लिए मेरा उत्तर देखें –

1

(भी या GridView, मुझे यकीन है), तो आप: लेकिन, आप Container.DataItem साथ कुंजी मूल्य प्राप्त कर सकते हैं, और उसके बाद मान प्राप्त करने के NameValueCollection में ऊपर देखो इस तरह दिखने के लिए Mark Brackett's answer को बदलने की आवश्यकता है, अन्यथा आपको rpt के नाम से नियंत्रण प्राप्त करने में सक्षम नहीं होने के बारे में एक रन-टाइम त्रुटि मिलेगी।

<asp:Repeater ID="rpt" runat="server"> 
<ItemTemplate> 
    <li> 
     <%# Container.DataItem %>: 
     <%# ((NameValueCollection)((Repeater)Container.Parent).DataSource)[(string)Container.DataItem] %> 
    </li>  
</ItemTemplate> 
</asp:Repeater> 
1

मैं यह सबसे अच्छा लगता है databinding & तक पहुँचने कुंजी & मूल्य के लिए एक StringDictionary उपयोग करने के लिए

Dim sDict as New StringDictionary 
sDict.Add("1","data1") 
sDict.Add("2","data2") 
sDict.Add("3","data3") 
... 

CheckBoxList1.DataSource = sDict 
CheckBoxList1.DataValueField = "key" 
CheckBoxList1.DataTextField = "value" 
CheckBoxList1.DataBind() 
0

मैं एक ऐसी ही समस्या एक GridView करने के लिए एक शब्दकोश बाध्यकारी (SortedDictionary वास्तव में) को शामिल करने और नाम बदलने के लिए इच्छुक था कॉलम। मेरे लिए काम करना समाप्त हो गया कुछ चीज पढ़ने के लिए थोड़ा आसान है।

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False"> 
    <Columns> 
    <asp:TemplateField HeaderText="Attribute"> 
     <ItemTemplate> 
     <%# ((KeyValuePair<string,string>)Container.DataItem).Key %> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Value"> 
     <ItemTemplate> 
     <%# ((KeyValuePair<string,string>)Container.DataItem).Value %> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

यह Container.DataItem, वर्तमान आइटम GridView प्रदर्शित करने के लिए कोशिश कर रहा है ले रही है, उसमें यह मजबूर कर काम करता है वास्तविक डेटा प्रकार (KeyValuePair) और फिर उस आइटम के वांछित संपत्ति प्रदर्शित है।

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