Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB2010 WINFORMS] riconoscere posizione (x,y) della cella corrente di DataGridView

    ho un form con datagridview di 11 colonne e righe variabili (media di 500 ), vorrei che quando si entra con il mouse nelle celle di determitate colonne, mi compaia un bottone in prossimità di questa cella (adiacente al margine superiore della cella corrente).. il mio problema che non so come fornire le coordinate a questo bottone affinchè si posizioni pefettamente (o quasi) adiacente alla cella selezionata...

    il codice l'ho inserito nell'evento di DataGridView_CellEnter della tabella, così

    codice:
        Private Sub ElencoDataGridView_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ElencoDataGridView.CellEnter
    
            ' non esegue se è stata attivata la proprietà readonly della cella
            If sender.CurrentCell.ReadOnly Then Exit Sub
    
            ' è valido solo se la cella appartiene a queste colonne
            Select Case sender.columns(e.ColumnIndex).name
                Case "RinnovatoGrid", "ScadenzaGrid", "ContrattoGrid"
    
                    With DataButton
    
                        ' questa è solo per ricavare la posizione Left, ma non è precisa 
                        '   perchè non tiene conto di colonne nascoste e non nell'aria visibile
                        Dim Lefts = 0
                        For i = 0 To e.ColumnIndex
                            Lefts += sender.Columns(i).Width
                        Next
    
                        ' qua dovrebbe posizionare il bottone e renderlo visibile
                        ' ho messo valori che non ci azzeccano na mazza
                        .Left = Lefts - (.Width / 2)
                        .Top = sender.Top - (.Height / 2)
                        .Tag = sender.name
                        .Visible = True
                    End With
            End Select
        End Sub
    ovviamente le coordinate calcolate in quel modo non sono per niente valide al caso..
    mi è venuta l'idea di usare le coordinate del mouse, ma non so come richiamarle

    qualche idea?

    edit: adesso che ci penso: se la cella viene selezionata da tastiera le coordinate del mouse non vanno bene, quindi non può essere un'alternativa valida
    l'unica è sapere la posizione della cella corrente rispetto alla tabella o al forms.. come si fa?
    Michele

  2. #2
    Chi non cerca trova.

  3. #3
    Originariamente inviato da tas
    Hai guardato questo metodo?
    http://msdn.microsoft.com/en-us/libr...ng-VB)&rd=true
    si Tas, l'avevo provato.. la posizione della cella è sempre X o Left = 0

    proprio adesso ho trovato un altro metodo nelle proprietà della tabella, si chiama .GetCellDisplayRectangle che specificando nei parametri indice riga e colonna dovrebbe restituire le cordinate all'nterno della tabella, appunto di quella cella.. la sto testando... vediamo
    Michele

  4. #4
    ok questa è pefertta

    il metodo di datagriview .GetCellDisplayRectangle() restituisce le cordinate dell'angolo superiore sinistro della cella "visualizzata" rispetto alla tabella e tiene conto anche di colonne nascoste o non visibili perchè scrollate... direi che è Ottimma


    questa è la mia sub che visualizza un bottone adiacente al bordo superiore della cella corrente selezionata... sicuramente potrà servire ad altri:
    codice:
        Private Sub ElencoDataGridView_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ElencoDataGridView.CellEnter
    
            ' non esegue se è stata attivata la proprietà readonly della cella
            If sender.CurrentCell.ReadOnly Then Exit Sub
    
            ' è valido solo se la cella appartiene a queste colonne
            Select Case sender.columns(e.ColumnIndex).name
                Case "RinnovatoGrid", "ScadenzaGrid", "ContrattoGrid"
    
                    With DataButton
    
                        ' = posizione X della cella interessata + eventuale distanza tra form e datagridview
                        .Left = sender.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True).X + sender.left
                        ' = posizione Y della cella + distanza datagridview dal form - l'atezza del bottone
                        .Top = sender.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True).Y + sender.top - .Height
    
                        .Tag = sender.name
                        .Visible = True
    
                    End With
            End Select
        End Sub
    Michele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.