Kto by się spodziewał, programiści frameworka .NET doszli do wniosku, że zdarzenia Click oraz DoubleClick (i pochodne) mają działać tylko po kliknięciu myszką w istniejące elementy listy. Jakie to powoduje ograniczenia? Otóż wymyśliłem sobie, że podwójne kliknięcie w puste miejsce kontrolki ListView powinno powodować utworzenie nowego elementu. Z rozpaczą jednak stwierdziłem, że to nie działa….
…zacząłem szukać w google…
…i zdruzgotany nic nie znalazłem – poza – kilkoma poradami, aby wprowadzić własną obsługę za pomocą Timera i MouseDown/MouseUp. Do bani.
A rozwiązanie istnieje i jest ono całkiem eleganckie. Należy utworzyć własną kontrolkę rozszerzającą ListView, a następnie nadpisać metodę
protected override void WndProc(ref Message m)
takim kawałkem kodu:
if (m.Msg == 0x203) //WM_LBUTTONDBLCLK
{
this.OnDoubleClick(MouseEventArgs.Empty);
}
else
{
base.WndProc(ref m);
}
I już. Przechwytujemy wszystkie komunikaty i w przypadku gdy jest to podwójne kliknięcie, wywołujemy zawsze zdarzenie OnDoubleClick. Podobnie można zrobić dla pojedynczego kliknięcia, tylko sobie ustalcie ID komunikatu.