2012-12-26 14 views
7

benDataGridView - Kullanım DataPropertyName alt öğe özelliğini göstermek için

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

dgv.Columns.Add(column); 
aşağıdaki kodu kullanarak, bir DataGridView Ayrıntılar nesnelerin koleksiyonunu göstermek istiyorum

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

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

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

Ve sonra aşağıdaki sınıfları görüntü sağlar

kolon tablo içinde gösterilir, ancak değeri olmayan

+0

Emin misiniz DataPropertyName istediğiniz nedir? Değer çizgileri boyunca daha fazla bir şey aradığınız gibi görünüyor. En çok bildiğim ASP.Net ile çalışmadığınızdan şüpheleniyorum, ancak ihtiyacınız olanı verecek başka bir şey olup olmadığını görmek için DataGridViewTextBoxColumn'un diğer özelliklerini kontrol ediyorum. – Melanie

+0

@Melanie Windows formları kullanıyorum.Diğer özelliklerine bakacağım – Andrey

+0

Ayrıca, başka bir nesnenin mülkünü kullandığımda iyi, gibi: DataPropertyName = "MasterName" – Andrey

cevap

2

bu

kaynağını yapabilirsiniz:

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

Ve daha sonra varlık alt adına bağlanır. durumda

+1

EF tarafından oluşturulan sınıftan ne haber? Onları değiştiremiyorum – Andiana

+0

Ardından DataGrid tarafından düzenlenebilirliği nasıl düzenleyebilirim? – miguelmpn

0

için datasoure nerede? kaynağa yönlendirmelisin. onu bulacaktır.

  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. : Örneğin varlık çocukta ToString yöntemini geçersiz kılabilir

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

Nasıl bir alt tür için kullanılır? – miguelmpn

4

böyle birçok alt öğelerini kullanmak istiyorum:

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

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

ne dersiniz: Bazı olay her hücre için

1 çözüm Set değeri (mabye diğeri iyidir) el, örneğin, veri kaynağı ayarladıktan sonra:

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

2. çözüm Verilerden doğru DataTable oluşturmaya ve sonra bağlamaya ne dersiniz?

sen sadece bunu bu

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

İyi fikir ve muhtemelen hızlı. MSDN, bu işlevin oldukça sık çağrılacağını ve uzun işlemlerden kaçınılmasının gerektiği konusunda uyardı. Bu nedenle iki iyileştirme: (1) Sadece parametre e ile istenen hücreyi biçimlendirin. Biçimlendirilen her hücre için işlev bir kez çağrılır. (2) sütunlar için dizeleri kullanmak yerine, hücreye erişmek için e.ColumnIndex kullanın. –

5

için müteşekkir olurum:

Bir çocuk değeri almak istediğiniz özelliği [Browsable (false)] ile maskeleyin, böylece datagrid'de görünmez. Sonra sadece "get" yöntemi childproperty değerini gösteren sahiptir alt nesne tutan sınıfınızda YENİ bir özellik oluşturmak: Örneğin :

[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

kullanabilirsiniz (yani DataPropertyName = "MyProp1.MyProp2.MyProp3" kullanarak) daha genel olması gerekiyorsa ben herhangi bir görüş ;-)

İlgili konular