Miten kyseisen eventin saa toteutettua VS2008:ssa? Eli tapahtuma joka potkaistaan käyntiin juuri ennenkuin valinta listassa vaihtuu.
Seuraava pätkä pelaa ok VS 2003:ssa, mutta 2008:aan kääntäessä eventti ei vaan suostu käynnistymään? (käännöksessä ei tapahdu muutoksia)
Tämä siis lisää .SelectedIndexChanging -eventin listviewiin.
Public Class ItemChangingEventArgs Inherits CancelEventArgs Public Sub New(ByVal index As Integer) m_index = index End Sub Public ReadOnly Property Index() As Integer Get Return m_index End Get End Property Private m_index As Integer End Class Public Class ListViewEx Inherits ListView Public Sub New() Me.SetStyle(ControlStyles.ResizeRedraw, True) Me.SetStyle(ControlStyles.DoubleBuffer, True) Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) End Sub Public Const WM_USER As Integer = &H400 Public Const WM_NOTIFY As Integer = &H4E Public Const OCM__BASE As Integer = WM_USER + &H1C00 Public Const OCM_NOTIFY As Integer = OCM__BASE + WM_NOTIFY Public Const LVN_FIRST As Integer = 0 - 100 Public Const LVN_ITEMCHANGING As Integer = LVN_FIRST - 0 ' <--- onko tämä vaihtunut? Public Const LVIF_STATE As Integer = &H8 Public Const LVIS_SELECTED As Integer = &H2 <StructLayout(LayoutKind.Sequential)> Public Structure NMHDR Public hwndFrom As IntPtr Public idFrom As Integer Public code As Integer End Structure <StructLayout(LayoutKind.Sequential)> Public Structure POINT Public x As Integer Public y As Integer End Structure <StructLayout(LayoutKind.Sequential)> Public Structure NMLISTVIEW Public hdr As NMHDR Public iItem As Integer Public iSubItem As Integer Public uNewState As Integer Public uOldState As Integer Public uChanged As Integer Public ptAction As POINT Public lParam As Integer End Structure Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = OCM_NOTIFY Then Dim nm As NMHDR = CType(m.GetLParam(GetType(NMHDR)), NMHDR) If nm.code = LVN_ITEMCHANGING Then Dim nmlv As NMLISTVIEW = CType(m.GetLParam(GetType(NMLISTVIEW)), NMLISTVIEW) If nmlv.uChanged And LVIF_STATE Then If nmlv.uNewState And LVIS_SELECTED Then Dim e As New ItemChangingEventArgs(nmlv.iItem) OnSelectedIndexChanging(e) If e.Cancel Then m.Result = New IntPtr(1) Exit Sub End If End If End If End If End If MyBase.WndProc(m) End Sub Public Delegate Sub SelectedIndexChangingEventHandler(ByVal sender As Object, ByVal e As ItemChangingEventArgs) Public Event SelectedIndexChanging As SelectedIndexChangingEventHandler Protected Overridable Sub OnSelectedIndexChanging(ByVal e As ItemChangingEventArgs) RaiseEvent SelectedIndexChanging(Me, e) End Sub End Class
Moikka sniiki!
tässä vähän yksinkertaisempi toteutustapa...
Sub ListView1_ItemSelectionChanged(sender As Object, _ e As ListViewItemSelectionChangedEventArgs) MessageBox.Show("Tuut") End Sub Sub ListView1_SelectedIndexChanged( _ sender As Object, e As EventArgs) MessageBox.Show("Tööt") End Sub
Muuten hyvä mutta tuo on vähä semmonen "myöhästä pinnistää ku *askat on jo housuis".
Eli toi eventti käynnistyy vasta kun valinta on jo tehty.
Syy miksi pitäis saada valinta estettyä on semmoinen, että ohjailen listan scrollausta "ulkoisella käskyllä" siten, että listaa pystyy vetää hiirellä nappi pohjassa ylös/alas. Listan sisäisessä toiminnassa tapahtuu kuitenkin jotain kummia scrollauksen suhteen kun valittu itemi muuttuu ja lista nytkähtää ikävästi takaisinpäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.