OK, entschuldige, ich stecke zu tief in der Materie.
Mein Problem ist: wenn ich auf die Scrollleiste klicke verschwindet die Liste.
Das liegt an folgendem Ereignishandler für Deactivate:
public class NamenTextbox : TextBox
.
.
.
protected virtual void HauptfensterDeaktivieren(object sender, EventArgs e)
{
if (DeaktivierendurchAuswahlfenster) return;
AuswahlZurücksetzen(sender, e);
if (Vorschlag)
{
if (SelectionLength > 0) TextSetzen(Text.Remove(SelectionStart));
TextBoxSelPosLeave = Text.Length;
Vorschlag = false;
}
AuswahlWiederAktivieren = true;
}
protected virtual void HauptfensterAktiviert(object sender, EventArgs e)
{
if (AuswahlWiederAktivieren)
{
AuswahlPositionStart = TextBoxSelPosLeave;
TBTextChanged(sender, e);
AuswahlWiederAktivieren = false;
}
}
protected virtual void NTBParentWechsel(object sender, EventArgs e)
{
if (TopLevelControl != null && !TopLevelControlGesetzt)
{
TopLevelControl.LocationChanged += new EventHandler(AuswahlAnpassen);
if (TopLevelControl is Form)
{
((Form)TopLevelControl).Activated += new EventHandler(HauptfensterAktiviert);
((Form)TopLevelControl).Deactivate += new EventHandler(HauptfensterDeaktivieren);
}
TopLevelControl.Disposed += new EventHandler(AuswahlZurücksetzen);
TopLevelControlGesetzt = true;
}
else
{
Control parent = Parent;
while (parent != null)
{
parent.ParentChanged += new EventHandler(NTBParentWechsel);
parent = parent.Parent;
}
}
}
protected virtual void AuswahlZurücksetzen(object sender, EventArgs e)
{
Auswahl?.Dispose();
Auswahl = null;
Auswahlliste = null;
}
public virtual void NTBListboxMouseEnter(object sender, EventArgs e)
{
DeaktivierendurchAuswahlfenster = true;
}
public virtual void NTBListboxMouseLeave(object sender, EventArgs e)
{
DeaktivierendurchAuswahlfenster = false;
}
public virtual void NTBListboxClick(object sender, EventArgs e)
{
Focus(); // Fokus auf die Textbox
if (Auswahlliste == null || Auswahlliste.SelectedItem == null || SelectionStart + SelectionLength != TextLength) return;
Namenvorschlagen();
}
public virtual void NTBListboxDoubleClick(object sender, EventArgs e)
{
if (Auswahlliste!= null && Auswahlliste.SelectedItem != null)
{
Namen name = (Namen)Auswahlliste.SelectedItem;
if (name != null) TextSetzen(name.Text);
SelectionLength = 0;
SelectionStart = TextLength;
TextBoxSelPosLeave = TextLength;
VorschlagBeenden();
Focus(); // Fokus auf die Textbox
}
}
Meine Liste ist eine Form mit einer ListBox (siehe Bild1 im Anhang).
Da aber eben meiner Liste eine Form zugrundeliegt, wird jedes Mal, wenn mit der Maus in die Liste geklickt wird, diese Form aktiviert und das TopLevelControl erhält das Deactivate-Ereignis, was wiederum die Liste bzw. die Form schließt.
Deshalb habe ich die oben angegebenen Ereignishandler für MouseEnter und MouseLeave der Auswahlliste hinzugefügt.
Es funktioniert:
- das Scrollen in der Liste mit den Pfeil-Tasten hoch und runter, wobei diese Tasten gedrückt werden, wenn die Textbox den Fokus hat (habe ich über das KeyDown-Ereignis gesteuert)
- das Scrollen mit der mittleren Maus-Taste/Mausrad (wahrscheinlich, weil die Liste hierbei nicht den Fokus und somit das TopLevelControl kein Deactivate-Ereignis erhält)
- das Klicken in die Liste
Wenn ich aber auf die Scrollleiste klicke, verschwindet die Liste. Das "Warum" ist mir klar (Deactivate-Ereignis des TopLevelControl, siehe oben).
Und ich denke, dass ich das vermeiden könnte, wenn ich der Scrollleiste Mouse- und Click-Ereignishandler anfügen könnte. Dafür brauche ich aber Zugriff auf die Scrollleiste.