2014-07-04 36 views
5

Ich muss das ausgewählte Element meines Eigenschaftenrasters festlegen. Ich erhalte ein eventargs, das eine Zeichenfolge speichert (diese Zeichenfolge sagt mir, welche Eigenschaft in meinem propertygrid der Benutzer auswählen möchte). Das Problem ist, ich kann keine Sammlung von Rasterelementen finden, ich kann eine aus auswählen. Und ich weiß auch nicht, wie man ein neues GridItem-Objekt richtig erstellt und die Eigenschaft setzt.So legen Sie das ausgewählte Objektgitter fest

GridItem gridItem = ???; 
detailsPropertyGrid.SelectedGridItem = gridItem; 

danke für Ihre Hilfe.

Edit:

Seine fast jetzt arbeiten sehr viel Sie tahnk.

GridItem gi = this.detailsPropertyGrid.EnumerateAllItems().First((item) => 
       item.PropertyDescriptor != null && 
       item.PropertyDescriptor.Name == colName); 
     this.detailsPropertyGrid.SelectedGridItem = gi; 
     this.detailsPropertyGrid.Select(); 

Das einzige Problem ist: Nun wird das Feld Eigenschaftsname ausgewählt. Kann ich den Fokus auf das Eingabefeld der Immobilie legen?

Antwort

7

Hier sind ein paar PropertyGrid-Erweiterungen, die alle Elemente in einem Raster auflisten können. So können Sie einen Artikel auswählen:

// get GridItem for a property named "Test" 
    GridItem gi = propertyGrid1.EnumerateAllItems().First((item) => 
        item.PropertyDescriptor != null && 
        item.PropertyDescriptor.Name == "Test"); 

    // select it 
    propertyGrid1.Focus(); 
    gi.Select(); 

    // enter edit mode 
    SendKeys.SendWait("{F4}"); 

    ... 

    public static class PropertyGridExtensions 
    { 
     public static IEnumerable<GridItem> EnumerateAllItems(this PropertyGrid grid) 
     { 
      if (grid == null) 
       yield break; 

      // get to root item 
      GridItem start = grid.SelectedGridItem; 
      while (start.Parent != null) 
      { 
       start = start.Parent; 
      } 

      foreach (GridItem item in start.EnumerateAllItems()) 
      { 
       yield return item; 
      } 
     } 

     public static IEnumerable<GridItem> EnumerateAllItems(this GridItem item) 
     { 
      if (item == null) 
       yield break; 

      yield return item; 
      foreach (GridItem child in item.GridItems) 
      { 
       foreach (GridItem gc in child.EnumerateAllItems()) 
       { 
        yield return gc; 
       } 
      } 
     } 
    } 
+0

Vielen Dank !!! Kannst du mir bitte meinen Schnitt ansehen? Danke – user3596113

+0

Sie können SendKeys verwenden, um in den Bearbeitungsmodus zu gelangen. Siehe meine Bearbeitung. –

+0

Habe eine solche süße und nützliche Erweiterungsmethode schon lange nicht mehr gesehen. Einfach toll. Hätte nicht so denken können. Vielen Dank! – RBT

Verwandte Themen