vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
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)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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