Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

DataGridView και διπλό κλικ

Îåêßíçóå áðü ôï ìÝëïò emkal21. Τελευταία δημοσίευση από το μέλος emkal21 στις 23-08-2011, 11:44. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-08-2011, 10:36 66852

    DataGridView και διπλό κλικ

    Καλημέρα παιδιά!

    Αρχικά επιτρέψτε μου να πω πως αυτό το forum είναι από τα καλύτερα developer forums που έχω δει!

    Τώρα μπαίνω στο ψητό:
    Χρησιμοποιώ Visual Basic 2010 και προσπαθώ να φτιάξω ένα πρόγραμμα που στην πραγματικότητα θα είναι ένα Address Book. Το πρόγραμμα διαθέτει τις παρακάτω φόρμες:

    • frmHomePage.vb  --> Η αρχική φόρμα του προγράμματος που έχει ένα DataGridView με όλα τα contacts που έχει καταχωρήσει ο χρήστης.
    • frmNewContact.vb  --> Η φόρμα στην οποία ο χρήστης καταχωρεί μια νέα εγγραφή (contact).
    • frmAbout.vb  --> Το filename είναι μάλλον self-explanatory!! Big Smile
    • frmViewContact.vb  --> Η φόρμα στην οποία (φιλοδοξώ) να εμφανίζεται αναλυτικά μια contact (δηλ. όλα τα πεδία που αφορούν αυτή την επαφή).

    Για χάριν ευχρηστίας, δεν θέλω να εμφανίζονται όλα τα fields (columns) στο DataGridView της frmHomePage.vb. Αυτό που θέλω, όμως, είναι να κάνω διπλό κλικ σε ένα row του DataGridView και να ανοίγει η frmViewContact.vb με όλα τα στοιχεία (fields) που αφορούν το contact που διπλοκλίκαρα. Το πρόγραμμα χρησιμοποιεί μια .sdf database που δημιούργησα κατ' ευθείαν από το Visual Studio 2010.

    Σας ευχαριστώ εκ των προτέρων!

    Φιλικά,
    Αιμίλιος Καλαντζής
  •  20-08-2011, 17:21 66862 σε απάντηση της 66852

    Απ: DataGridView και διπλό κλικ

    Σε αυτές τις περιπτώσεις (στην εμφάνιση δεδομένων) συνήθως χρησιμοποιούμε listview control και όχι datagrid, με διπλό click στο listview ο χρήστης θα "μπει" στην φόρμα της διαχείρισης και θα κάνει τις αλλαγές που θέλει. Το datagrid χρησιμοποιείται όταν θέλουμε να καταχωρήσουμε master detail data πχ πελάτη και παραγγελίες. Δεν έχει σημασία βέβαια το τί χρησιμοποιουμε συνήθως αλλά το τι θέλουμε να κάνουμε.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    Option Strict On
    
    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim colID As New DataGridViewTextBoxColumn
            Dim colDesc As New DataGridViewTextBoxColumn
            Dim ds As New DataSet
            Dim dt As New DataTable("MyTable")
            Dim r As DataRow
    
            dt.Columns.Add("ID", GetType(Integer))
            dt.Columns.Add("DESCRIPTION", GetType(String))
    
            ds.Tables.Add(dt)
    
            For i As Integer = 1 To 10
                r = ds.Tables(0).NewRow
    
                r.Item("ID") = i
                r.Item("DESCRIPTION") = "Desc" & i
    
                ds.Tables(0).Rows.Add(r)
            Next
    
            ds.Tables(0).AcceptChanges()
    
            Me.DataGridView1.DataSource = ds.Tables(0)
        End Sub
    
        Private Sub DataGridView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick
    
            If TypeOf e Is MouseEventArgs Then
                Dim meArgs As MouseEventArgs = CType(e, MouseEventArgs)
    
                ' 1 δες που έκανε διπλό click
                Dim htInfo As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(meArgs.X, meArgs.Y)
    
                If htInfo.Type = DataGridViewHitTestType.Cell OrElse
                    htInfo.Type = DataGridViewHitTestType.RowHeader _
                Then
                    Dim curManager As CurrencyManager = CType(Me.DataGridView1.BindingContext(Me.DataGridView1.DataSource), CurrencyManager)
                    Dim dRow As DataRow = CType(curManager.List(htInfo.RowIndex), DataRowView).Row ' 2 Πάρε το datarow
    
                    If dRow.IsNull("ID") Then
                        ' Αν δεν κάνεις cancel θα προστεθεί μία γραμμή με null ID 
                        curManager.CancelCurrentEdit()
                        Return
                    End If
    
                    ' TODO 3 Δείξε το στην φόρμα σου
                    MessageBox.Show(dRow.Item("ID").ToString & " " & dRow.Item("DESCRIPTION").ToString)
                Else
                    Return
                End If
            End If
    
        End Sub
    End Class

     

     

     

     

  •  21-08-2011, 13:41 66864 σε απάντηση της 66862

    Απ: DataGridView και διπλό κλικ

    Ευχαριστώ πολύ!! It worked like a charm!! Η διαδικασία για το ListView είναι η ίδια;
  •  21-08-2011, 23:41 66867 σε απάντηση της 66864

    Απ: DataGridView και διπλό κλικ

    Το windows listview δεν έχει datasource property και δεν γνωρίζω κάποιον άλλο τρόπο να σου προτείνω (ίσως από WPF;), αλλά σίγουρα το να γεμίσεις ένα listview με μία λίστα από τιμές δεν είναι δύσκολο. Αν δεν βρεις κάποιον καλύτερο τρόπο μπορείς είτε να κληρονομήσεις το listview και να φτιάξεις δικό σου datasource property, ή να φτιάξεις ένα method (Fill) και να το γεμίσεις με loop στο datasource. Το παρακάτω παράδειγμα σου γεμίζει ένα listview από ένα datatable χρησιμοποιώντας extensions. Τα extension methods μας επιτρέπουν να προσθέσουμε λειτουργικότητα σε ένα αντικείμενο χωρίς να χρειαστεί να το κληρονομήσουμε (δεν χρειάζεται να το κάνουμε έτσι απλά μπορεί να σου φανεί χρήσιμο στους δικούς σου τύπους και περνάει και η ώρα Big Smile).

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    ' File Name: modListviewExtensions.vb
    
    Option Strict On
    Imports System.Runtime.CompilerServices
    
    Namespace ListViewExtensions
        Friend Module ModListViewExtensions
            <Extension()>
            Friend Sub Fill(ByVal lv As ListView,
                            ByVal table As DataTable,
                            ByVal primaryKey As String,
                            ByVal fields() As String,
                            ByVal onFill As Action(Of Integer, ListViewItem))
                Dim strFieldValues(fields.Length - 1) As String
                Dim i As Integer
                Dim c As Integer
                Dim lst As ListViewItem
    
                lv.BeginUpdate()
    
                For Each r As DataRow In table.Rows
                    For i = 0 To fields.Length - 1
                        strFieldValues(i) = CType(r.Item(fields(i)), String)
                    Next
    
                    ' Μπορείς να βάλεις το primary key sto tag 
                    lst = New ListViewItem(strFieldValues) With {.Tag = CType(r.Item(primaryKey), Integer)}
    
                    If Not onFill Is Nothing Then
                        c += 1
                        onFill(c, lst)
                    End If
    
                    lv.Items.Add(lst)
                Next
    
                lv.EndUpdate()
            End Sub
        End Module
    End Namespace

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Option Strict On
    Imports GridDoubleClick.ListViewExtensions ' Αν δεν το βάλεις αυτό δεν θα βρίσκει το extension.
    
    Public Class Form1
        Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
            Dim dt As New DataTable
            Dim r As DataRow
    
            dt.Columns.Add("ID", GetType(Integer))
            dt.Columns.Add("DESCRIPTION", GetType(String))
            dt.Columns.Add("SHORT_DESCRIPTION", GetType(String))
            dt.Columns.Add("DATE", GetType(DateTime))
    
            For i As Integer = 1 To 10000
                r = dt.NewRow
    
                r.Item("ID") = i
                r.Item("DESCRIPTION") = "Desc" & i
                r.Item("SHORT_DESCRIPTION") = "Short desc" & i
                r.Item("DATE") = Now
    
                dt.Rows.Add(r)
            Next
    
            dt.AcceptChanges()
    
            Me.ListView1.View = System.Windows.Forms.View.Details
            Me.ListView1.FullRowSelect = True
            Me.ListView1.GridLines = True
    
            Me.ListView1.Columns.Add("Short Description", 150)
            Me.ListView1.Columns.Add("Description", 150)
            Me.ListView1.Columns.Add("Sample Date", 150)
    
            ' Extension method
            Me.ListView1.Fill(dt,
                              "ID",
                              New String() {"SHORT_DESCRIPTION", "DESCRIPTION", "DATE"},
                              AddressOf onFill)
    
            dt.Dispose()
            dt = Nothing
        End Sub
    
        Private Sub onFill(ByVal i As Integer, ByVal lst As ListViewItem)
            If i Mod 2 = 0 Then
                lst.BackColor = Color.WhiteSmoke
            End If
        End Sub
    
        Private Sub ListView1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDoubleClick
            MessageBox.Show("ID = " & Me.ListView1.SelectedItems(0).Tag.ToString)
        End Sub
    End Class

     

     

     

     

     

     

  •  22-08-2011, 10:29 66869 σε απάντηση της 66867

    Απ: DataGridView και διπλό κλικ

    Και αυτό δουλεύει τέλεια! Το θέμα είναι πώς εμφανίζω στο MessageBox τα υπόλοιπα στοιχεία (Short Description, Description, Sample Date)...

    Ευχαριστώ πολύ για το χρόνο σας!
  •  22-08-2011, 23:07 66882 σε απάντηση της 66869

    Απ: DataGridView και διπλό κλικ

    Με το SubItems property του listview item μπορείς να δείξεις όποιο πεδίο θέλεις.

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       Private Sub ListView1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDoubleClick
            Dim lst As ListViewItem = Me.ListView1.SelectedItems(0)
    
            MessageBox.Show("ID = " & lst.Tag.ToString &
                            " " & lst.SubItems(0).Text &
                            " " & lst.SubItems(1).Text &
                            " " & lst.SubItems(2).Text)
    
        End Sub

    Ο σκοπός όμως που μας ενδιαφέρει μόνο το ID είναι ότι μπορούμε να "σηκώσουμε" όλα τα άλλα tables που σχετίζονται με την master εγγραφή που έχουμε. Φαντάσου ότι το listview δείχνει εγγραφές από ένα view αλλά η διαχείριση μίας εγγραφής χρειάζεται άλλους 10 πίνακες. Με διπλό click ο χρήστης παίρνει το ID και με αυτό γίνεται select από την Βάση δεδομένων, δείχνωντας την φόρμα διαχείρισης-ενημέρωσης με όλους τους συσχετιζόμενους πίνακες.

     

  •  23-08-2011, 11:44 66888 σε απάντηση της 66882

    Απ: DataGridView και διπλό κλικ

    Σας ευχαριστώ πάρα πολύ για τις πολύτιμες και κατατοπιστικές συμβουλές σας!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems