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 ClassMoikka 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 SubMuuten 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.