locked
[TANYA] Cara Memilih Random Row Pada DatagridView RRS feed

  • Pertanyaan

  • saya jelasi dulu kasus nya..
    sebelumnya saya coba buat program dan Saya menggunakan Komponen Toolbox dari DevExpress, berupa GridControl, komponen tersebut = DatagridView. (Berikut Screenshot nya).



    Nah, Dari Form itu, saya ingin membuat bagaimana supaya program dapat Memilih Data secara Acak dari GridControl. ( Select Random Row ). 
    untuk Kode nya, saya menggunakan code berikut :

    Dim Detik As Integer
    Dim NoSpin As Integer
    Dim RandNo As Random
    
    '----Menampilkan Data Dari Database ke GridControl.
    Private Sub IsiGridData()
    Using Konek As New Koneksi.Koneksi
    If Konek.OpenFromFile(General.Constant.ConfigPath) Then
    Using da As New MySql.Data.MySqlClient.MySqlDataAdapter("Select no as 'SPIN_NO', id as 'ID_SPIN'FROM SPIN ORDER BY NO ASC", Konek.OKoneksi)
    Dim DT As New DataTable
    da.Fill(DT)
    GridControl1.DataSource = DT
    'GridControl1.Refresh()
    End Using
    End If
    End Using
    End Sub
    

    '----Code Pada Button GET RANDOM untuk mengaktifkan Timer1 dan timer2
    Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton2.Click
    IsiGridData()
    TextEdit2.Text = 5 'Lama Waktu Yang Diberikan untuk memlih 1 row.
    Detik = CInt(TextEdit2.Text)
    Timer1.Start()
    Timer2.Start()
    End Sub

    '----Code Pada Timer1 ---
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    If TextEdit2.Text > CInt(0) Then
    TextEdit2.Text = Detik
    For i As Integer = 0 To GridView1.RowCount - 1
    RandNo = New Random
    NoSpin = RandNo.Next(CInt(GridView1.GetDataRow(i)(0)))
    Next
    TextEdit1.Text = NoSpin
    End If
    If TextEdit2.Text = CInt(0) Then
    Timer1.Stop()
    Timer2.Stop()
    End If
    End Sub
    
    '----Code Pada Timer2 ----
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    Detik -= 1
    TextEdit2.Text = Detik
    If Detik = 0 Then
    Timer2.Stop()
    End If
    End Sub
    
    '----End Code ----

    Code Diatas Sudah Berhasil Untuk Memilih Data secara Acak (Selected Random Row ) dari GridControl. Akan Tetapi, Suatu Saat Akan Terjadi Dimana row Yang Sudah Terpilih, Nantinya Jika Di Klik Button "GET RANDOM", Akan Terpilih Kembali.

    yang ingin saya tanyakan, Bagaimana Cara/Code untuk membuat program supaya saat dilakukan proses GET Random, Maka Akan Dipilih Satu data (Selected Random Row ), Dan jika Di tekan button "GET RANDOM" kembali akan melakukan proses Get Random, Namun, Row Yang Sudah Terpilih Sebelumnya Tidak Akan terpilih Kembali Pada Proses Get Random Selanjutnya.?

    Thank's...

    Kamis, 12 Desember 2013 07.55

Jawaban

  • Hi Ari

    Mohon maaf atas keterlambatan membalas forum ini

    Karena kamu menggunakan software DevExpress, saya jadi tidak bisa test untuk keseluruhan kodenya

    Saya hanya dapat menggunakan DataGridView control untuk testing. Dan database nya saya menggunakan Ms SQL
    Kita bisa menggunakan sebuah ArrayList untuk store index yang sudah tampil sebelumnya, kemudian buat sebuah fungsi untuk cek jika baris tersebut sudah dipilih sebeleumnya

    Imports System.Data.SqlClient
    
    Public Class Form1
        Dim Detik As Integer
        Dim NoSpin As Integer
        Dim RandNo As Random
    
        '----Menampilkan Data Dari Database ke GridControl.
        Private Sub IsiGridData()
            Dim connectionString As String = "Data Source=127.0.0.1;Initial Catalog=dbtest;MultipleActiveResultSets=False;User ID=****;Password=****"
            Dim strSql As String = "Select no as 'SPIN_NO', id as 'ID_SPIN' FROM SPIN ORDER BY NO ASC"
            Dim dtb As New DataTable
            Using cnn As New SqlConnection(connectionString)
                cnn.Open()
                Using dad As New SqlDataAdapter(strSql, cnn)
                    dad.Fill(dtb)
                    DataGridView1.DataSource = dtb
                    DataGridView1.Refresh()
                End Using
                cnn.Close()
            End Using
        End Sub
    
        Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton2.Click
            IsiGridData()
            TextEdit1.Text = 5
            Detik = CInt(TextEdit1.Text)
            Timer1.Start()
            Timer2.Start()
        End Sub
    
        Dim record As New ArrayList
    
        Private Function IsSelectedRow(ByVal value As Integer) As Boolean
            If record.Count > 0 Then
                For Each i As Integer In record
                    If i = value Then
                        Return True
                    End If
                Next
            End If
            
            Return False
        End Function
    
        '----Code Pada Timer1 ---
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Detik <> 0 Then
                Timer1.Interval = Detik * 1000
            End If
    
            If TextEdit1.Text > CInt(0) Then
                TextEdit1.Text = Detik
                RandNo = New Random
                While 1 <> 0
                    NoSpin = RandNo.Next(DataGridView1.RowCount - 1)
                    If IsSelectedRow(NoSpin) = False Then
                        record.Add(NoSpin)
                        DataGridView1.Rows(NoSpin).Selected = True
                        'MessageBox.Show(NoSpin.ToString())
                        TextEdit2.Text = DataGridView1.Rows(NoSpin).Cells(0).Value
                        Exit While
                    End If
                End While
            End If
            If TextEdit1.Text = CInt(0) Or record.Count = DataGridView1.RowCount - 1 Then
                Timer1.Stop()
                Timer2.Stop()
            End If
        End Sub
    
        '----Code Pada Timer2 ----
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            If Detik <> 0 Then
                Timer2.Interval = Detik * 1000
            End If
            Detik -= 1
            TextEdit1.Text = Detik
            If Detik = 0 Then
                Timer2.Stop()
            End If
        End Sub
    End Class
    

    Terima kasih


    Andy Nugraha

    TechNet Community Support

    Rabu, 18 Desember 2013 06.07
    Moderator

Semua Balasan

  • need solution nya.... :-D
    Jumat, 13 Desember 2013 07.34
  • Mungkin bisa dilakukan pencatatan mas, pada data yang sudah pernah di random. Kira-kira itu solusinya

    Salam

    Xan To

    Selasa, 17 Desember 2013 12.25
  • Hi Ari

    Mohon maaf atas keterlambatan membalas forum ini

    Karena kamu menggunakan software DevExpress, saya jadi tidak bisa test untuk keseluruhan kodenya

    Saya hanya dapat menggunakan DataGridView control untuk testing. Dan database nya saya menggunakan Ms SQL
    Kita bisa menggunakan sebuah ArrayList untuk store index yang sudah tampil sebelumnya, kemudian buat sebuah fungsi untuk cek jika baris tersebut sudah dipilih sebeleumnya

    Imports System.Data.SqlClient
    
    Public Class Form1
        Dim Detik As Integer
        Dim NoSpin As Integer
        Dim RandNo As Random
    
        '----Menampilkan Data Dari Database ke GridControl.
        Private Sub IsiGridData()
            Dim connectionString As String = "Data Source=127.0.0.1;Initial Catalog=dbtest;MultipleActiveResultSets=False;User ID=****;Password=****"
            Dim strSql As String = "Select no as 'SPIN_NO', id as 'ID_SPIN' FROM SPIN ORDER BY NO ASC"
            Dim dtb As New DataTable
            Using cnn As New SqlConnection(connectionString)
                cnn.Open()
                Using dad As New SqlDataAdapter(strSql, cnn)
                    dad.Fill(dtb)
                    DataGridView1.DataSource = dtb
                    DataGridView1.Refresh()
                End Using
                cnn.Close()
            End Using
        End Sub
    
        Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton2.Click
            IsiGridData()
            TextEdit1.Text = 5
            Detik = CInt(TextEdit1.Text)
            Timer1.Start()
            Timer2.Start()
        End Sub
    
        Dim record As New ArrayList
    
        Private Function IsSelectedRow(ByVal value As Integer) As Boolean
            If record.Count > 0 Then
                For Each i As Integer In record
                    If i = value Then
                        Return True
                    End If
                Next
            End If
            
            Return False
        End Function
    
        '----Code Pada Timer1 ---
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Detik <> 0 Then
                Timer1.Interval = Detik * 1000
            End If
    
            If TextEdit1.Text > CInt(0) Then
                TextEdit1.Text = Detik
                RandNo = New Random
                While 1 <> 0
                    NoSpin = RandNo.Next(DataGridView1.RowCount - 1)
                    If IsSelectedRow(NoSpin) = False Then
                        record.Add(NoSpin)
                        DataGridView1.Rows(NoSpin).Selected = True
                        'MessageBox.Show(NoSpin.ToString())
                        TextEdit2.Text = DataGridView1.Rows(NoSpin).Cells(0).Value
                        Exit While
                    End If
                End While
            End If
            If TextEdit1.Text = CInt(0) Or record.Count = DataGridView1.RowCount - 1 Then
                Timer1.Stop()
                Timer2.Stop()
            End If
        End Sub
    
        '----Code Pada Timer2 ----
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            If Detik <> 0 Then
                Timer2.Interval = Detik * 1000
            End If
            Detik -= 1
            TextEdit1.Text = Detik
            If Detik = 0 Then
                Timer2.Stop()
            End If
        End Sub
    End Class
    

    Terima kasih


    Andy Nugraha

    TechNet Community Support

    Rabu, 18 Desember 2013 06.07
    Moderator
  • terima kasih,, sudah saya coba solusinya dan berhasil...

    Jumat, 20 Desember 2013 07.40