AlexCode Posted April 19, 2005 Posted April 19, 2005 Hi... I've being doing this with VB.net, but now I'm developing a control on C# but I can't find the way to correctly presist a typed array in code, it allways persists the content of the desing-time created array on the resources. Everything works fine if the class inherits from the System.Windows.Forms.Control... but I don't need/want those bunch of extra properties... How do I do this in C#? Thanks! Alex :p Quote Software bugs are impossible to detect by anybody except the end user.
Mister E Posted April 19, 2005 Posted April 19, 2005 You should be able to just make the array a class member. It will then persist throughout the lifetime of the control. public class MyClass { const int COUNT = 50; private MyType[] array = new MyType[COUNT]; public MyClass() { for (int i=0; i<COUNT; i++) array[i] = new MyType(); } } Quote
AlexCode Posted April 19, 2005 Author Posted April 19, 2005 Hi... Possibly I didn't make myself clear... My persistence need are to code not to memory. As I'm developing a control that have some properties that are typed collections, edited with the Collections Editor, the items of those collections must be persisted to code at design-time. In VB.net this task is plain easy... in C# it's not so... Thanks! Quote Software bugs are impossible to detect by anybody except the end user.
Administrators PlausiblyDamp Posted April 19, 2005 Administrators Posted April 19, 2005 How are you doing this in VB then? Is there no direct translation that would work? Quote Posting Guidelines FAQ Post Formatting Intellectuals solve problems; geniuses prevent them. -- Albert Einstein
AlexCode Posted April 19, 2005 Author Posted April 19, 2005 How are you doing this in VB then? Is there no direct translation that would work? In VB.net something like the following would work: Public Class A Private _coll() as B <System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)> _ Public Property Coll() As B() Get Return _coll End Get Set(ByVal Value As B()) _coll = Value End Set End Property End Class Public Class B Public property ... End Class Translating this to C#, the auto-generated code will put the collection items inside the resources file. This will cause me to be unable to edit those objects at design-time... I'm aware that I may sound a little confusing... but it's what's happening... :s sorry! Alex :p Quote Software bugs are impossible to detect by anybody except the end user.
Leaders snarfblam Posted April 20, 2005 Leaders Posted April 20, 2005 Does the code appear to be exactly equivalent? Quote [sIGPIC]e[/sIGPIC]
AlexCode Posted April 20, 2005 Author Posted April 20, 2005 Yep... Anyway, I've just changed my typed collections to BaseCollection inherited classes and it persists the code correctly. I've just opened another thread with my new trouble. Now I can edit my collections with the Object Collection Editor... It shows, but the Members are allways System.Object type. How do I edit a BaseCollection object with Object Collection Editor? Thanks! Alex :p Quote Software bugs are impossible to detect by anybody except the end user.
penfold69 Posted April 20, 2005 Posted April 20, 2005 In your overridden Collection class, don't you simply return the object of the correct type? Something like: Public Class MyCollection Inherits System.Collections.CollectionBase Public Overridable Sub Add(ByVal Item As MyItem) list.Add(aItem) End Sub Public Overridable Sub Insert(ByVal Item As MyItem, ByVal location As Integer) list.Insert(location, aItem) End Sub Public Overridable Sub Remove(ByVal index As Integer) If index > Count - 1 Or index < 0 Then Throw New IndexOutOfRangeException() Else list.RemoveAt(index) End If End Sub Public Overridable Function Replace(ByVal index As Integer, ByVal aItem As MyItem If index > Count - 1 Or index < 0 Then Throw New IndexOutOfRangeException() Else list.Item(index) = aItem End If End Function Default Public ReadOnly Property Item(ByVal index As Integer) As MyItem Get If index < list.Count And index >= 0 Then Return CType(list.Item(index), MyItem) Else Throw New IndexOutOfRangeException() End If End Get End Property End Class Quote
AlexCode Posted April 20, 2005 Author Posted April 20, 2005 Damn I'm stupid... ****... I'd already tryed that but with no real hoppe and it didn't worked somehow... It works now... thanks a lot... saved my day from my stupidity... damn! Alex :p Quote Software bugs are impossible to detect by anybody except the end user.
AlexCode Posted April 20, 2005 Author Posted April 20, 2005 As I'm on this issue, and the persistence its being donne properlly, just a quick question... What's the bert way, at design-time, to distroy the objects of a collection when the parent object is deleted? Example: Class A have several properties witch type is inherited from CollectionBase. I add some items into each one of them (the Items have no visibility on the designer whatsoever). The items are presisted automaticly on code. When I delete the parent object, it desapears but leaves the collection items... with no parent collection assigned... I want to remove all the items when the collection is disposed... Thanks Alex Quote Software bugs are impossible to detect by anybody except the end user.
penfold69 Posted April 21, 2005 Posted April 21, 2005 Isn't that something that should be handled in the destructor of the collection? Surely the destructor will get called if the object is destroyed, even at design time? Without testing, I'd assume that: Private Sub Finalize() For index as Integer = 0 to list.Count - 1 list.Item(index).Dispose() Next Obviously, your item has to implement IDisposable, or some other GC method. B. Quote
AlexCode Posted April 21, 2005 Author Posted April 21, 2005 (edited) At least here, the collection Finalize method is never called... :( Something else strange here either... The collection's property, on the property grid, isn't expandable... By expandable I mean the common behavior of the collections when represented on the PropertyGrid, displaying a '+' sign that allow us to view its inner items... I even tryed to user the TypeConverter(GetType(ExpandableObjectConverter))... the '+' sign appears but when clicked desapears... I may have some kind of disfunction voodoo dealingwith collections at design-time... :eek: Thaks! Alex :p Edited April 21, 2005 by AlexCode Quote Software bugs are impossible to detect by anybody except the end user.
AlexCode Posted April 21, 2005 Author Posted April 21, 2005 Ok... the disposing problem is solved... Now the only thing is missing its that litle '+' sign to expand the collection items... On a typed collection is's a default behavior, on a System.Collections.CollectionBase colelction it doesn't show... Thanks... Quote Software bugs are impossible to detect by anybody except the end user.
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.