2010-02-08 13 views
7

मेरे पास डेटाग्रिड व्यू नियंत्रण है और मैं इसे डेटा के साथ पॉप्युलेट करना चाहता हूं।DataGridViewColumn.DataPropertyName प्रॉपर्टी

मैं डेटास्रोत संपत्ति

// dgvDealAsset is DataGridView 
     private void DealAssetListControl_Load(object sender, EventArgs e) 
     { 
      dgvDealAssets.AutoGenerateColumns = false; 
      dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList(); 
} 

अब समस्या नंबर एक का उपयोग करें। मेरे संग्रह की कक्षा में केवल सरल प्रकार नहीं हैं जिन्हें मैं DataPropertyName का उपयोग करके कॉलम पर मैप कर सकता हूं। यह वह वर्ग है जो संग्रह में निहित है।

class MyClass 
{ 
    public String Name; 
    MyOtherClass otherclass; 
} 

class MyOtherClass 
{ 
public String Name; 
} 

अब मैं कॉलम

col1.DataPropertyName = "Name" // Ok 
col2.DataPropertyName = "otherclass" // Not OK - I will have empty cell 

को MyClass के गुणों बाध्यकारी हूँ समस्या यह है कि मैं otherclass.Name क्षेत्र प्रदर्शित करना चाहते हैं। लेकिन अगर मैं

col2.DataPropertyName = "otherclass.Name" 

लिखने का प्रयास करता हूं तो मुझे खाली सेल मिलता है।

मैं मैन्युअल स्तंभ

private void DealAssetListControl_Load(object sender, EventArgs e) 
{ 
    dgvDealAssets.AutoGenerateColumns = false; 
    dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList(); 

// iterate through rows and set the column manually 
     foreach (DataGridViewRow row in dgvDealAssets.Rows) 
     { 
      row.Cells["Column2"].Value = ((DealAsset)row.DataBoundItem).otherclass.Name; 
     } 

सेट करने की कोशिश की लेकिन इस foreach चक्र (2k तत्वों) को पूरा करने के बारे में मिनट लगता है। इस समस्या को हल कैसे करें?

उत्तर

3

डेटाग्रिड व्यू बाल गुणों के लिए डाटाबेसिंग का समर्थन नहीं करता है। अधिक जानकारी के लिए, this post

मुझे समाधान पसंद है जो सेलफॉर्मेटिंग ईवेंट का उपयोग करता है।

2

समस्या nr.1: करने के लिए

कोशिश निम्नलिखित:

  1. वस्तु से MyOtherClass का विस्तार (इस कदम की जरूरत नहीं किया जा सकता है)

  2. और ओवरराइड, या बनाने , विधि ToString()।

ऐसा करना चाहिए।

+0

नहीं कर सकता। यह तृतीय-पक्ष लाइब्रेरी ऑब्जेक्ट है। MyOtherClass सील नहीं है –

+0

हैं तो यह प्रयास करें: वर्ग MyOtherClass2: MyOtherClass { सार्वजनिक स्ट्रिंग toString() { /* वापसी स्ट्रिंग यहाँ जो आप ग्रिड */ } में दिखाना चाहते हैं } – user218447

1

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

private void my_init_function() { 
     datagridview.VirtualMode = true; 
     datagridview.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(datagridview_CellValueNeeded); 
    } 

    private void datagridview_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) 
    { 
     e.Value = get_my_data(e.RowIndex, e.ColumnIndex); 
    } 
3

मामले में आप इस तरह कई बच्चे तत्वों का उपयोग करना चाहते हैं:

class MyClass 
{ 
    public int Id; 
    public MyOtherClass OtherClass; 
} 

class MyOtherClass 
{ 
    public string Name; 
    public int Number; 
} 

कैसे के बारे में

1 समाधान किसी घटना में प्रत्येक कक्ष के लिए सेट मूल्य (mabye अन्य एक है बेहतर), मैन्युअल रूप से, डेटासोर्स सेट करने के बाद, उदाहरण के लिए:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    MyClass data = dgv.Rows[ e.RowIndex ].DataBoundItem as MyClass; 

    dgv.Rows[ e.RowIndex ].Cells[ "colName" ].Value = data.OtherClass.Name; 
    dgv.Rows[ e.RowIndex ].Cells[ "colNumber" ].Value = data.OtherClass.Number; 
} 

दूसरा समाधान डेटा से डेटाटेबल बनाने और फिर इसे बांधने के बारे में क्या?

मैं किसी भी राय ;-)

+0

यह वह जगह है सही उत्तर! आपको बहुत - बहुत धन्यवाद! –

1

datagrid के डेटा स्रोत का एक बच्चा संपत्ति के लिए एक datagrid की एक विशिष्ट स्तंभ databinding DataGridView.Column.Tag संपत्ति का उपयोग कर रहा है, ToString() ओवरराइड विधि के अंदर के साथ साथ के रास्ते के लिए आभारी होगी बच्चे वस्तु। यह निम्नानुसार है:

public class Car 
{ 
    public int Id { get; set; } 

    public int Name { get; set; } 

    public string Colour { get; set; } 

    public Wheel Wheel { get; set; } 
} 

public class Wheel 
{ 
    public string WheelName { get; set; } 

    public override string ToString() 
    { 
     return WheelName; 
    } 
} 

public class Main 
{ 
    private void LoadGrid(List<Car> data) 
    { 
     this.dataGridView.Columns["Wheel"].Tag = "WheelName"; 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^