none
Doppelte Checkbox und Namensliste RRS feed

  • Frage

  • Hallo, ich muss aus einer Access Tabelle auf einer Form eine Namenliste darstellen die folgender massen aussieht.
    Checkbox|Checkbox|Nachname Vorname
    Checkbox|Checkbox|Nachname Vorname
    Checkbox|Checkbox|Nachname Vorname

    man kann die ganze Liste durchgehen und man hat die Möglichkeit die Checkboxen anzuklicken, die ganze Liste muss ich in einer anderen Tabelle ablegen und auch wieder laden können.
    Wie stelle ich das am besten an? Eine Listcheckbox kann ich ja schon mal nicht nehmen, oder?

     

    Mittwoch, 25. August 2010 18:49

Antworten

  • Hallo Michael,

    Hallo Peter, ne ich meinte aus einer Tabelle kommen
    die Namen (Name,Vorname) damit möchte ich ein
    Grid oder anderes aufbauen in der Form

    Hier mal ein kleines Beispiel.
    Kopiere den Code einfach in ein leeres Formmodul (Form1.vb)

    ' / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents DGV As DataGridView
        Private TextBox1 As TextBox

        Private WithEvents mDT As DataTable
        Private WithEvents mDV As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
            CreateData()

            DGV.DataSource = mDV
            With DGV
                .Columns(0).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleRight

                .Columns(2).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter

                .Columns(4).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter

                .AutoResizeColumns()
            End With
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow
            Dim DC As DataColumn

            Dim VNames As String() = _
                    New String() _
                    {"Otto", "Maria", "Fritz", _
                     "Klara", "Hans", "Klaus"}

            Dim NNames As String() = _
                    New String() _
                    {"Müller", "Berger", "Maier", _
                     "Huber", "Moser", "Schreiner"}

            mDT = New DataTable
            With mDT
                .Namespace = "mDT"
                DC = .Columns.Add("ID", GetType(Integer))
                DC.Unique = True

                DC = .Columns.Add("VorName", GetType(String))
                DC.AllowDBNull = False

                DC = .Columns.Add("chkVN", GetType(Boolean))
                DC.DefaultValue = False

                DC = .Columns.Add("NachName", GetType(String))
                DC.AllowDBNull = False

                DC = .Columns.Add("chkNN", GetType(Boolean))
                DC.DefaultValue = False

                For i = 0 To VNames.GetUpperBound(0)
                    DR = .NewRow
                    DR.Item(0) = i + 1
                    DR.Item(1) = VNames(i)
                    DR.Item(2) = False
                    DR.Item(3) = NNames(i)
                    DR.Item(4) = False
                    .Rows.Add(DR)
                Next
            End With
            mDV = New DataView(mDT)
        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 60)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

            End With
            Me.Controls.Add(DGV)

            TextBox1 = New TextBox
            With TextBox1
                .Name = "TextBox1"
                .Font = New Font("Arial", 12)

                .SetBounds _
                        (10, DGV.Bottom + 10, _
                         DGV.Width, .Height)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .ReadOnly = True
            End With
            Me.Controls.Add(TextBox1)
            Me.Size = New Size(400, 320)
        End Sub

        Private Sub DGV_CellContentClick _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
                ) Handles DGV.CellContentClick

            ShowValues(e.RowIndex)
        End Sub

        Private Sub DGV_RowEnter _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
                ) Handles DGV.RowEnter

            If e.RowIndex = DGV.Rows.Count - 1 Then
                DGV.Rows(e.RowIndex).Cells(0).Value = NewID()
            End If
            ShowValues(e.RowIndex)
        End Sub

        Private Sub ShowValues(ByVal RowIndex As Integer)
            With DGV.Rows(RowIndex)
                TextBox1.Text = _
                    "ID " & .Cells(0).EditedFormattedValue.ToString & ": " & _
                    .Cells(1).EditedFormattedValue.ToString & ": " & _
                    .Cells(2).EditedFormattedValue.ToString & " | " & _
                    .Cells(3).EditedFormattedValue.ToString & ": " & _
                    .Cells(4).EditedFormattedValue.ToString
            End With
        End Sub

        Public Function NewID() As Integer
            Return DGV.Rows.Count
        End Function

        Private Sub DGV_DataError _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs _
                ) Handles DGV.DataError

            MsgBox(e.Exception.Message)
            e.Cancel = True
        End Sub

        Private Sub DGV_RowValidating _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs _
                ) Handles DGV.RowValidating

            Dim DRV As DataRowView = _
                    mDV.Item(e.RowIndex)

            Dim DR As DataRow = DRV.Row
            If DRV.IsNew Then
                If RowOK(DR) Then
                    DRV.EndEdit()
                Else
                    Exit Sub
                End If
            End If

            Console.WriteLine _
                    (DR.Item(0).ToString & "; " & _
                     DR.Item(1).ToString & "; " & _
                     DR.Item(2).ToString & "; " & _
                     DR.Item(3).ToString)
        End Sub

        Private Function RowOK(ByVal DR As DataRow) As Boolean
            Dim Ret As Boolean = False
            Select Case False
                Case IsNumeric(DR.Item(0))
                Case DR.Item(1).ToString.Length > 0
                Case (DR.Item(3).ToString.Length > 0)
                Case Else
                    Ret = True
            End Select
            Return Ret
        End Function
    End Class
    ' \\\ E N T E

    Jede Änderung in einer der beiden CheckBoxColumns wird
    sofort in der Sub ShowValues sichttbar.

    Sub DGV_RowValidating() wäre ein geeigneter Zeitpunkt
    Änderungen in der mDT in eine zweite DataTable mit den
    Spalten ID, chkVN und chkNN zu übernehmen und diese
    DataTable kannst Du dann zu einem beliebigen Zeitpunkt
    in Deine DB übernehmen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 26. August 2010 10:08

