Laden...

user control & objekt listen mit CollectionBase

Erstellt von [ac]sebastian vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.803 Views
[
[ac]sebastian Themenstarter:in
8 Beiträge seit 2005
vor 19 Jahren
user control & objekt listen mit CollectionBase

Hallo,
ich programmieren gerade ein UserControl, ich habe eine die klasse COllectionBase vererbt und sieht nun so aus:

[Description( "VerticalProgressBar Setze die Texte für die beschriftung")]
[Category( "VerticalProgressBar" )]
[RefreshProperties(RefreshProperties.All)]
public BeschrArray ArrayListe
{
get
{
return m_ArrayListe;
}
set
{
m_ArrayListe = value;
Invalidate();
}
}

public class BeschrArray : CollectionBase
{

	public Beschriftung this[ int index ]    
	{  
		get    
		{  
			return( (Beschriftung) List[index] );  
		}  
		set    
		{  
			List[index] = value;  
		}  
	}  

	public int Add( Beschriftung value )    
	{  
		return( List.Add( value ) );  
	}  

	public int IndexOf( Beschriftung value )    
	{  
		return( List.IndexOf( value ) );  
	}  

	public void Insert( int index, Beschriftung value )    
	{  
		List.Insert( index, value );  
	}  

	public void Remove( Beschriftung value )    
	{  
		List.Remove( value );  
	}  

	public bool Contains( Beschriftung value )    
	{  
		// If value is not of type Int16, this will return false.  
		return( List.Contains( value ) );  
	}  

}  

public class Beschriftung
{
public int Pos;
public string Text;
public Color Farbe;

	[Description( "Test")]  
	[Category( "Skala" )]  
	[RefreshProperties(RefreshProperties.All)]  
	private int m_SkaleFrequence;  
	public int SkaleFrequence  
	{  
		get  
		{  
			return m_SkaleFrequence;  
		}  
		set  
		{  
			m_SkaleFrequence = value;  
		}  
	}  
}  

wenn ich nun das neue element im designer sehe, dann kann ich über das auswählmenue objekte vom typ Beschriftung hinzufügen und einstellen, aber egal was ich einstelle der designer übernimmt die neuen objektdaten nicht mit in das aktuelle form.
das ziehl ist es eine belibige anzahl von objekten mit voreinstellungen( di im designer gemacht werden) an das usercontrol zu übergeben und nicht jedes elemnet per hand zu initialisieren.
und das user controll kann ja mit Beschriftung.COunt feststellen wie viele objekte übergeben werden.
wenn ich die objekte zur laufzeit hinzufüge funktioniert es, zb. in form load.

ich hoffe ihr könnt mir weiterhelfen, ich habe schon überall gesucht, aber bin nirgends so richtig fündig geworden.

Sebastian

S
127 Beiträge seit 2004
vor 19 Jahren

Hallo,

IMOH werte der Desinger die Methode "InitializeComponent" aus
und stellt alle Controls mit den Werten von dort dar.
Musst mal schauen und was rein schreiben dann sollte es gehen.

[
[ac]sebastian Themenstarter:in
8 Beiträge seit 2005
vor 19 Jahren

ich habe jetzt mal folgenden COde in die Init Routine gemacht,..

private void InitializeComponent()
{
//
// VerticalProgressBar
//
this.Name = "VerticalProgressBar";
this.Load += new System.EventHandler(this.VerticalProgressBar_Load);

		this.ArrayListe.Add(new Beschriftung());  

	}  

jetzt wird nach dem starten 1 objekt erzeugt. was ja auch richtig ist.
aber wie komme ich an die daten vom designer bzw. wie sage ich der routine das mit sie n element mit x,y,z initialisieren soll.

Sebastian

S
127 Beiträge seit 2004
vor 19 Jahren

Kann es sein das du den Variablen einen Standardwert zuweisen musst.

Diesen kannst du ja dann im Desinger (so glaube ich wieder ändern)


public class Beschriftung
{
public int Pos;
public string Text;
public Color Farbe;

public Beschriftung()
{
  Pos = 1;
  Text = "Hallo Welt"; // wollen ja nicht mit der Tratition brechen
  Farbe = Color.Yellow;
}

[Description( "Test")]
[Category( "Skala" )]
[RefreshProperties(RefreshProperties.All)]
private int m_SkaleFrequence;
public int SkaleFrequence
{
get
{
return m_SkaleFrequence;
}
set
{
m_SkaleFrequence = value;
}
}
}


[
[ac]sebastian Themenstarter:in
8 Beiträge seit 2005
vor 19 Jahren

ne, das wars leider auch nicht,.. ich habe auch mal versucht die var. direkt zu initialisieren, also gleich bei der deklaration, das ging auch nicht.

was ich will ist bei der klasse/elemnet TabControl ganz gut zu sehen, wenn man ein neues TabSheet erzeugt,.. fügt der designer den code für das element hinzu also xxx.Add(this.Sheet)
und erzeugt darunter den code um das neue objekt zu initialisieren so wie es im designer geschehnen ist.

Sebastian

S
127 Beiträge seit 2004
vor 19 Jahren

Sorry, ich glaube hier hört mein wissen auf.

Ich weiß nicht wie man den Desinger überzeugen kann solchen Code zu produzieren.

Man könnte das ja mit CodeOnFly machen wärende der Benutzer die Einstellungen im Desinger macht musst du diese Änderungen auch im Code vollführen. Damit der Desinger diese dann wieder richtig anzeigt.

22 Beiträge seit 2004
vor 19 Jahren

hi,

vielleicht weiche ich etwas vom thema ab, bin aber gerade dabei mein erstes usercontrol zu erstellen und komme nicht weiter.

es geht um einen farbverlauf im usercontrol.

private Color colorBegin;
private Color colorFade;

getter und setter sind auch vorhanden:

[
Category("Farbverlauf")
RefreshProperties(RefreshProperties.All)
]
public Color setColor
{
	get{ return this.colorBegin; }
	set{ this.colorBegin = value; }
}
[
Category("Farbverlauf")
RefreshProperties(RefreshProperties.All)
]
public Color setFadeColor
{
	get{ return this.colorFade; }
	set{ this.colorFade = value; }
}

wenn ich nun das control in mein projekt einbinde, wird im designermodus alles richtig angezeigt. im eigenschafts-fenster kann ich die farben auch einstellen.
was mich stört ist, daß die veränderungen erst nach dem ausführen des programms angezeigt werden.

woran liegt das???

mit [RefreshProperties(RefreshProperties.All)] habe ich auch schon rumexperimentiert. hatte leider keinen erfolg.

@sunny
was meinst du mit "CodeOnFly".
könntest du vielleicht "CodeOnFly" näher erläutern?

danke...
paratrooper.

S
127 Beiträge seit 2004
vor 19 Jahren

Mit "CodeOnFly" meine ich das Code dynamisch generiert wird, das was der Desinger auch macht, wenn du ein neues Control auf die Form ziehst.
Man muss den Quellcode öffnen und die Funktion suchen und dort den Text ändern, dann wieder schließen.

Aber wenn ich jetzt so darüber nachdenke dann kann das nich laufen, da das VS die Datei ja auch offen hat und es dann zu einem Fehler kommen kann, wenn beide schreiben wollen.