Indexwerte aus ComboBox SelectedIndexChanged auslesen

JJB

Cogito ergo brumm
Tach Tach mal wieder !

[Diesmal mit einem besseren Titel]

Ich erzeuge zu Laufzeit einen Pool von Comboboxen in einem Scrollbaren Panel.
Wenn ich einen Wert in einer dieser Boxen ändere, muss für den ehemaligen Wert eine Funktion gestartet werden und für den neu ausgewählten Wert.

Ich habe nun zu Laufzeit die Box erstellt und mit:
Code:
theBox.SelectedIndexChanged += new System.EventHandler(this.ComboBox_SelectedIndexChanged);
ausgestattet. Danach wird sie in das Panel geschrieben.

Doch das Event bietet mir keinerlei Information über .... naja ... das "Event".
Ich will wissen, was vorher drin stand und was nun ausgewählt wurde.
Den neuen Wert krieg ich ja irgendwie... aber der alte ?
Die CheckedListBox hat ja auch Infos über die alten Werte. Muss doch hier auch gehen oder ?

Hat jemand eine Idee ?

MFG JJB
 
Hi,

ja das geht auch. Habs jetzt vielleicht ein bisschen kompilzierter gemacht als es ist.
Ich habe eine eigene ComboBox gebaut, den 'SelectIndexChanged' Event abgefangen und durch einen eigenen, modifizierten ersetzt.

Code:
// ein eigenes delegate mit 'MyComboxEventArgs' als parameter die wir in der form dann auswerten
public delegate void MyComboBoxEventHandler(MyComboxEventArgs e);

public class MyComboBox : System.Windows.Forms.ComboBox
{
	private int lastIndex = 0;

	// einen neuen event zur verfuegung stellen, den wir anstelle des 'SelectedIndexChanged' event benutzen
	public event MyComboBoxEventHandler ModifiedSelectedIndexChanged;

	public MyComboBox()
	{
		// hier abonnieren wir und fangen somit den 'SelectedIndexChanged' event ab um die internen properties zu setzen (oldIndex und newIndex)
		this.SelectedIndexChanged +=new EventHandler(MyComboBox_SelectedIndexChanged);
	}

	private void MyComboBox_SelectedIndexChanged(object sender, EventArgs e)
	{
		// hier schmeissen wir unsere eigenen event-argumente die weiter utnen deklariert sind
		if(ModifiedSelectedIndexChanged != null)
			ModifiedSelectedIndexChanged(new MyComboxEventArgs(this.lastIndex, this.SelectedIndex));
		
		// wert des letzten index setzen
		this.lastIndex = SelectedIndex;
	}
}

// das hier ist unser eigenes event-argument mit mehr informationen ueber das event
public class MyComboxEventArgs : EventArgs
{
	private int oldIndex;
	private int newIndex;

	public MyComboxEventArgs(int oldIndex, int newIndex)
	{
		this.oldIndex = oldIndex;
		this.newIndex = newIndex;
	}

	public int OldIndex
	{
		get { return this.oldIndex; }
	}

	public int NewIndex
	{
		get { return this.newIndex; }
	}
}
Jetzt nur noch den Event abonnieren:
Code:
this.myComboBox1.ModifiedSelectedIndexChanged +=new MyComboBoxEventHandler(myComboBox1_ModifiedSelectedIndexChanged);
Und den Event benutzen:
Code:
private void myComboBox1_ModifiedSelectedIndexChanged(MyComboxEventArgs e)
{
    MessageBox.Show("old: " + this.myComboBox1.Items[e.OldIndex] + "\nnew: " + this.myComboBox1.Items[e.NewIndex]);
}

Ich hab das jetzt nur so auf die schnelle geschrieben und nur ein wenig getestet. Koennte sein das du noch etwas aendern musst.
 
Zuletzt bearbeitet:
Danke für den Code !

Kannst du den ein wenig kommentieren, damit ich dir besser folgen kann ?
Es ist schon ein wenig viel.

MFG JJB

_
 
Kann es sein, dass da was mit dem Delegaten nicht ganz sauber läuft ?

Ich haben einen Fehler wenn ich versuche die Box mit der Eigenschaft auszustatten. VS.Net sagt mir immer wieder dass der Delegat nicht übereinstimmt.

Ein Tip ?

MFG JJB

_
 
Also bei mir funktioniert alles einwandfrei.
Was meinst du mit "der Eigenschaft ausstatten"? Meinst du damit "public event MyComboBoxEventHandler..."?
Das delegate muss natuerlich in einem Namespace stehen auf den deine Klassen zugreifen koennen..
 
Hat sich geklärt.

Ich habe versucht wie bei der normalen Box den Sender einzubauen und das Delegate hat ihn nicht vorgesehen. Sollte dieser Dabei sein, muss er von der Definition des Delegate an, definiert und durchgereicht werden.

Doch wie ich das sehe braucht man den eigentlich nie.

Danke nochmal !

MFG JJB

_
 

Neue Beiträge

Zurück