2012-12-26 10 views
7

छवि मैं निम्नलिखित वर्गों है किDataGridView - उपयोग DataPropertyName चाइल्ड तत्व संपत्ति को दिखाने के लिए

public class Master 
{ 
    public string MasterName = "Something"; 

    public List<Detail> details = new List<Detail>(); 
} 

public class Detail 
{ 
    public string Foo = "Test"; 
} 

और फिर मैं एक DataGridView में विवरण वस्तुओं के संग्रह को दिखाने के लिए,

DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); 
column.DataPropertyName = "Details.Foo"; 
column.HeaderText = "Foo header"; 

dgv.Columns.Add(column); 
नीचे कोड का उपयोग कर चाहते चलें

कॉलम ग्रिड में दिखाया गया है, लेकिन मूल्य के बिना

+0

क्या आपको यकीन है DataPropertyName तुम क्या चाहते है? ऐसा लगता है कि आप मूल्य की रेखाओं के साथ कुछ और ढूंढ रहे हैं। मुझे संदेह है कि आप एएसपी.Net के साथ काम नहीं कर रहे हैं, जो मैं सबसे ज्यादा परिचित हूं, लेकिन मैं डेटाग्रिड व्यूटेक्स्टबॉक्स कॉलम के अन्य गुणों की जांच करता हूं ताकि यह देखने के लिए कि वहां कुछ और है जो आपको चाहिए जो आपको चाहिए। – Melanie

+0

@ मेलानी मैं विंडोज़ फॉर्म का उपयोग कर रहा हूं।मैं अन्य गुणों में एक नज़र डालेंगे – Andrey

+0

इसके अलावा, जब मैं किसी अन्य ऑब्जेक्ट की संपत्ति का उपयोग करता हूं तो ठीक है, जैसे: DataPropertyName = "MasterName" – Andrey

उत्तर

2

उदाहरण के लिए आप इकाई बच्चे में ToString विधि ओवरराइड कर सकते हैं आप इस

स्रोत कर सकते हैं:

public class FormulariosENT { 

    #region PROPERTIES 

    public int IdFromulario { get; set; } 
    public string DescripcionFormulario { get; set; } 

    #endregion 

    #region PUBLIC METHODS 
    public override string ToString() { 

     return DescripcionFormulario; 
    } 

और बाद में इकाई के बच्चे के नाम को बांधें।

+1

ईएफ जेनरेट क्लास के बारे में क्या? मैं उन्हें – Andiana

+0

संशोधित नहीं कर सकता हूं, फिर मैं डेटाग्रिड द्वारा DescripcionFormulario संपादन योग्य कैसे बना सकता हूं? – miguelmpn

0

आपका डेटासॉर कहां है? आपको स्रोत का नेतृत्व करना होगा। कि यह मिल जाएगा।

  1. :

    List<Detail> list = new List<Detail>(); 
    for (int i = 0; i < 10; i++) 
    { 
        Detail d = new Detail(); 
        d.Foo = "test"; 
        list.Add(d); 
    } 
    
    this.dgv.DataSource = list; 
    this.dgv.Columns[0].Visible = false; 
    DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn(); 
    dgvc.HeaderText = "列标题"; 
    dgvc.DataPropertyName = "foo"; 
    this.dgv.Columns.Add(dgvc); 
    
  2. :

    public class Detail 
    { 
        private string foo; 
    
        public string Foo 
        { 
         get { return foo; } 
         set { foo = value; } 
        } 
    } 
    
+0

उप-प्रकार के लिए इसे कैसे प्राप्त करें? – miguelmpn

4

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

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; 
} 

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

आप (यानी DataPropertyName = "MyProp1.MyProp2.MyProp3" उपयोग करते हुए) आप इस

private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewColumn column = Grid.Columns[e.ColumnIndex]; 
    if (column.DataPropertyName.Contains(".")) 
    { 
     object data = Grid.Rows[e.RowIndex].DataBoundItem; 
     string[] properties = column.DataPropertyName.Split('.'); 
     for (int i = 0; i < properties.Length && data != null; i++) 
      data = data.GetType().GetProperty(properties[i]).GetValue(data); 
     Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = data; 
    } 
} 
+1

अच्छा विचार, और शायद तेज़। एमएसडीएन चेतावनी देता है कि इस समारोह को अक्सर कहा जाएगा और लंबी प्रक्रिया से बचा जाना चाहिए। इसलिए दो सुधार: (1) पैरामीटर ई के माध्यम से अनुरोध किए गए सेल को केवल प्रारूपित करें। फ़ंक्शन को प्रत्येक सेल स्वरूपित करने के लिए एक बार बुलाया जाएगा। (2) कॉलम के लिए तारों का उपयोग करने के बजाय, सेल तक पहुंचने के लिए e.ColumnIndex का उपयोग करें –

5

के लिए आभारी होगी:

उस संपत्ति को मास्क करें जिसे आप बचपन से प्राप्त करना चाहते हैं [ब्राउज़ करने योग्य (झूठा)] ताकि यह डेटाग्रिड में दिखाई न दे। फिर अपने वर्ग है कि बच्चे वस्तु जो केवल एक "प्राप्त" विधि childproperty मूल्य दिखा है रखती है में एक नई प्रॉपर्टी बनाकर: उदाहरण के लिए:

[Browsable(false)] //Because we use the CreatorUsernameProperty to do this. 
public virtual User Creator { get; set; } 

[DisplayName("Creator")] //shows like this in the grid 
public string CreatorUsername => Creator?.Username; 
1

उपयोग कर सकते हैं बस यह करने के अधिक सामान्य होने की जरूरत है, तो मैं किसी भी राय ;-)

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