2009-08-04 12 views
47

मुझे लगता है कि सर्कल में चारों ओर दौड़ रहा है और पिछले घंटों में ऐसा कर रहा है।डेटा GridView में सूची कैसे बाध्य करें?

मैं तारों की एक सरणी से डेटाग्रिडव्यू पॉप्युलेट करना चाहता हूं। मैंने इसे सीधे संभव नहीं पढ़ा है, और मुझे एक कस्टम प्रकार बनाने की ज़रूरत है जो स्ट्रिंग को सार्वजनिक संपत्ति के रूप में रखती है।

public class FileName 
    { 
     private string _value; 

     public FileName(string pValue) 
     { 
      _value = pValue; 
     } 

     public string Value 
     { 
      get 
      { 
       return _value; 
      } 
      set { _value = value; } 
     } 
    } 

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

इसके अलावा मेरे पास यह विधि है, BindGrid() जिसे मैं डेटाग्रिडव्यू भरना चाहता हूं। संदेश यह है:

private void BindGrid() 
    { 
     gvFilesOnServer.AutoGenerateColumns = false; 

     //create the column programatically 
     DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn(); 
     DataGridViewCell cell = new DataGridViewTextBoxCell(); 
     colFileName.CellTemplate = cell; colFileName.Name = "Value"; 
     colFileName.HeaderText = "File Name"; 
     colFileName.ValueType = typeof(FileName); 

     //add the column to the datagridview 
     gvFilesOnServer.Columns.Add(colFileName); 

     //fill the string array 
     string[] filelist = GetFileListOnWebServer(); 

     //try making a List<FileName> from that array 
     List<FileName> filenamesList = new List<FileName>(filelist.Length); 
     for (int i = 0; i < filelist.Length; i++) 
     { 
      filenamesList.Add(new FileName(filelist[i].ToString())); 
     } 

     //try making a bindingsource 
     BindingSource bs = new BindingSource(); 
     bs.DataSource = typeof(FileName); 
     foreach (FileName fn in filenamesList) 
     { 
      bs.Add(fn); 
     } 
     gvFilesOnServer.DataSource = bs; 
    } 

अंत में, समस्या: स्ट्रिंग सरणी ठीक भरता है, सूची ठीक बनाई गई है, लेकिन मैं DataGridView में एक खाली कॉलम मिलता है। मैंने datasource = सूची <> सीधे = bindingsource की बजाय, अभी भी कुछ भी नहीं करने की कोशिश की।

मैं वास्तव में एक सलाह की सराहना करता हूं, यह मुझे पागल कर रहा है।

धन्यवाद

+0

ध्यान देने योग्य एक बात, केवल आपके सार्वजनिक क्षेत्र में उन सार्वजनिक फ़ील्ड जो गुण हैं, वे ग्रिड में प्रस्तुत करेंगे।दूसरे शब्दों में, उन्हें {प्राप्त करना होगा; सेट; } परिभाषित किया गया है या उन्हें अनदेखा कर दिया जाएगा। – Shane

उत्तर

69

एक BindingList का प्रयोग करें और स्तंभ के DataPropertyName -Property निर्धारित किया है।

निम्नलिखित का प्रयास करें:

... 
private void BindGrid() 
{ 
    gvFilesOnServer.AutoGenerateColumns = false; 

    //create the column programatically 
    DataGridViewCell cell = new DataGridViewTextBoxCell(); 
    DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn() 
    { 
     CellTemplate = cell, 
     Name = "Value", 
     HeaderText = "File Name", 
     DataPropertyName = "Value" // Tell the column which property of FileName it should use 
    }; 

    gvFilesOnServer.Columns.Add(colFileName); 

    var filelist = GetFileListOnWebServer().ToList(); 
    var filenamesList = new BindingList<FileName>(filelist); // <-- BindingList 

    //Bind BindingList directly to the DataGrid, no need of BindingSource 
    gvFilesOnServer.DataSource = filenamesList 
} 
+1

डिक्सन ने मुझे बचा लिया है; यह काम किया। मैं कॉलम के "DataPropertyName" को कैसे नहीं देख सकता? मुझे इतना आसान बात पूछने में बुरा लगता है, मुझे इसे देखना चाहिए था। मेरे पास अभी भी एकमात्र प्रश्न है जब मुझे वास्तव में बाध्यकारी स्रोत का उपयोग करना चाहिए, क्योंकि चीजें इसके बिना काम करने लगती हैं; लेकिन अभ्यास के साथ, समय पर मुझे पता चल जाएगा। –

+2

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

+1

चीयर्स दोस्तों, यह वही था जो मैं आज के लिए देख रहा था। शायद मुझे चारों ओर गड़बड़ करने का एक घंटे बचाया। धन्यवाद! –

10

थोड़ा देर से लेकिन उपयोगी भविष्य के लिए हो सकता है: इस समस्या को आप यहां पा सकते हैं के बारे में

DataTable dt = new DataTable(); 
dt.Columns.Add("My first column Name"); 

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

myDataGridView.DataSource = dt; 

अधिक। यदि आप सेल और शीर्ष पाठ और सेल मूल्य के साथ ही चिंता का कस्टम गुण सेट करने के लिए की आवश्यकता नहीं है तो इस कोड को आप

public class FileName 
{   
    [DisplayName("File Name")] 
    public string FileName {get;set;} 
    [DisplayName("Value")] 
    public string Value {get;set;} 
} 

में मदद मिलेगी और फिर आप

private void BindGrid() 
{ 
    var filelist = GetFileListOnWebServer().ToList();  
    gvFilesOnServer.DataSource = filelist.ToArray(); 
} 

के रूप में डेटा स्रोत के रूप में सूची बाध्य कर सकते हैं अधिक जानकारी के लिए आप इस पृष्ठ पर जा सकते हैं Bind List of Class objects as Datasource to DataGridView

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

+1

आपका लिंक मर चुका है। क्या आप एक और स्रोत प्रदान कर सकते हैं? – Scorpion

+1

आप 'filelist.ToArray()' कॉल क्यों करेंगे और एक नई सरणी आवंटित करने के ऊपरी हिस्से को? मेरा मानना ​​है कि 'gvFilesOnServer.DataSource = filelist; 'पर्याप्त होगा। किसी सूची पर 'टोएरे()' को कॉल करना अनियंत्रित ओवरहेड जैसा लगता है। –

1

डेटाटेबल का उपयोग उपयोगकर्ता 927524 के रूप में मान्य है। आप मैन्युअल रूप से पंक्तियों को जोड़ने, जो एक विशिष्ट रैपिंग वर्ग को जोड़ने के लिए की जरूरत नहीं होगी द्वारा यह कर सकते हैं:

List<string> filenamesList = ...; 
foreach(string filename in filenamesList) 
     gvFilesOnServer.Rows.Add(new object[]{filename}); 

किसी भी मामले में, धन्यवाद इस अजीब व्यवहार समाशोधन के लिए user927524 !!

6

मुझे पता है कि यह पुराना है, लेकिन यह मुझे थोड़ी देर के लिए लटका दिया। आपकी सूची में ऑब्जेक्ट के गुण वास्तविक "गुण" होना चाहिए, न कि केवल सार्वजनिक सदस्य।

public class FileName 
{   
    public string ThisFieldWorks {get;set;} 
    public string ThisFieldDoesNot; 
} 
+0

आपने मुझे बस डिबगिंग के घंटे बचाए हैं। धन्यवाद! –

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