Benutzer mit den meisten Antworten
VB.net Datagridview Cell mit Button nach Fokuserhalt / wie ehemals VB6 in DatagridControl

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
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 5. September 2011 14:04
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 CodeEnd If
End SubIch habe es nicht getestet, aber ich denke so könnte es gehen.
Gruss Peter
-
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
-
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 + 30Dim rowPosSichtbar = e.RowIndex - xxxDataGridView.FirstDisplayedScrollingRowIndex
yp += rowPosSichtbar * xxxDataGridView.Rows(0).HeightDim 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
-
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 -
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
-
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 5. September 2011 14:04