Link to home
Start Free TrialLog in
Avatar of RIAS
RIASFlag for United Kingdom of Great Britain and Northern Ireland

asked on

Datagridview selection changed event

Hi,
I have a code on DataGridView1_SelectionChanged
    Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.SelectionChanged

       
        For Each r As DataGridViewRow In DataGridView1.SelectedRows
            r.Cells(0).Value = True
        Next

        DataGridView1.EndEdit()
        DataGridView1.Refresh()

The problem is that when I bind the grid with datatable its first row is selected by default which I deselect with clear selection on form load but even before that when it is just bound   DataGridView1.SelectionChanged
is called and keeps the forst row selected .Any way of stopping this event to be called everytime I have mouse down or is there any other alternative for selection changed event ?

Cheers
Avatar of RIAS
RIAS
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

Any suggestions on how to retain the selected rows.Because everytime I have mouse down on the row the entire previous selection wipes out.
in form load event
For i as integer=0 to Me.DatagridView.Rows.Count-1
Me.DatagridView.Rows(i).Cells(0).Value=False
next
Avatar of RIAS

ASKER

Hi,
Tried that but no good ..
sorry the checkboxcolun is databound?
Avatar of RIAS

ASKER

No it is not ..Cheers
in which column do you have the checkboxcolumn (in which column Index)
Avatar of RIAS

ASKER

It is added in datatable.But not a result of any query from database.
i just confused....
after populating your datagridview please try to set this kind of code
For i as integer=0 to Me.DatagridView.Rows.Count-1
Me.DatagridView.Rows(i).Cells(0).Value=False
next
ASKER CERTIFIED SOLUTION
Avatar of klakkas
klakkas

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of RIAS

ASKER

Will this not hamper the performance ..looping the entire grid ?
Avatar of klakkas
klakkas

Further, if you only want AutoCheck to be performed by mouse selection only, you can do the following:


    Private Sub DataGridView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
        'Enable autocheck on mouse down
        AllowAutoCheck = True
    End Sub

    Private Sub DataGridView1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseUp
        'Disable autocheck on mouse up
        AllowAutoCheck = False
    End Sub

Avatar of RIAS

ASKER

Hi klakkas,
That worked.Any suggestions on how to preserve the selected rows after having a mouse down on the grid as as soon as I have mouse down it looks that all my priviously selected  rows have disappeared...
 
Clicking on any row of the datagrid will Deselect all rows and Select the clicked row.

To avoid this, you can do several things:
1. Keep SHIFT pressed while clicking
2. Keep CTRL pressed while clicking
3. Always remember in your code the selected rows and when the DataGridView1_SelectionChanged event fires, programmatically add these rows to the selected.
Avatar of RIAS

ASKER

Hi,
Sorry for not making myself clear.
What I want to do is I select couple of rows by mouse dragging.Til here it works fine I have the 2 rows selected with true in my first column.Now i want to select 2 more rows by mouse dragging here --what happens is that I lose my previously selected rows and only have the current ones.
I need to keep those previously selected rows as well
 
If during the second mouse dragging you keep the CTRL key pressed, the previous selection will not be lost.

Try it and let me know.
Avatar of RIAS

ASKER

Is it possible without CTRL key as the second selection can be after some time as well and also this grid is on a tab control so the user might even chage tabs before he selects some new rows.
 
Cheers
@Rias
"The problem is that when I bind the grid with datatable its first row is selected by default which I deselect with clear selection on form load but even before that when it is just bound   DataGridView1.SelectionChanged
is called and keeps the forst row selected"
I thing you talking about different Subjects :)

@Rias Said that he has a problem with the first CheckBox which is always selected...
Maybe i missunderstood but the problem is how to diselect this one ...am i right ? Correct me If so....

In this case you should go the 3rd suggestion:
3. Always remember in your code the selected rows and when the DataGridView1_SelectionChanged event fires, programmatically add these rows to the selected.

    Dim SelectedIndices As New List(Of Integer)
    Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.SelectionChanged


        If AllowAutoCheck = True Then
            For Each r As DataGridViewRow In DataGridView1.SelectedRows
                r.Cells(0).Value = True
                If SelectedIndices.Contains(r.Index) = False Then
                    SelectedIndices.Add(r.Index)
                End If
            Next

            For Each ind As Integer In SelectedIndices
                If DataGridView1.Rows(ind).Selected = False Then
                    DataGridView1.Rows(ind).Selected = True
                End If
            Next

            DataGridView1.EndEdit()
            DataGridView1.Refresh()
        End If
    End Sub


Note that this way, you will never be able to De-Select a row via mouse clicks. In order to De-Select, you will have to programmatically remove the rowIndex from the SelectedIndices List.
Avatar of RIAS

ASKER

Yes jtoutou you are right.  the problem is how to diselect this one.
Your help and interest is appreciated.Will be right back after lunch break in 1 hour .
Cheers mate
@jtoutou

In order to understand better this thread, read RIA S previous one:
https://www.experts-exchange.com/questions/26480217/Multiple-select-on-datagridview.html
I've read it already ..the question is what about when '"multiselection" change ..does the checkboxes return to false after that???
ok here we are.....
new form as form1
and a datagridview
Imports System.Text
Imports System.Windows.Forms
Public Class Form1
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim checkCol As New DataGridViewCheckBoxColumn
        checkCol.Name = "Test"
        Dim txtcol As New DataGridViewTextBoxColumn
        Me.DataGridView1.Columns.Insert(0, txtcol)
        Me.DataGridView1.Columns.Insert(1, checkCol)
        Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        For i As Integer = 0 To 10
            Me.DataGridView1.Rows.Add(i, i)
        Next
        For j As Integer = 0 To Me.DataGridView1.Rows.Count - 1
            Me.DataGridView1.Rows(j).Cells(1).Value = False
        Next
    End Sub

    Private Sub DataGridView1_CellMouseLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellMouseLeave
        Dim cbxCell2 As DataGridViewCheckBoxCell

        For Each DGVRows2 In DataGridView1.SelectedRows
            cbxCell2 = CType(DGVRows2.Cells(1), DataGridViewCheckBoxCell)
            If cbxCell2.Value Then
                cbxCell2.Value = False

            End If
        Next
    End Sub

   

   
    Private Sub DataGridView1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.SelectionChanged
        Dim cbxCell As DataGridViewCheckBoxCell

        For Each DGVRows In DataGridView1.SelectedRows
            cbxCell = CType(DGVRows.Cells(1), DataGridViewCheckBoxCell)
            If Not cbxCell.Value Then
                cbxCell.Value = True
            
            End If
        Next
        
    End Sub
End Class

Open in new window

some small corections and i'll comeback...there are mistakes.....!!
Avatar of RIAS

ASKER

Thanks jtoutou
Avatar of RIAS

ASKER

Hi klakkas,
Your suggestion  on Dim SelectedIndices As New List(Of Integer) is good but I see a long procedure in maintaing the rows selected and deselected.Will cell formatting help me in this ?