| |
VB.NET - Ein- und UmsteigerRe: DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 18.06.14 15:04 |
| Hi powerzone3000,
das hast du gut erkannt. Ich habe den C# Code für VB .Net umgeschrieben. Ich hatte auch schon vor den Herrn mal anzuschreiben. Leider ist die Kontaktseite seiner Homepage down.
Über das Entfernen hatte ich auch schon nachgedacht (das meinte ich mit disposen im ersten Post). Ich werde mal sehen ob dein code funktioniert.
Ich melde mich heute Abend zurück.
Danke | |
DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 17.06.14 17:08 |
| Hallo VB net Profis,
ich habe eine Frage zum Thema Button im DGV. Mein Ziel ist solch ein Button:
Soweit so gut. Das war auf den ersten Blick auch nicht ganz so kompliziert. Wie ihr euch aber sicher denken könnt kommt jetzt das ABER
Ihr klickt im DGV in eine Zelle der Spalte Dateianhang. Es erscheint wie gewünscht ein Button. Dieser würde den FileDialogOpen aufrufen. (im Bsp. nur eine MessageBox). Jetzt klickt ihr in die nächste Zelle und siehe da der Button ist auch dort wo er nicht rein gehört.
Macht ihr dsa ganze andersrum. Also ihr startet das Programm neu und Klickt in jede andere Zelle ausser in die Spalte Dateianhang. Jetzt wird der Button nicht erscheinen.
Hat jemand ähnliche Erfahrungen damit gemacht?
Hier mal der Code:
Private Sub DataGridView1_EditingControlShowing1(sender As Object, e As _
DataGridViewEditingControlShowingEventArgs) Handles _
DataGridView1.EditingControlShowing
If DataGridView1.CurrentCell.ColumnIndex <> _
DataSet1.DtDaten.DateianhangColumn.Ordinal Then
Return
End If
Dim btn As New Button
With btn
.Dock = DockStyle.Right
.Name = "btnOpen"
.Text = "..."
.Width = 25
End With
If Not DataGridView1.EditingPanel.Controls.ContainsKey(btn.Name) Then
DataGridView1.EditingPanel.Controls.Add(btn)
End If
AddHandler btn.Click, AddressOf btn_Click
btn.BringToFront()
End Sub
Private Sub btn_Click(sender As Object, e As EventArgs)
MessageBox.Show("Ereignis")
End Sub | |
Re: DGV mit Button für FileOpenDialog | | | Autor: powerzone3000 | Datum: 17.06.14 19:08 |
| Hi,
Alternativ-Vorschlag: Wie wär's mit einer separaten DataGridViewButtonColum? | |
Re: DGV mit Button für FileOpenDialog | | | Autor: Kuno60 | Datum: 17.06.14 20:16 |
| Hallo,
du kannst eigene Spaltentypen für ein DGV mit Hilfe der IDataGridViewEditingControl-Schnittstelle erstellen. Beispiele findest du in der MSDN.
Zum Beispiel: Die Zellen zeigen den Dateinamen oder Pfad an und bei Auswahl einer Zelle erscheint rechts ein Button, der den FileOpenDialog öffnet.
Es ist meistens besser eigene Spaltentypen in einer DLL unterzubringen. Die DLL brauchst du dann nur als Verweis hinzufügen und die neuen Spaltentypen stehen für alle DGV sofort zur Verfügung.
Ist zwar mehr Aufwand, lohnt sich aber. | |
Re: DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 18.06.14 08:08 |
| Morgen,
@powerzone3000
Ja das ist mir klar das es diese Möglichkeit gibt. Sie ist mir allerdings zu "unprofessionell" aber trotzdem danke.
@Kuno60
Ich habe mir deinen Vorschlag im MSDN mal angesehen. Leider gehen mir da die Kenntnisse aus. Wenn ich das richtig sehe wird von einer anderen Klasse geerbt. Kannst du das evtl. mir etwas näher bringen? Die Idee es in eine DLL zu verpacken hört sich gut an.
Kurz noch zu meinem Code:
If DataGridView1.CurrentCell.ColumnIndex <> _
DataSet1.DtDaten.DateianhangColumn.Ordinal Then
Return
End If Hier prüfe ich ob die current cell auch die column des Dateianhangs ist. Soweit funktioniert das auch. bei einem Klick in eine andere Spalte wird auch das return Statement aufgerufen. Nur wird immer noch ein Button angezeigt. Kann es sein das ich den irgendwie mit einem Event CellLeave disposen muss? | |
Re: DGV mit Button für FileOpenDialog | | | Autor: powerzone3000 | Datum: 18.06.14 12:53 |
| Hallo,
übrigens besteht dieses Problem auch im Beispiel von Frank Dzaebel, das du vermutlich als Vorlage verwendet hast.
Der Button wird in allen TextBoxColumns eingeblendet. Ich vermute das liegt daran, dass .NET hier für alle Spalten dieses Typs dasselbe EditingPanel verwendet.
Ein möglicher Workaround wäre z. B. den Button zu entfernen, sobald es sich um eine andere Spalte als die gewünschte handelt:
Dim sButtonName As String = "btnOpen"
If DataGridView1.CurrentCell.ColumnIndex = _
DataSet1.DtDaten.DateianhangColumn.Ordinal Then
Dim btn As New Button
With btn
.Dock = DockStyle.Right
.Name = sButtonName
.Text = "..."
.Width = 25
End With
If Not DataGridView1.EditingPanel.Controls.ContainsKey(btn.Name) Then
DataGridView1.EditingPanel.Controls.Add(btn)
End If
AddHandler btn.Click, AddressOf btn_click
btn.BringToFront()
Else
If DataGridView1.EditingPanel.Controls.ContainsKey(sButtonName) Then
DataGridView1.EditingPanel.Controls.RemoveByKey(sButtonName)
End If
End If | |
Re: DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 18.06.14 15:22 |
| Wow!
Das funktioniert bis jetzt einbandfrei. Habe es auf die Schnelle mal implementiert und kann nur sagen bis jetzt ohne Probleme.
Falls mir noch was auffällt werde ich Meldung machen.
Danke vielmals | |
Re: DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 23.06.14 15:17 |
| Ein kleines Problem ist mir doch noch aufgefallen.
Wenn ich über den Button etwas einlese wie einen Eingabepfad, schreibe ich die Daten nicht ins DGV sonder in die BindingSource vom DGV. Oder bin ich falsch informiert?
Wenn ich das mache und danach dieses Ereignis
Private Sub dgvKunde_CellValidating1(sender As Object, e As _
DataGridViewCellValidatingEventArgs) Handles dgvKunde.CellValidating aufrufen möchte passiert nichts. Die gerade per Button editierte Zelle zeigt Ihren Inhalt auch erste wenn die nächste Zelle editiert wird.
If dgvStammdaten.CurrentCell.ColumnIndex = _
DataSet1.Kunde.EingabepfadColumn.Ordinal Then
Dim Eingabepfad As String = ""
Dim openFileDialogEingabepfad As New OpenFileDialog()
With openFileDialogEingabepfad
.InitialDirectory = "C:\"
.RestoreDirectory = True
.Multiselect = False
End With
If openFileDialogEingabepfad.ShowDialog() = _
System.Windows.Forms.DialogResult.OK Then
Eingabepfad = openFileDialogEingabepfad.FileName
End If
Dim BsEingabepfad = DirectCast(DirectCast( _
KundeBindingSource.Current, DataRowView).Row, DtStammdatenRow)
BsEingabepfad.Eingabepfad = Eingabepfad
'MessageBox.Show(Eingabepfad) | |
Re: DGV mit Button für FileOpenDialog | | | Autor: powerzone3000 | Datum: 23.06.14 18:37 |
| Hi,
schön dass es soweit geklappt hat.
Ich weiß nicht genau was du mit dem Aufrufen des CellValidating-Ereignisses meinst, das wird normalerweise automatisch aufgerufen wenn die Zelle den Fokus verliert.
Versuch mal nach dem Setzen des Wertes EndEdit() auf die Row aufzurufen, dann sollte der Wert direkt sichtbar sein. Vielleicht löst das auch schon dein CellValidating-Problem.
Deine BsEingabepfad-Variable sollte übrigens row oder ähnliches heißen, denn es ist ja keine BindingSource sondern eine Row
z. B.:
Dim row = DirectCast(DirectCast(KundeBindingSource.Current, DataRowView).Row, _
DtStammdatenRow)
row.Eingabepfad = Eingabepfad
row.EndEdit() | |
Re: DGV mit Button für FileOpenDialog | | | Autor: ErfinderDesRades | Datum: 24.06.14 12:01 |
| Das modifizierte DGV scheint sich nun irregulär zu verhalten.
Normal, wenn eine DataRow-Property geändert wird, updated es sich.
Ich vermute, der Fehler liegt daran, dass das DGV zum Zeitpunkt der Datenänderung noch immer im Editmodus ist.
Also probier mal statt row.EndEdit DGV.CancelEdit.
(Rechtschreibfehler urheberrechtlich geschützt) | |
Re: DGV mit Button für FileOpenDialog | | | Autor: Sepp_81 | Datum: 24.06.14 14:19 |
| Ich überprüfe die Eingabe mit CellValidating. Also z. B. Könnte man hand der Namenseingabe prüfen od der Namen männlich oder weiblich ist.
Private Sub DataGridView1_CellValidating1(sender As Object, e As _
DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating DGV.CancelEdit funktioniert nicht. Dann steht nichts mehr in der Zelle. EndEdit löst das Problem auch nicht.
Danke
Beitrag wurde zuletzt am 24.06.14 um 14:22:51 editiert. | |
Re: DGV mit Button für FileOpenDialog | | | Autor: powerzone3000 | Datum: 24.06.14 17:39 |
| CellValidating sollte trotzdem aufgerufen werden, allerdings erst beim verlassen der Zelle, das ist so Standard.
Der einzige Unterschied zu einer "normalen" TextBox-Zelle ist: Diese verlässt du automatisch durch drücken der Enter oder Tabulator-Taste. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|