none
VB.net Datagridview Cell mit Button nach Fokuserhalt / wie ehemals VB6 in DatagridControl RRS feed

  • Frage

  • Hallo zusammen,

    ich habe mal die vorhandenen Einträge zum Thema Datagridview durchgeschaut, ob es eine ähnliche Designfunktion wie im alten DatgridControl in VB6 gibt. Dort gab es mal eine Funktion, wo man, nachdem man in die Zelle geklickt hat, einen Button einblenden konnte, um z.B. Edit Dialoge durchzuführen. Das war eigentlich recht praktisch, da man in einer Spalte die Daten anzeigen und die Dialoge steuern konnte.
    Wie würdet Ihr das in vb.net realisieren? Eine erweiterte Textboxcolumn in der man nach Focuserhalt dann den Button rendern müsste, oder gibt es etwas ähnliches fertig? Habe bisher nichts dergleichen gesehen.(Stand VS2010SP1)

    Gruß Ingo

     

    Samstag, 27. August 2011 15:09

Antworten

  • Hallo Ingo,

    statt der ganzen Rechnerei, kannst Du auch einfach die GetCellDisplayRectangle Methode verwenden:

    Public Class Form1
    
     Protected Overrides Sub OnLoad(e As System.EventArgs)
      MyBase.OnLoad(e)
    
      DataGridView1.Controls.Add(Button1)
     End Sub
    
     Private Sub DataGridView1_CellEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
      Dim lCell As Rectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
      Dim lLoc As New Point(lCell.Right - Button1.Width, lCell.Top)
    
      Button1.Location = lLoc
     End Sub
    End Class
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. August 2011 06:38
    Moderator

Alle Antworten

  •  

    Hallo Ingo,

    so wirklich habe ich nicht verstanden was du möchtest.
    Hier eine Anregung.

    Setze einen Button in dein DataGridView, mit ColumnName z.B. YourColumnName.

    Als Event um dich einzuhängen.

    Private Sub xxxDataGridView_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles xxxDataGridView.CellContentClick
            Dim i As Integer
       
            If TypeOf UserDataGridView.Columns(e.ColumnIndex).Name =  "YourColumnName"  AndAlso Not e.RowIndex = -1 Then
                i = e.RowIndex
               
               'Dein Code    

            End If
        End Sub

    Ich habe es nicht getestet, aber ich denke so könnte es gehen.

    Gruss Peter

     

     

     

    Samstag, 27. August 2011 16:47
  • Hallo peter,

    eventuell hilft das hier zum Verständnis. In der alten Umgebung die ich eben auf vs2010 umbaue konnte man im GridControl in eine Zelle klicken, und wenn die Button Eigenschaft auf true gesetzt war, erschien ein Button in der Zelle, den mal als Auslöser beliebiger Aktivitäten nutzen konnte. Das gibt es so , meiner Erkenntnis nach nicht mehr.

    Das war immer dort sinnvoll, wo man dem Benutzer zur Änderung der Daten Zusatzinformationen anzeigen wollte, die über den Inhalt deiner Combo oder Listbox hinausgehen. Einen Button in einer eigenen Spalte braucht man da eben dauerhaft eigentlich nicht.
    Aber trotzdem danke erst mal für Deine Gedanken.

    Gruß Ingo


    • Bearbeitet BIngo2065 Sonntag, 28. August 2011 06:41 Textkorrektur
    Sonntag, 28. August 2011 06:40
  • Hi Ingo

     

    Hallo Ingo,
    leider habe ich dir keine befriedigende Antwort.

    Was mir dazu einfällt ist,
    - Wie vorhergehendes Beispiel, den Text kannst Du auf dem Button anzeigen und bei einem Click auf diese deinen Code ausführen.

    - Wenn die Zelle den Focus erhält,  einen ToolTip zu der Zelle anzeigen.

    - Die Zelle kann anstatt eines Buttons eine TextBoxCell sein. Wiederum mit CellContentClick() Event eine weitere Form aufrufen, die bei der Zelle positioniert ist.
      Die Form Position bekommst du etwa so.
                        Dim xp = Me.pnlGrid.Location.X  'Grid ist in einem Pannel
                        Dim yp = Me.pnlGrid.Location.Y + xxxDataGridView.Location.Y + 30

                        Dim rowPosSichtbar = e.RowIndex - xxxDataGridView.FirstDisplayedScrollingRowIndex
                        yp += rowPosSichtbar * xxxDataGridView.Rows(0).Height

                        Dim i As Integer
                        For i = 0 To xxxDataGridView.Columns("dgvcolKorrektur").Index - 1    'Spatenbreiten aufsummieren
                            xp += xxxDataGridView.Columns(i).Width
                        Next
                        'xp /  yp >> Position der DataGridView Zelle                  


                        Dim dec As Decimal
                        dec = xxxDataGridView.Rows(e.RowIndex).Cells("dgvcolKorrektur").Value


    Ps. CellContentClick muss auch einen Inhalt haben dass der Event kommt!

    Grus Peter

     


    Sonntag, 28. August 2011 08:19
  • Danke Peter,

    diese Ideen hatte ich auch schon, dann muss ich es eben an den cellContent hängen. Schade eigentlich, das es die Property cell.left und row.top nicht mehr gibt, denn die waren auch super verwendbar beim positionieren von Edit Objekten wie Listboxen oder Forms. Jetzt muss man erst die Anzahl der Scrollzeilen bis zur current row berechnen, dann noch den HeaderHeight aufaddieren um an die gewünschte Position zu kommen. Das war früher einfacher.

    Gruß
    Ingo

    Sonntag, 28. August 2011 15:25
  • Leider wird manchmal auch gutes "wegoptimiert".

    Ich weiss ja nicht ob du es schon hast, aber zum aufrufen einer Form z.B. frmDgvTime() gehört noch

     Dim endPoint As Point = Me.PointToScreen(New Point(xp, yp))
     Dim frmDgvTime As New frmDataGridViewTimeForm(endPoint)
    xp, yp wie Posting oben.

    Gruss Peter

    Montag, 29. August 2011 04:43
  • Hallo Ingo,

    statt der ganzen Rechnerei, kannst Du auch einfach die GetCellDisplayRectangle Methode verwenden:

    Public Class Form1
    
     Protected Overrides Sub OnLoad(e As System.EventArgs)
      MyBase.OnLoad(e)
    
      DataGridView1.Controls.Add(Button1)
     End Sub
    
     Private Sub DataGridView1_CellEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
      Dim lCell As Rectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
      Dim lLoc As New Point(lCell.Right - Button1.Width, lCell.Top)
    
      Button1.Location = lLoc
     End Sub
    End Class
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. August 2011 06:38
    Moderator
  • Hallo BIngo2065,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Montag, 5. September 2011 14:04
    Moderator