DataGridView नियंत्रण के लिए एक सूची <string> को कैसे बाँधें?


84

मेरे पास एक सरल है List<string>और मैं चाहूंगा कि इसे एक DataGridViewकॉलम में प्रदर्शित किया जाए ।
यदि सूची में अधिक जटिल ऑब्जेक्ट होंगे, तो बस अपनी DataSourceसंपत्ति के मूल्य के रूप में सूची स्थापित करेगा ।

लेकिन ऐसा करते समय:

myDataGridView.DataSource = myStringList;

मुझे एक स्तंभ कहा जाता है Lengthऔर तार की लंबाई प्रदर्शित की जाती है।

कॉलम में सूची से वास्तविक स्ट्रिंग मान कैसे प्रदर्शित करें?

जवाबों:


70

Thats क्योंकि DataGridView ऑब्जेक्ट्स के गुणों की तलाश करता है। स्ट्रिंग के लिए सिर्फ एक संपत्ति है - लंबाई। तो, आपको इस तरह से एक स्ट्रिंग के लिए एक आवरण की आवश्यकता है

public class StringValue
{
    public StringValue(string s)
    {
        _value = s;
    }
    public string Value { get { return _value; } set { _value = value; } }
    string _value;
}

फिर List<StringValue>अपने ग्रिड पर ऑब्जेक्ट को बांधें । यह काम करता हैं


3
DataPropertyNameस्तंभ का होना चाहिएValue
Rémi

ग्रुपिंग के बारे में क्या? अब "ए" "ए" के बराबर नहीं है और मेरे दो समूह "ए" हैं।
रोवर

97

इसे इस्तेमाल करे:

IList<String> list_string= new List<String>();
DataGridView.DataSource = list_string.Select(x => new { Value = x }).ToList();
dgvSelectedNode.Show();

आशा है कि ये आपकी मदद करेगा।


13
यदि आप IList के बजाय एक सूची का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं List.ConvertAll(x => new { Value = x});
स्कूटी.नेट

7
यह काम करता है लेकिन list_string में परिवर्तन करने से DataGridView अपडेट नहीं होगा।
पेड्रो77

ग्रिड को अपडेट करने के लिए फिर से लाइनक स्टेटमेंट चलाने की आवश्यकता होती है।
जेफ

1
dgvSelectedNode.Show () क्या है?
डुआन वॉकर

18

जब तक आप IEnumerable <string> को लागू करते हैं, तब तक निम्नलिखित कार्य करना चाहिए। यह उस स्ट्रिंग ऑब्जेक्ट के प्रॉपर्टी पाथ के बजाय सीधे स्ट्रिंग को स्ट्रिंग से बाइंड करेगा।

<sdk:DataGridTextColumn Binding="{Binding}" />

मैंने इस सक्सेशन का परीक्षण किया है और इसने सही काम किया है। यह अन्य समाधानों की तुलना में क्लीनर है।
गुस्तावो कार्डसो

7
क्या यह सिल्वरलाइट के लिए विशिष्ट है?
NoviceProgrammer

2
यह WPF में भी काम करता है .. आप एक गलत टिप्पणी को क्यों बढ़ाएंगे?
बोपिटी बोप

4
डाउनवोटिंग क्योंकि मूल प्रश्न में "डेटाग्रिडव्यू" टैग है, जो कि विनफॉर्म कंट्रोल है। यह समाधान winfroms पर लागू नहीं होता है।
तुलना

13

आप यहाँ वर्णित के रूप में बहुत कम कोड के साथ एक ही परिणाम प्राप्त करने के लिए linq और अनाम प्रकारों का उपयोग कर सकते हैं

अद्यतन: ब्लॉग नीचे है, यहाँ सामग्री है:

.. ऑब्जेक्ट (पहली संपत्ति जो इसे मिल सकती है)। एक उदाहरण के रूप में स्ट्रिंग वर्ग को जिस संपत्ति से बांधता है वह स्ट्रिंग है। गति। चूंकि कोई अन्य संपत्ति नहीं है जो वास्तविक स्ट्रिंग प्रदान करेगी।

इसका मतलब है कि हमारे बाध्यकारी अधिकार पाने के लिए हमें एक रैपर ऑब्जेक्ट की आवश्यकता है जो एक संपत्ति के रूप में एक स्ट्रिंग के वास्तविक मूल्य को उजागर करेगा:

