Forums Neueste Beiträge
 

Ereignis aus einem PropertyGrid

29/05/2010 - 14:35 von Jakob Brunner, Switzerland | Report spam
Hallo zàme
Ich habe mit einem TypeConverter in einem PropertyGrid die Detailangeben
eiens Wertes (Winkel => Grad, Minute, Sekunde) abgefragt. Dies funktioniert.
Nun möchte ich aber noch, dass bei der Änderung eines Wertes ein Ereignis
ausgelöst wird. Dieses Ereignis aus dem PropertyGrid zu erreichen habe ich
mit einem Delegate-Handler erreicht. Und dies funktioniert bei allen Werten,
welche ich direkt im PropertyGrid àndere. Will ich nun aber die Detaildaten
des Winkels eingeben (mit dem TypeConverter expandiert), dann bekomme ich
dieses Ereignis nicht.
Weiss jemand, wie ich aus dieser TypeConverter-Klasse ein Ereignis über das
PropertyGrid an die Applikation bringen kann.

Besten Dank und Gruss
Jakob
Jakob Brunner
Luzern, Switzerland
 

Lesen sie die antworten

#1 Frank Dzaebel
29/05/2010 - 15:17 | Warnen spam
Hallo Jakob,

Ich habe mit einem TypeConverter in einem PropertyGrid die Detailangeben
eines Wertes (Winkel => Grad, Minute, Sekunde) abgefragt. Dies
funktioniert.
Nun möchte ich aber noch, dass bei der Änderung eines Wertes ein
Ereignis
ausgelöst wird.



Wenn Du das sauber über den TypeConverter gemacht hast,
sollte ganz normal das "PropertyValueChanged" Ereignis greifen.
Also mal vereinfacht:


PropertyGrid pg = new PropertyGrid();

private void Form1_Load(object sender, EventArgs e)
{
Controls.Add(pg);
pg.Dock = DockStyle.Fill;
pg.SelectedObject = new Klasse();
pg.PropertyValueChanged += Pg_PropertyValueChanged;
}

void Pg_PropertyValueChanged(object s,
PropertyValueChangedEventArgs e)
{
MessageBox.Show(
"Geànderte Eigenschaft:" + e.ChangedItem.Label +
", Alter Wert:" + e.OldValue +
", Neuer Wert:" + e.ChangedItem.Value);
}

class Klasse
{
public Klasse()
{
Winkel = new Winkel() { Grad = 1, Minute = 2, Sekunde = 3 };
Größe = new Size(42, 43);
}
public Winkel Winkel { get; set; }
public Size Größe { get; set; }
}

[TypeConverter(typeof(WinkelConverter))]
[Description("Grad/Minute/Sekunde")]
class Winkel
{
public int Grad { get; set; }
public int Minute { get; set; }
public int Sekunde { get; set; }
public override string ToString()
{
return Grad + "° " + Minute + "' " + Sekunde + "''";
}
}

public class WinkelConverter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context,
System.Type destinationType)
{
if (destinationType == typeof(Winkel)) return true;
return base.CanConvertTo(context, destinationType);
}

public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(String) &&
value is Winkel)
{
Winkel wk = (Winkel)value;
return wk.Grad + ";" + wk.Minute + ";" + wk.Sekunde;
}
return base.ConvertTo(context, culture, value, destinationType);
}

public override bool CanConvertFrom(
ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string)) return true;
return base.CanConvertFrom(context, sourceType);
}

public override object ConvertFrom(
ITypeDescriptorContext context,
CultureInfo culture, object value)
{
if (value is string)
{
try
{
var werte = ((string)value).Split(';');
Winkel wk = new Winkel();
wk.Grad = int.Parse(werte[0]);
wk.Minute = int.Parse(werte[1]);
wk.Sekunde = int.Parse(werte[2]);
return wk;
}
catch
{
throw new ArgumentException(
" '" + (string)value +
"' kann nicht in einen Winkel " +
"konvertiert werden");
}
}
return base.ConvertFrom(context, culture, value);
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen