none
Bagaimana menghapus baris terpilih pada DataGridView?

    Question

  • Saya membuat satu column dengan type column DataGridViewCheckBoxColumn yang berguna untuk menandai baris yang akan dihapus pada DataGridView. Dan saya menaruh kode ini pada event button click hapus.

    For i As Integer = 0 To DataGridView1.Rows.Count - 1
                    If CInt(DataGridView1.Rows(i).Cells("CheckColumn").EditedFormattedValue) = 1 Then
                    Else
                        If DataGridView1.Rows(i).IsNewRow = False Then
                            DataGridView1.Rows.RemoveAt(i)
                        End If
                    End If
                Next

    Mohon di bantu yah master, karena saya menerima pesan kesalahan ini:

    "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"

    Pada baris : If CInt(DataGridView1.Rows(i).Cells("CheckColumn").EditedFormattedValue) = 1 Then



    Sunday, September 23, 2012 9:39 AM

Answers

  • Halo Indra,

    Jika ingin interasi pada sebuah datagridview dan pada kondisi tertentu, mendelete sebuah row, jangan pernah iterasi dari index kecil (row teratas). For each juga mengiterasi row dari index kecil ke besar, jadi jangan gunakan cara seperti itu juga. Ketika mengiterasi dan delete row pada kondisi tertentu, lakukan iterasi dari index terakhir ke pertama

    For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1
                    If CInt(DataGridView1.Rows(i).Cells("CheckColumn").EditedFormattedValue) = 1 Then
                    Else
                        If DataGridView1.Rows(i).IsNewRow = False Then
                            DataGridView1.Rows.RemoveAt(i)
                        End If
                    End If
                Next

    Kesalahan error pada coding anda karena apabila anda sudah mendelete sebuah row, i masih tetap akan looping sampai nilai datagridview1.rows.count ketika row nya belum di delete. Jadi pada akhirnya, i akan mencari sebuah row yang sebenarnya sudah di delete


    Friday, September 28, 2012 4:09 AM