public class StringWrapper
    {
     string stringValue;
     public string StringValue { get { return stringValue; } set { stringValue = value; } }

     public StringWrapper(string s)
     {
     StringValue = s;
     }
  }   

   List<StringWrapper> testData = new List<StringWrapper>();

   // add data to the list / convert list of strings to list of string wrappers

  Table1.SetDataBinding(testdata);

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

हम LINQ और अनाम प्रकारों का उपयोग करके इस समाधान में सुधार कर सकते हैं- हम स्ट्रिंग रैपरों की नई सूची बनाने के लिए LINQ क्वेरी का उपयोग करेंगे (स्ट्रिंग रैपर हमारे मामले में एक अनाम प्रकार होगा)।

 var values = from data in testData select new { Value = data };

 Table1.SetDataBinding(values.ToList());

अंतिम बदलाव जो हम करने जा रहे हैं, वह LINQ कोड को एक्सटेंशन विधि में ले जाना है:

public static class StringExtensions
  {
     public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
     {
     var values = from data in strings
     select new { Value = data };

     return values.ToList();
     }

इस तरह हम किसी भी संग्रह के तार पर एकल विधि कहकर कोड का पुन: उपयोग कर सकते हैं:

Table1.SetDataBinding(testData.CreateStringWrapperForBinding());

8

यह सामान्य समस्या है, DataTable ऑब्जेक्ट का उपयोग करने का एक और तरीका है

DataTable dt = new DataTable();
dt.Columns.Add("column name");

dt.Rows.Add(new object[] { "Item 1" });
dt.Rows.Add(new object[] { "Item 2" });
dt.Rows.Add(new object[] { "Item 3" });

इस समस्या का यहाँ विस्तार से वर्णन किया गया है: http://www.psworld.pl/Programming/BindingListOfString


2
लेकिन डिटैचेबल भारी है कि लिस्ट <T>, और अधिकांश डेवलपर्स डेटेबल के उपयोग से बचेंगे।
मुसीरो 31

2

LINQ के द्वारा वास्तव में बड़ी सूचियों को असाइन करने पर आप प्रदर्शन समस्याओं में भाग सकते हैं। निम्नलिखित समाधान बड़ी सूचियों के लिए उपयुक्त है और स्ट्रिंग को बिना सबस्क्राइब किए:

DataGridView (यहां "देखें") को वर्चुअल मोड पर सेट करें, अपनी आवश्यकता के लिए कॉलम बनाएं और घटना के लिए ओवरराइड करें / रजिस्टर करें।

private void View_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    // Optionally: check for column index if you got more columns
    e.Value = View.Rows[e.RowIndex].DataBoundItem.ToString();
}

तब आप बस अपनी सूची को DataGridView को सौंप सकते हैं:

List<String> MyList = ...
View.DataSource = MyList;

2

इसे इस्तेमाल करे :

//i have a 
List<string> g_list = new List<string>();

//i put manually the values... (for this example)
g_list.Add("aaa");
g_list.Add("bbb");
g_list.Add("ccc");

//for each string add a row in dataGridView and put the l_str value...
foreach (string l_str in g_list)
{
    dataGridView1.Rows.Add(l_str);
}

1
आपको एहसास है कि यह सवाल 6 साल पुराना है और सही उत्तर दिया गया है?
होजिकमारु

2
आपको पहले
डेटाग्रिड

0

एक वैकल्पिक हेल्पर फ़ंक्शन का उपयोग करना है जो सूची से मान लेगा और निम्नानुसार डेटाग्रिड्यू में अपडेट करेगा:

    private void DisplayStringListInDataGrid(List<string> passedList, ref DataGridView gridToUpdate, string newColumnHeader)
    {
        DataTable gridData = new DataTable();
        gridData.Columns.Add(newColumnHeader);

        foreach (string listItem in passedList)
        {
            gridData.Rows.Add(listItem);
        }

        BindingSource gridDataBinder = new BindingSource();
        gridDataBinder.DataSource = gridData;
        dgDataBeingProcessed.DataSource = gridDataBinder;
    }

तब हम इस फ़ंक्शन को निम्न तरीके से कॉल कर सकते हैं:

    DisplayStringListInDataGrid(<nameOfListWithStrings>, ref <nameOfDataGridViewToDisplay>, <nameToBeGivenForTheNewColumn>);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.