Klik en sleep van TableView naar GridView

Klik en sleep
De eenvoudige voorbeelden van klik en sleep met de muis, zoals die waarbij een tekst van een TextBox naar een TextLabel worden gesleept, schieten te kort als je een TableView of een GridView gebruikt (beiden even roosters genoemd). Immers: je kan een heel rooster slepen naar een ander rooster en daar allerlei leuke dingen mee doen, maar meestal is dat niet de bedoeling.

Cel in plaats van rooster
Je wil een bepaald vakje, één cel, of eerder nog de inhoud daarvan, naar een andere plaats slepen. De bestemming is dan niet een element als TextBox of GridView, maar ook weer een bepaalde cel van een TableView of GridView rooster.

Drag..
De basis blijft hetzelfde:
Voor de vertrekplaats moet een _MouseDrag() gemaakt worden:

PUBLIC SUB TableView1_MouseDrag()
  IF Mouse.Left
    Drag.Icon = PictureBox1.Picture
    TableView1.Drag(TableView1[TableView1.Row, TableView1.Column].Text)
  ENDIF
END

Ik heb in de IDE op voorhand een PictureBox1 op FMain gezet, er in de IDE een beeldje voor gekozen uit de verzameling (stock), en die PictureBox1.Visible op FALSE gezet.

.. en Drop
De bestemming moet als eigenschap Drop = TRUE hebben:

GridView1.Drop = TRUE

en er moet drop code gemaakt worden:

PUBLIC SUB GridView1_Drop()
  GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data
END

Om de data in de Text te krijgen van de gewenste cel op rij, kolom

GridView1[row, column].Text = Drag.Data

moet je die coördinaten eerst detecteren:

GridView1.RowAt(Drag.y)
GridView1.ColumnAt(Drag.X)

Dit is de kleine “truuk” om het klikken en slepen tussen TableViews en GridViews mogelijk te maken.
Er zit nog wel een addertje onder het gras: als je een beetje buiten de bestaande cellen sleept en daar in het gridview gebied onder de laatste rij cellen bv loslaat, zijn de coördinaten niet gedefineerd. Crash!

Dus:
TRY GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data

Verder moet je de code aanvullen met alles wat moet gebeuren, zoals opslaan in een databank, berekeningen enz.