2010-03-12 4 views
8

Ich bin nicht einmal sicher, ob ich das richtig mache. Aber im Grunde habe ich eine Liste von Objekten, die aus einer Klasse aufgebaut sind. Von dort binde ich die Liste an eine Datagrid-Ansicht, die sich in einem Windows-Formular (C#) befindetDatabind Liste von Objekten zu einem WinForms DataGridView, aber bestimmte öffentliche Eigenschaften nicht zeigen

Von dort zeigt es alle öffentlichen Eigenschaften des Objekts in der Datagrid-Ansicht. Allerdings gibt es einige Eigenschaften, auf die ich noch von anderen Teilen meiner Anwendung aus zugreifen muss, die aber nicht unbedingt in der DataGridView sichtbar sein müssen.

Also gibt es ein Attribut oder etwas ähnliches, das ich über die Eigenschaft schreiben kann, um es davon abzuhalten, gezeigt zu werden.

P.S. Ich bin zur Laufzeit gebunden. Also kann ich die Spalten nicht über den Designer bearbeiten.

P.P.S. Bitte keine Antworten, nur um öffentliche Variablen zu machen (Obwohl, wenn das der einzige Weg ist, lass es mich wissen :)).

+3

Sie können "DataGridView.AutoGenerateColumns" (http://goo.gl/41qt) deaktivieren und erforderliche Spalten dynamisch hinzufügen. Ich verstehe nicht wirklich, wenn du sagst "... Ich bin zur Laufzeit gebunden. Ich kann die Spalten also nicht über den Designer bearbeiten." – Vivek

+0

Was ich sage ist. Ich verwende den Designer nicht und verbinde mich mit einer Datenquelle. Ich schreibe einfach: datagridview.datasource = meine Liste; – MindingData

+0

Vielleicht könnten Sie uns sagen, warum Sie zur Laufzeit statt über den Designer binden. Das könnte helfen –

Antwort

14

hinzufügen [Browsable(false)] Attribut an die öffentlichen Eigenschaften, die Sie nicht wollen, Spalte zu erzeugen.

+1

+1 Wenn nur das Hinzufügen funktioniert, ist das viel viel besser als meine Antwort! :-) – Javier

+0

nice Ich habe es versucht, es funktioniert =) Ich habe versucht, dies zu tun, meine benutzerdefinierten Klassen hinzufügen. Vielen Dank! – Javier

2

Ich sollte genauso antworten wie @Vivek in seinem Kommentar sagt. Ich weiß nicht, warum er hier keine Antwort hinzugefügt hat ...

Nun, wenn Sie ein DataGridView-Steuerelement, um seine Spalten automatisch generieren lassen, zeigt es alle Eigenschaften in den gebundenen Objekten. Also zuerst müssen Sie DataGridView.AutoGenerateColumns = false drehen.

Dann können Sie Spalten zur Laufzeit hinzufügen. Zum Beispiel:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

Alles manuell hinzufügen ist wahrscheinlich mein letzter Ausweg hier. – MindingData

+0

Dann habe ich eine Idee, aber es ist zu groß, ich werde es in eine andere Antwort bringen. – Javier

+1

Vergiss diese zweite Idee. Siehe @Vivek Antwort stattdessen = P – Javier

0

Neben meiner vorherigen Antwort, da Sie es vorziehen, nicht zu zeigen, die Spalten manuell hinzufügen möchte, empfehle ich Ihnen eine andere Option: mit benutzerdefinierten in Ihren Eigenschaften Definition Attribute.

Zuerst müssen Sie Ihre benutzerdefinierte Attribut-Code:

MyPropertyAttribute Klasse

Sie es in Ihren Klassen verwenden könnte, genau wie dieser:

Foo Klasse

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

Sie könnten eine Methode schreiben, die die Eigenschaften in Ihren gebundenen Objekten iteriert, indem Sie Reflektionen verwenden und testen, ob sie als sichtbar oder unsichtbar markiert sind, um Spalten hinzuzufügen oder keine hinzuzufügen. Sie könnten sogar eine benutzerdefinierte DataGridView mit diesem Verhalten haben, so dass Sie dies nicht jedes Mal wiederholen müssen. Sie verwenden nur Ihre benutzerdefinierte DataGridView und markieren die Sichtbarkeit in den Eigenschaften.

So etwas ...

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

Ich weiß, es ist ein bisschen eine alte Post, aber nur aus Gründen der Klarheit möchte ich hinzufügen, dass dies auch durch Definition der benutzerdefinierten Typ-Definition mit ICustomTypeDescriptor Schnittstelle erreicht werden kann. Es sieht aus wie ein bisschen mehr Arbeit, aber Sie können nur implementieren, was Sie brauchen (in diesem Fall GetProperties). Es macht die Dinge später einfacher, da die meisten aufgelisteten Spalten automatische Grids/Listen diesen Ansatz unterstützen.

Verwandte Themen