DataGridview

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von vbmatze.

    DataGridview

    Hallöchen liebe VB-Community.

    Ich habe ein Problem^^

    Habe ein DataGridview mit 3 Spalten. Ich wollte in der dritten Spalte Passwörter generieren lassen und in den Spalten 1 und 2 kann der User dann zusätzliche Informationen angeben. Ebenso ist es möglich NUR die Passwörter zu löschen (für denn fall das einem ein Passwort nicht gefällt o.ä.)

    Wenn der User also erneut auf den Button klickt, sollen bei bestehenden Zeilen NUR die Passwörter erneuert werden. Ich weiss jetzt aber nicht wie ich das realisieren kann. Ich finde den Befehl nicht, nur die Zellen der dritten Spalte zu befüllen OHNE die Werte der Zellen aus Spalte 1 und 2 zu löschen bzw zu überschreiben. Ich habe einen Ansatz der wie folgt aussieht:

    Brainfuck-Quellcode

    1. 'Button "Generieren"
    2. '-------------------
    3. Private Sub Bgen_Click(sender As System.Object, e As System.EventArgs) Handles Bgen.Click
    4. Dim m As Object
    5. If Me.DataSet1.DataTable1.Rows.Count > 0 Then
    6. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    7. m = zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value))
    8. System.Threading.Thread.Sleep(20)
    9. WAS MUSS HIER HIN?????????
    10. System.Threading.Thread.Sleep(10)
    11. Next f
    12. Else
    13. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    14. m = zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value))
    15. System.Threading.Thread.Sleep(20)
    16. DataSet1.DataTable1.AddDataTable1Row(Nothing, Nothing, CStr(m))
    17. System.Threading.Thread.Sleep(10)
    18. Next f
    19. End If
    20. End Sub


    Der ELSE-Teil funktionier problemlos. Ich hätte gerne gewusst, welchen Code ich an die Stelle "WAS MUSS HIER HIN?" schreiben soll. Habe diverses ausprobiert aber nie das richtige ;)

    Vielen Dank für eure Hilfe schon mal im Voraus.

    LG vbmatze

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „vbmatze“ ()

    ich frag mich, was die ganzen leerzeilen sollen. Hast du einen extrem hohen Bildschirm oder codest du immer Klassen mit weniger als 50 Zeilen?


    Ich finde den Befehl nicht, nur die Zellen der dritten Spalte zu befüllen OHNE die Werte der Zellen aus Spalte 1 und 2 zu löschen bzw zu überschreiben.
    also eine bestimmte Zelle im DGV addressiert man mit

    VB.NET-Quellcode

    1. dim cell=DGV(columnIndex, rowIndex)


    eine bestimmte Zelle der aktuellen Row:

    VB.NET-Quellcode

    1. dim cell=DGV.CurrentRow.Cells(columnIndex)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Silas88vD schrieb:

    Als erstes frage ich mich warum du den Thread immer schlafen legst. Ist dir dein PC zu schnell oder möchtest du ihm bloß eine Pause gönnen?




    Nun die Threads sind nötig, da ohne die Unterteilung in Threads immer das selbe Passwort generiert wurde.

    ich frag mich, was die ganzen leerzeilen sollen. Hast du einen extrem hohen Bildschirm oder codest du immer Klassen mit weniger als 50 Zeilen?


    Mein Bildschirm ist nen Laptopschirm 16:9 bei 15,6 Zoll. Die Leerzeilen waren erst NACHDEM ich den Post reingestellt habe. In der Bearbeitungsansicht waren da noch keine Leerzeilen drin. Und der Code den ich gepostet habe ist nur ein Teil des Codes aus der ganzen Klasse. Vielen lieben Dank für deinen Ansatz @ ErfinderDesRades, ich werde das gleich mal ausporbieren und mich melden wenn ich etwas erreicht habe oder auch nicht :rolleyes: .

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vbmatze“ ()

    un die Threads sind nötig, da ohne die Unterteilung in Threads immer das selbe Passwort generiert wurde.

    Ich denke du wirst wohl die Klasse Random benutzen. Das Problem wird sein, dass du vor jedem Passwort generieren ein new auf die Klasse machst und das sehr oft sehr schnell hintereinander. Deswegen kommt immer dasselbe raus. Statt den Thread schlafen zu legen wäre es wohl schlau das Objekt der Klasse Random zu speichern um das ständige "new" zu verhindern.
    Ich denke du wirst wohl die Klasse Random benutzen.

    Ja genau so mache ich es.

    Statt den Thread schlafen zu legen wäre es wohl schlau das Objekt der Klasse Random zu speichern um das ständige "new" zu verhindern.


    Das hört sich sehr interessant an. Was müsste ich denn dafür machen?
    Ich würde die Funktion zum Passwort generieren in eine Klasse packen und dort auch den (Pseudo)-Zufallszahlengenerator halten.
    Etwa so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class PasswGenerator
    2. ''' <summary>
    3. ''' Zufallszahlengenerator
    4. ''' </summary>
    5. ''' <remarks></remarks>
    6. Private _rnd As Random
    7. ''' <summary>
    8. ''' Konstruktor
    9. ''' </summary>
    10. ''' <remarks></remarks>
    11. Public Sub New()
    12. _rnd = New Random
    13. End Sub
    14. ''' <summary>
    15. ''' Gibt ein zufälliges Passwort (Zahl zwischen 1 und 100) zurück
    16. ''' </summary>
    17. ''' <returns></returns>
    18. ''' <remarks></remarks>
    19. Public Function GenerateRandomPassw() As String
    20. Return _rnd.Next(1, 100).ToString
    21. End Function
    22. End Class



    Der Aufruf wäre dann so:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. 'Instanz der Klasse wird nur einmal erzeugt und damit auch nur einmal der Generator
    4. Dim pwGen As New PasswGenerator
    5. For index = 1 To 10
    6. Console.WriteLine(pwGen.GenerateRandomPassw)
    7. Next
    8. Console.ReadKey()
    9. End Sub
    10. End Module

    Vielen herzlichen Dank Silas88vD, ich werde es mal testen und mich dann nochmal melden.
    Ok habe mal ein wenig gebastelt...

    VB.NET-Quellcode

    1. Public Class zufallsgenerator
    2. Private _z As Random
    3. Public Sub New()
    4. _z = New Random
    5. End Sub
    6. Function zufallstring(ByVal input As String, ByVal anzzeichen As Integer) As String
    7. Dim strgb As New System.Text.StringBuilder
    8. Dim zeichenarray() As Char = input.ToCharArray
    9. For i As Integer = 1 To anzzeichen
    10. Dim p As Integer = _z.Next(0, zeichenarray.Length)
    11. strgb.Append(zeichenarray(p))
    12. Next
    13. Return strgb.ToString
    14. End Function
    15. End Class


    ...und hier das Generieren

    VB.NET-Quellcode

    1. 'Button "Generieren"
    2. '-------------------
    3. Private Sub Bgen_Click(sender As System.Object, e As System.EventArgs) Handles Bgen.Click
    4. Dim m As New zufallsgenerator
    5. Dim zelle = Me.DataGridView1()
    6. Dim c As Integer
    7. If Me.DataSet1.DataTable1.Rows.Count > 0 Then
    8. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    9. c = f - 1
    10. m.zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value))
    11. zelle(2, c).Value = m
    12. Next f
    13. Else
    14. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    15. m.zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value))
    16. DataSet1.DataTable1.AddDataTable1Row(Nothing, Nothing, m.ToString())
    17. Next f
    18. End If
    19. End Sub


    Nun die Sache funktioniert soweit....nur wird mir in den entsprechenden Zeilen "WindowsApplication1.zufallsgenerator" angezeigt anstatt das Passwort.
    Ich denke das liegt hier dran: DataSet1.DataTable1.AddDataTable1Row(Nothing, Nothing, m.ToString())

    Ich werde wohl die ToString-Methode überschreiben müssen...nur weiss ich nicht wie...irgendwie muss ja da dann die Information aus dem StringBuilder rein oder?

    Wäre Klasse wenn ihr mir hier noch helfen könntet
    --------------------------------------------------------------------------------------------
    Gelöst habe ich die Sache ohne die ToString-Methode zu überschreiben...

    VB.NET-Quellcode

    1. 'Button "Generieren"
    2. '-------------------
    3. Private Sub Bgen_Click(sender As System.Object, e As System.EventArgs) Handles Bgen.Click
    4. Dim m As New zufallsgenerator
    5. Dim zelle = Me.DataGridView1()
    6. Dim c As Integer
    7. If Me.DataSet1.DataTable1.Rows.Count > 0 Then
    8. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    9. c = f - 1
    10. zelle(2, c).Value = m.zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value))
    11. Next f
    12. Else
    13. For f As Integer = 1 To CInt(NUDap.Value) Step 1
    14. DataSet1.DataTable1.AddDataTable1Row(Nothing, Nothing, m.zufallstring("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!§$%&/", CInt(NUDaz.Value)))
    15. Next f
    16. End If
    17. End Sub

    Noch ne Frage für Zwischendurch

    Gibt es eine Möglichkeit die Spalten im DataSet auch als Link zu formatieren? Habe bei den Eigenschaften verschiedene Datentypen gefunden aber kein Link. Ich dachte mir das so, das eine eingegebene Webadresse in einen Link gewandelt wird und wenn der User drauf klickt das sich dann der Browser mit der entsprechenden Webseite öffnet. Kann mir da evtl. jemand sagen wie ich sinvoll vorgehen kann?
    Die Spalten im Dataset formatiert man eh nicht. Tatsächlich hat Dataset garkeine Spalten, sondern hat Tabellen. Aber auch die Spalten einer DataTable formatiert man nicht, sondern man legt einen Datentyp dafür fest. Aber erstens ist Link kein Datentyp, und 2. kann man auf eine DataTable nicht klicksen - das geht nur mittm DataGridView.

    Also zu unterscheiden zwischen Daten und Steuerelementen ist schon eminent wichtig.
    Naja, man kann auch LinkColumns ins DGV einbasteln, seh ich grade.

    LinkColumn nicht zu bearbeiten

    Huhu, also ich habe da jetzt mal ne LinkColumn reingesetzt, allerdings besteht dann keine Möglichkeit etwas in die entsprechende Spalte einzutragen. Was ich daran nicht verstehe ist: Warum? Die Spalte steht nicht auf "ReadOnly". Hat hier noch jemand ne Idee woran das liegen mag?