[C#]Propertygrid collecties worden niet opgeslagen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 17:38
Ik probeer een object te editten die een List<> collectie als property heeft. Als ik op het edit knopje klik krijg ik de standaard collection editor van .Net te zien en kan ik objecten toevoegen. Vervolgens klik ik op Ok, maar dan wordt de collectie niet opgeslagen :?

Ben ik iets vergeten of moet ik nog wat speciaals doen? Het vreemde is, als ik een array van die objecten gebruik het wel werkt :? :?

Dit is de class:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public class Class2 {

        private List<Class2> _PropertyCollection;
        public List<Class2> PropertyCollection {
            get { return _PropertyCollection; }
            set { _PropertyCollection = value; }
        }

        private Class2[] _PropertyCollection1;
        public Class2[] PropertyCollection1 {
            get { return _PropertyCollection1; }
            set { _PropertyCollection1 = value; }
        }
    }


en zo vul ik de propertygrid:
C#:
1
2
3
        private void button2_Click(object sender, EventArgs e) {
            propertyGrid1.SelectedObject = new Class2();
        }


Als ik dus de PropertyCollection edit worden de waardes niet opgeslagen en voor de PropertyCollection1 wel. Hoe kan ik ervoor zorgen dat de List ook gevuld wordt?

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 13:34

Haan

dotnetter

Ik zie niet echt wat
C#:
1
propertyGrid1.SelectedObject = new Class2(); 
gaat vullen? Als je het op de 'Microsoft' manier wil doen, moet je sowieso collection properties read-only maken, dus geen setter geven. Dan zou je iets krijgen als
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Class2 
{
    //default constructor, initialiseer lege propertyCollection
    public Class2()
    {
        _propertyCollection = new List<Class2>();
    }

    //constructor om propertyCollection meteen te vullen
    public Class2(List<Class2> propCollection)
    {
          _propertyCollection = propCollection;
    }
    
    private List<Class2> _propertyCollection;
    public List<Class2> PropertyCollection
    {
        get { return _propertyCollection; }
    }
}


In je aanroep krijg je dan bijvoorbeeld
C#:
1
2
3
private void button2_Click(object sender, EventArgs e) {
            Class2 c2 = new Class2();
        }


Is dat ongeveer wat je bedoelt?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 17:38
edit:

Ik zie net in je bericht dat je in de constructor de collectie vult met een lege collectie. Dat had ik nog niet en heb ik even uitgeprobeerd, en dat werkt. Als ik de collectie van te voren vul met een lege List<Class2> onthoudt hij wel de opgegeven waardes.

Zo dus:

[code=c#] private List<Class2> _PropertyCollection = new List<Class2>();
public List<Class2> PropertyCollection {
get { return _PropertyCollection; }
set { _PropertyCollection = value; }
}[/code]


Nee, ik bedoel dit.

Ik heb een formulier met een propertygrid erop:

Afbeeldingslocatie: http://www.xs4all.nl/~pbruine/dump/propgrid1.jpg

Als ik op button2 klik wordt het propertygrid gevuld met een nieuw class2 object:

Afbeeldingslocatie: http://www.xs4all.nl/~pbruine/dump/propgrid2.jpg

Als ik in een collection property klik krijg ik de knop met ... erop.

Afbeeldingslocatie: http://www.xs4all.nl/~pbruine/dump/propgrid3.jpg

Klik ik daarop krijg ik de collection editor: Vervolgens kan ik een nieuwe class2 toevoegen aan die collectie.

Afbeeldingslocatie: http://www.xs4all.nl/~pbruine/dump/propgrid4.jpg

Met "Ok" slaat hij de collectie op (als het goed is).

Afbeeldingslocatie: http://www.xs4all.nl/~pbruine/dump/propgrid5.jpg

Voor de Array[] wordt het wel opgeslagen, maar voor de list niet. Hoe kan ik ervoor zorgen dat de List<Class2> ook opgeslagen wordt?

[ Voor 22% gewijzigd door urk_forever op 03-03-2009 11:32 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 16:25
SelectedItem is toch een gegenereerde afgeleide waarde?

Moet je niet List.Items[List.selectedIndex] = new Class2(); doen?

Even niets...


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 17:38
Zie mijn edit in mijn bericht.

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Je verzameling moet een afgeleide zijn van de ICollection interface,. Een generic List voldoet niet aan die eis. Om het probleem op te lossen moet je een Class2Collection class maken die zijn functionaliteit overerft van Collectionbase class. Daarin moet je een eigen override schrijven van de add functie.

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 16:25
Ik zie niet waar je mijn methode geprobeerd hebt....

Edit: Ik denk dat HawVer er meer van weet dan ik :+

[ Voor 35% gewijzigd door FireDrunk op 03-03-2009 13:28 ]

Even niets...


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Met een voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace System.Windows.Forms.NavigationBar
{
   public class Class2Collection : CollectionBase
   {
      public void Add(Class2 value)
      {
         base.List.Add(value);
      }
   }
}

http://msdn.microsoft.com...tions.collectionbase.aspx

http://hawvie.deviantart.com/

Pagina: 1