How to disable Cell Highlighting in a datagridview, Highlighting should not happen even if I click on the cell.
Any thoughts please
How to disable Cell Highlighting in a datagridview, Highlighting should not happen even if I click on the cell.
Any thoughts please
The only way I ve found to "disable" highlighting is to set the SelectionBackColor
and the SelectionForeColor
in the DefaultCellStyle
to the same as the BackColor
and ForeColor
, respectively. You could probably do this programmatically on the form s Load
event, but I ve also done it in the designer.
Something like this:
Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
The ForeColor/BackColor kludge wasn t working for me, because I had cells of different colors. So for anyone in the same spot, I found a solution more akin to actually disabling the ability.
Set the SelectionChanged
event to call a method that runs ClearSelection
private void datagridview_SelectionChanged(object sender, EventArgs e)
{
this.datagridview.ClearSelection();
}
Did a quick websearch to find out how to make a datagridview selection non-selectable & got this (web page) hit.
Calling ClearSelection on SelectionChanged can and does cause a double firing of the SelectionChanged event, at minimum.
The first event is when the cell/row is selected and, of course, the SelectionChanged event is fired. The second firing is when ClearSelection is called as it causes (and logically so!) the selection of the datagridview to (again) changed (to no selection), thus firing SelectionChanged.
If you have more code than simply ClearSelection going on, as such I do, you ll want to suppress this event until after your code is done. Here s an example:
private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
//suppresss the SelectionChanged event
this.dgvMyControl.SelectionChanged -= dgvMyControl_SelectionChanged;
//grab the selectedIndex, if needed, for use in your custom code
// do your custom code here
// finally, clear the selection & resume (reenable) the SelectionChanged event
this.dgvMyControl.ClearSelection();
this.dgvMyControl.SelectionChanged += dgvMyControl_SelectionChanged;
}
in vb speak:
Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
datagridview1.ClearSelection()
End Sub
The quickest way to do this to handle cells with different colours, without needing to refire any events, would be to do something like this:
private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.SelectionBackColor = dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.BackColor
}
(EDIT)
actually, this needs to be done at time for data population. it doesn t appear to work in the on selection changed method. So after populating the data into the table, you need to iterate through the cells and change their selected background to match their normal background. Something like this (syntax may be a little off, I m converting it from my vb code):
foreach (datarow r in dgv.rows)
{
foreach (datacell c in r.cells)
{
c.Style.SelectionBackColor = c.Style.BackColor
}
}
Messing around and this also works, as i only want to change the cell background colour in the 2nd column when a cell is clicked:
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
Dim row As Integer = DataGridView1.CurrentCellAddress.Y
Dim column As Integer = DataGridView1.CurrentCellAddress.X
If column = 1 Then
Me.DataGridView1.CurrentCell.Selected = False
DataGridView1.Item(column, row).Style.BackColor = SelectColour()
End If
End Sub
Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged
Me.DataGridView1.ClearSelection()
End Sub
That s it. But if you still want to get clicked row/cell index or to access values:
Private Sub DataGridView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
Dim _ht As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(e.X, e.Y)
If _ht.Type = DataGridViewHitTestType.Cell Then
Me.DataGridView1.Rows(_ht.RowIndex).Cells(_ht.ColumnIndex).Value = _
"RowIndex = " & _ht.RowIndex & ", " & "ColumnIndex = " & _ht.ColumnIndex
End If
End Sub
Private Sub DGW2_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DGW2.DataBindingComplete
Dim mygrid As DataGridView
mygrid = CType(sender, DataGridView)
mygrid.ClearSelection()
End Sub
The answers I saw so far didn t give me exactly what I was looking for, but they showed me the right direction. In my case, after binding to a data source, the DGV selected and highlighted one cell, which I didn t want. I wanted to highlight only if the user selected the complete row.
After a while I found the following solution, which is working fine for me:
private void datagridview_SelectionChanged(object sender, EventArgs e)
{
var dgv = (DataGridView)sender;
if (dgv.SelectedCells.Count == 1)
{ // hide selection for the single cell
dgv.DefaultCellStyle.SelectionBackColor = dgv.DefaultCellStyle.BackColor;
dgv.DefaultCellStyle.SelectionForeColor = dgv.DefaultCellStyle.ForeColor;
}
else
{ // show the selected cells
dgv.DefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.SelectionBackColor;
dgv.DefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.SelectionForeColor;
};
}
Note: In my example, I have set the properties
MultiSelect = false, ReadOnly = true
because I am using the DGV just to display search results.
<DataGrid ItemsSource="{Binding Credits}" x:Name="Grid"
HorizontalAlignment="Left" RowBackground="Transparent">
I was wondering if someone can tell me what would be the best way to bring my application to the foreground if a mutex was not able to be created for a new instance. E.g.: Application X is running ...
I ve successfully created an app that minimizes to the tray using a NotifyIcon. When the form is manually closed it is successfully hidden from the desktop, taskbar, and alt-tab. The problem occurs ...
Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...
I have a DataTable that has several DataColumns and DataRow. Now i would like to handle an event when cell of this DataRow is changed. How to do this in c#?
How do you force a DataGridView to release its reference to a bound DataSet? We have a rather large dataset being displayed in a DataGridView and noticed that resources were not being freed after the ...
I am using VS2008 and creating forms. By default, the underscore of the character in a textbox when using an ampersand is not shown when I run the application. ex. "&Goto Here" is not ...
When I m trying to change the default Image of a Control on Windows Forms in Form Designer (no matter where on which control) I get this error: Error message: An item with the same key has ...
I have a Winforms application coded in VS C# 2008 and want to insert a WPF window into the window pane of Winforms application. Could you explain me how this is done.