Alle Antworten

  • Hallo Michael,

    Hallo, ich muss aus einer Access Tabelle auf einer Form eine
    Namenliste darstellen die folgender massen aussieht.
    Checkbox|Checkbox|Nachname Vorname
    Checkbox|Checkbox|Nachname Vorname
    Checkbox|Checkbox|Nachname Vorname

    man kann die ganze Liste durchgehen und man hat die
    Möglichkeit die Checkboxen anzuklicken, die ganze Liste
    muss ich in einer anderen Tabelle ablegen und auch
    wieder laden können.
    Wie stelle ich das am besten an? Eine Listcheckbox kann
    ich ja schon mal nicht nehmen, oder?

    So ganz verstehe ich den Zusammenhang zwischen Deiner
    Namensliste in der DB-Tabelle und den Checkboxen (noch)
    nicht.
    Soll es für jeweils einen Nach- u. einen Vornamen zwei
    Checkboxen geben?
    Also sowas in der Art:

        x  Müller            x  Fritz
        o  Maier            x  Franz
        x  Huber           o  Maria
        x  Schneider    x  Paula

    In einem DataGridView mit je zwei Checkbox-Columns und
    zwei Textbox-Columns liesse sich das recht einfach darstellen.
    Wie konkret (FeldNamen, FeldTypen) sieht diese Namensliste
    in der DB aus? Und wie genau soll die Ausgabetabelle aussehen?

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 25. August 2010 19:41
  • Hallo Peter, ne ich meinte aus einer Tabelle kommen die Namen (Name,Vorname)
    damit möchte ich ein Grid oder anderes aufbauen in der Form

    Checkbox|Checkbox|Nachname Vorname|ID Hidden
    Checkbox|Checkbox|Nachname Vorname|ID Hidden
    Checkbox|Checkbox|Nachname Vorname|ID Hidden

    Die Checkboxen wären neu und dynamisch im dem neuen Gridview oder anderem . Das Ergebnis soll in einer anderen Tabelle gespeichert werden . Nach der Art
    Check1,check2,id auf Tabelle1

    Mittwoch, 25. August 2010 20:00
  • Hi Michael,
    wenn du der Tabelle per Code booleasche Spalten hinzufügst, dann werden CheckBoxes angezeigt. Deren Inhalt kann man abfragen. Unklar ist aus Deinen Ausführungen aber die Bedientechnologie. Wann soll eine Kopie oder ein Verweis in ein zweite Liste eingetregen werden, um diese im zweiten Grid anzuzeigen. Mögloch wäre da ein Button_Klick am Ende aller Markierungen, ein Contectmenü mit entsprechendem Eintrag, ein Doppelklick auf den gewünschten Eintrag usw.
     

    --
    Viele Gruesse
    Peter

    Donnerstag, 26. August 2010 05:00
  • Hallo Michael,

    Hallo Peter, ne ich meinte aus einer Tabelle kommen
    die Namen (Name,Vorname) damit möchte ich ein
    Grid oder anderes aufbauen in der Form

    Hier mal ein kleines Beispiel.
    Kopiere den Code einfach in ein leeres Formmodul (Form1.vb)

    ' / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents DGV As DataGridView
        Private TextBox1 As TextBox

        Private WithEvents mDT As DataTable
        Private WithEvents mDV As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
            CreateData()

            DGV.DataSource = mDV
            With DGV
                .Columns(0).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleRight

                .Columns(2).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter

                .Columns(4).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter

                .AutoResizeColumns()
            End With
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow
            Dim DC As DataColumn

            Dim VNames As String() = _
                    New String() _
                    {"Otto", "Maria", "Fritz", _
                     "Klara", "Hans", "Klaus"}

            Dim NNames As String() = _
                    New String() _
                    {"Müller", "Berger", "Maier", _
                     "Huber", "Moser", "Schreiner"}

            mDT = New DataTable
            With mDT
                .Namespace = "mDT"
                DC = .Columns.Add("ID", GetType(Integer))
                DC.Unique = True

                DC = .Columns.Add("VorName", GetType(String))
                DC.AllowDBNull = False

                DC = .Columns.Add("chkVN", GetType(Boolean))
                DC.DefaultValue = False

                DC = .Columns.Add("NachName", GetType(String))
                DC.AllowDBNull = False

                DC = .Columns.Add("chkNN", GetType(Boolean))
                DC.DefaultValue = False

                For i = 0 To VNames.GetUpperBound(0)
                    DR = .NewRow
                    DR.Item(0) = i + 1
                    DR.Item(1) = VNames(i)
                    DR.Item(2) = False
                    DR.Item(3) = NNames(i)
                    DR.Item(4) = False
                    .Rows.Add(DR)
                Next
            End With
            mDV = New DataView(mDT)
        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 60)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

            End With
            Me.Controls.Add(DGV)

            TextBox1 = New TextBox
            With TextBox1
                .Name = "TextBox1"
                .Font = New Font("Arial", 12)

                .SetBounds _
                        (10, DGV.Bottom + 10, _
                         DGV.Width, .Height)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

                .ReadOnly = True
            End With
            Me.Controls.Add(TextBox1)
            Me.Size = New Size(400, 320)
        End Sub

        Private Sub DGV_CellContentClick _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
                ) Handles DGV.CellContentClick

            ShowValues(e.RowIndex)
        End Sub

        Private Sub DGV_RowEnter _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellEventArgs _
                ) Handles DGV.RowEnter

            If e.RowIndex = DGV.Rows.Count - 1 Then
                DGV.Rows(e.RowIndex).Cells(0).Value = NewID()
            End If
            ShowValues(e.RowIndex)
        End Sub

        Private Sub ShowValues(ByVal RowIndex As Integer)
            With DGV.Rows(RowIndex)
                TextBox1.Text = _
                    "ID " & .Cells(0).EditedFormattedValue.ToString & ": " & _
                    .Cells(1).EditedFormattedValue.ToString & ": " & _
                    .Cells(2).EditedFormattedValue.ToString & " | " & _
                    .Cells(3).EditedFormattedValue.ToString & ": " & _
                    .Cells(4).EditedFormattedValue.ToString
            End With
        End Sub

        Public Function NewID() As Integer
            Return DGV.Rows.Count
        End Function

        Private Sub DGV_DataError _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs _
                ) Handles DGV.DataError

            MsgBox(e.Exception.Message)
            e.Cancel = True
        End Sub

        Private Sub DGV_RowValidating _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs _
                ) Handles DGV.RowValidating

            Dim DRV As DataRowView = _
                    mDV.Item(e.RowIndex)

            Dim DR As DataRow = DRV.Row
            If DRV.IsNew Then
                If RowOK(DR) Then
                    DRV.EndEdit()
                Else
                    Exit Sub
                End If
            End If

            Console.WriteLine _
                    (DR.Item(0).ToString & "; " & _
                     DR.Item(1).ToString & "; " & _
                     DR.Item(2).ToString & "; " & _
                     DR.Item(3).ToString)
        End Sub

        Private Function RowOK(ByVal DR As DataRow) As Boolean
            Dim Ret As Boolean = False
            Select Case False
                Case IsNumeric(DR.Item(0))
                Case DR.Item(1).ToString.Length > 0
                Case (DR.Item(3).ToString.Length > 0)
                Case Else
                    Ret = True
            End Select
            Return Ret
        End Function
    End Class
    ' \\\ E N T E

    Jede Änderung in einer der beiden CheckBoxColumns wird
    sofort in der Sub ShowValues sichttbar.

    Sub DGV_RowValidating() wäre ein geeigneter Zeitpunkt
    Änderungen in der mDT in eine zweite DataTable mit den
    Spalten ID, chkVN und chkNN zu übernehmen und diese
    DataTable kannst Du dann zu einem beliebigen Zeitpunkt
    in Deine DB übernehmen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 26. August 2010 10:08
  • Hey super danke, damit klappt es. Kleine Modifizierungen aber sowas habe ich gesucht.
    Donnerstag, 26. August 2010 19:32
  • Hallo Michael,

    Hey super danke, damit klappt es.
    Kleine Modifizierungen aber sowas
    habe ich gesucht.

    Schön, wenns geholfen hat.
    Unter

        www.gssg.de -> Visual Basic -> VB.net

    findest Du noch mehr Beispiele zum DataGridView
    sowie zu DataTable, DataView usw.
    Evtl. ist da noch der eine oder andere Denkanstoss
    für Dein Projekt dabei.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 27. August 2010 07:41