Построение на ответе jor (который не работает на меня):
substring=$(expr "$filename" : '.*_\([^_]*\)_.*')
Вот мое решение в VB.NET, использующее технику, описанную в ObjectListView , как было предложено грамматистом :
Private idleHandlerSet As Boolean = False
Private Sub listview1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listview1.SelectedIndexChanged
'' may fire more than once
If Not idleHandlerSet Then
idleHandlerSet = True
AddHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
End If
End Sub
Private Sub listview1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'' will only fire once
idleHandlerSet = False
RemoveHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
DoSearch()
End Sub
Меня это тоже раздражает, поэтому в ObjectListView (оболочка с открытым исходным кодом для .NET WinForms ListView) есть событие SelectionChanged, которое происходит только один раз на действие пользователя.
В обычном .NET ListView, когда состояние выбора любого элемента изменяется, он запускает событие SelectedIndexChanged. Таким образом, при простом щелчке по другой строке вы получаете одно событие для отмены выбора ранее выбранной строки, а другое - для выбора новой.
Если вы выбрали сто строк и выбрали другую строку, вы получите 101 событие SelectedIndexChanged, что может стать настоящей головной болью.
В любом случае, с ObjectListView вы получите только одно событие SelectionChanged независимо от сколько строк было выбрано или отменено.
Если вы хотите, чтобы ваши вычисления выполнялись только при выборе нового элемента, вы можете проверить, равен ли новый SelectedIndex! = -1