All replies

  • Sebaiknya anda menggunakan for each ketimbang for integer, atau lebih tepatnya menggunakan referensi ketimbang menghitung dari 0 ke n. Supaya lebih jelasnya, ini contohnya:

    For Each a As DataGridViewRow In Me.DataGridView1.Rows
        If a.Cells(0).Value = True Then
            Me.DataGridView1.Rows.Remove(a)
        End If
    Next

    Silahkan di uji coba. Semoga sesuai keinginan anda.

    Sunday, September 23, 2012 10:37 AM
  • Sayangnya belum sesuai keinginan saya Mas, Wahyu VB .Net.

    Karena saya mendapatkan pesan kesalahan ini : "Uncommitted new row cannot be deleted."

    Selanjutnya saya menambahkan kode validasi apakah baris yang di hapus adalah bukan baris baru

    For Each a As DataGridViewRow In Me.DataGridView1.Rows If Cint(a.Cells(0).Value) = 1 and a.IsNewRow = False Then Me.DataGridView1.Rows.Remove(a) End If Next

    Hasilnya adalah tidak ada baris yang terhapus

    Kemudian saya merubah nilai cell ke - 0 menjadi 0

    For Each a As DataGridViewRow In Me.DataGridView1.Rows If Cint(a.Cells(0).Value) = 0 and a.IsNewRow = False Then Me.DataGridView1.Rows.Remove(a) End If Next

    Dan alhasil baris yang terhapus adalah baris yang tidak ditandai.

    Mohon bantuan pemecahan masalah ini kepada Mas Wahyu VB .Net

    Monday, September 24, 2012 6:16 AM
  • Sayangnya belum sesuai keinginan saya Mas, Wahyu VB .Net.

    Karena saya mendapatkan pesan kesalahan ini : "Uncommitted new row cannot be deleted."

    Selanjutnya saya menambahkan kode validasi apakah baris yang di hapus adalah bukan baris baru

    For Each a As DataGridViewRow In Me.DataGridView1.Rows If Cint(a.Cells(0).Value) = 1 and a.IsNewRow = False Then Me.DataGridView1.Rows.Remove(a) End If Next

    Hasilnya adalah tidak ada baris yang terhapus

    Kemudian saya merubah nilai cell ke - 0 menjadi 0

    For Each a As DataGridViewRow In Me.DataGridView1.Rows If Cint(a.Cells(0).Value) = 0 and a.IsNewRow = False Then Me.DataGridView1.Rows.Remove(a) End If Next

    Dan alhasil baris yang terhapus adalah baris yang tidak ditandai.

    Mohon bantuan pemecahan masalah ini kepada Mas Wahyu VB .Net

    error yang anda dapat, yaitu Uncommitted new row cannot be deleted, itu menandakan anda sedang membuat row yang baru. Sehingga row yang baru tersebut tidak bisa di delete.

    Sedangkan contoh menghapus row yang saya berikan ke anda adalah, diasumsikan kolom ke 0 adalah kolom yang bertipe check box. Sehingga saya hanya memberikan nilai true sebagai asumsi bahwa row bisa di delete.

    Yang perlu anda perhatikan adalah saya tidak tahu-menahu kolom apa saja yang ada di DataGridView milik anda. Kalo anda berkenan, coba anda beritahukan ke saya struktur DataGridView yang anda miliki.

    Monday, September 24, 2012 10:42 AM
  • Saya memang sedang membuat baris baru Mas, karena saya membuat Enable Adding untuk DataGridView ini. Jadi secara otomatis baris baru akan terbentuk, ketika saya menginput data pada baris terakhir.

    Kolom ke - 0 adalah kolom yang bertipe check box yang bernama "CheckColumn", seperti yang saya sebutkan pada penjelasan yang pertama kali, Mas.

    Dapat juga ditulis dengan kode seperti ini:

    For Each a As DataGridViewRow In Me.DataGridView1.Rows If Cint(a.Cells("CheckColumn").Value) = 1 and a.IsNewRow = False Then Me.DataGridView1.Rows.Remove(a) End If Next

    Dibawah ini adalah gambaran dari struktur DataGridView-nya.


    Jika Mas berkenan, silahkan dibalas.

    INDRA PRASETYA

    Monday, September 24, 2012 3:33 PM
  • Hi, INDRA PRASETYA

    Maksd anda ingin menghapus row data pada gridview seperti ini ya?

    agar bisa menselect row (baris) dari data yang ingin di hapus, anda harus mengganti properties, selectionmode' nya menjadi FullRowSelect.

    kalo coding delete nya disesuaikan dengan kebutuhan anda.

    semoga bisa membantu, jika ada pertanyaan silahakn di reply kembali

    kind regard

    • Proposed as answer by r aditya gumay Wednesday, September 26, 2012 11:30 AM
    • Unproposed as answer by INDRA PRASETYA Wednesday, September 26, 2012 3:10 PM
    Wednesday, September 26, 2012 11:30 AM
  • Hi, r aditya gumay

    Untuk mendelete harus ditandai terlebih dahulu pada DataGridViewCheckBoxColumn (Column(0)).

    Selanjutnya melakukan perintah delete dengan mengklik button hapus.

    Mohon bantu saya  untuk menciptakan kode yang tepat, seperti yang saya maksudkan.


    INDRA PRASETYA

    Wednesday, September 26, 2012 3:18 PM
  • Dear Om Indra Prasetya,

    coba deh copy paste kode dibawah ini:

    'buat araylist untuk menampung row yang ingin dihapus...
    Dim al As New ArrayList
    'buat looping sesuai jumlah row pada datagridview...
    For a As Integer = 0 To DataGridView1.RowCount - 1
        'diasumsikan kolom pertama yang memiliki check box...
        'bila check box bernilai true...
        If DataGridView1.Rows(a).Cells(0).Value = True Then
            'masukkan row kedalam arraylist...
            al.Add(Me.DataGridView1.Rows(a))
        End If
    Next
    'looping lagi, tetapi sesuai jumlah row yang tertampung dalam arraylist...
    For a As Integer = 0 To al.Count - 1
        'hapus row sesuai yang tercatat pada arraylist...
        DataGridView1.Rows.Remove(al(a))
    Next

    Kalo masih terjadi error juga, saya gak ngerti dengan situasi yang terjadi pada om. Maklumlah, kode yang saya buat tidak mengalami error sama sekali. Mudah-mudahan sesuai keinginan Om Indra Prasetya.

    • Proposed as answer by r aditya gumay Thursday, September 27, 2012 8:51 AM
    Thursday, September 27, 2012 12:51 AM
  • Hi, INDRA PRASETYA

    string kode_kamar, sql;
                
                // ingat pada data grid view propertiesnya dirubah, dan index dimulai dari NOL [0],[1],[2], dst
                kode_kamar = dataGridView1.Rows[dataGridView1.SelectedRows[0].Index].Cells[0].Value.ToString();

                Form1 xform1 = new Form1();
                try
                {
                    xform1.conn.Open();

                    sql = @"DELETE FROM room WHERE kode_kamar = " + kode_kamar;
                    SqlCommand cmd1 = new SqlCommand(sql, xform1.conn);
                    cmd1.ExecuteNonQuery();

                    MessageBox.Show("Data has been removed...", "Remove");
                }
                catch (SqlException ex)
                {
                    // statement event handling error
                }

    kind regard

    • Proposed as answer by r aditya gumay Friday, September 28, 2012 10:33 AM
    Thursday, September 27, 2012 8:59 AM
  • Halo Indra,

    Jika ingin interasi pada sebuah datagridview dan pada kondisi tertentu, mendelete sebuah row, jangan pernah iterasi dari index kecil (row teratas). For each juga mengiterasi row dari index kecil ke besar, jadi jangan gunakan cara seperti itu juga. Ketika mengiterasi dan delete row pada kondisi tertentu, lakukan iterasi dari index terakhir ke pertama

    For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1
                    If CInt(DataGridView1.Rows(i).Cells("CheckColumn").EditedFormattedValue) = 1 Then
                    Else
                        If DataGridView1.Rows(i).IsNewRow = False Then
                            DataGridView1.Rows.RemoveAt(i)
                        End If
                    End If
                Next

    Kesalahan error pada coding anda karena apabila anda sudah mendelete sebuah row, i masih tetap akan looping sampai nilai datagridview1.rows.count ketika row nya belum di delete. Jadi pada akhirnya, i akan mencari sebuah row yang sebenarnya sudah di delete


    Friday, September 28, 2012 4:09 AM