.net 在 datagridview 中禁用单元格突出显示
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1745272/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Disable Cell Highlighting in a datagridview
提问by Ramji
How to disable Cell Highlighting in a datagridview, Highlighting should not happen even if I click on the cell.
如何在 datagridview 中禁用单元格突出显示,即使我单击单元格也不应该发生突出显示。
Any thoughts please
任何想法请
回答by Derek H
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.
ForeColor/BackColor kludge 对我不起作用,因为我有不同颜色的单元格。因此,对于同一地点的任何人,我找到了一个更类似于实际禁用该能力的解决方案。
Set the SelectionChangedevent to call a method that runs ClearSelection
设置SelectionChanged事件以调用运行的方法ClearSelection
private void datagridview_SelectionChanged(object sender, EventArgs e)
{
this.datagridview.ClearSelection();
}
回答by jheddings
The only way I've found to "disable" highlighting is to set the SelectionBackColorand the SelectionForeColorin the DefaultCellStyleto the same as the BackColorand ForeColor, respectively. You could probably do this programmatically on the form's Loadevent, but I've also done it in the designer.
我发现为“禁用”,突出的唯一方法是设置SelectionBackColor并SelectionForeColor在DefaultCellStyle相同的作为BackColor和ForeColor分别。您可能可以在表单的Load事件上以编程方式执行此操作,但我也在设计器中完成了此操作。
Something like this:
像这样的东西:
Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
回答by KCromm
Did a quick websearch to find out how to make a datagridview selection non-selectable & got this (web page) hit.
做了一个快速的网络搜索,以找出如何使 datagridview 选择不可选择并得到这个(网页)点击。
Calling ClearSelection on SelectionChanged can and does cause a double firing of the SelectionChanged event, at minimum.
在 SelectionChanged 上调用 ClearSelection 可以并且确实导致 SelectionChanged 事件的双重触发,至少。
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.
第一个事件是选择单元格/行时,当然,会触发 SelectionChanged 事件。第二次触发是在调用 ClearSelection 时,因为它导致(逻辑上如此!)数据网格视图的选择(再次)更改(无选择),从而触发 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:
如果您有更多的代码而不仅仅是 ClearSelection 正在进行,就像我所做的那样,您将希望在您的代码完成之前抑制此事件。下面是一个例子:
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;
}
回答by LairdPleng
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):
实际上,这需要在数据填充时完成。它似乎不适用于 on selection changed 方法。因此,在将数据填充到表格中后,您需要遍历单元格并更改它们选择的背景以匹配它们的正常背景。像这样的东西(语法可能有点不对,我是从我的 vb 代码转换过来的):
foreach (datarow r in dgv.rows)
{
foreach (datacell c in r.cells)
{
c.Style.SelectionBackColor = c.Style.BackColor
}
}
回答by Coder22
in vb speak:
在 vb 中说:
Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
datagridview1.ClearSelection()
End Sub
回答by DrSerhat
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
回答by Data
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
回答by LowLevel
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
回答by Matt
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.
到目前为止,我看到的答案并没有给我确切的答案,但它们为我指明了正确的方向。就我而言,在绑定到数据源后,DGV 选择并突出显示了一个我不想要的单元格。我只想在用户选择完整行时突出显示。
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.
因为我使用 DGV 只是为了显示搜索结果。
回答by Youngsun An
<DataGrid ItemsSource="{Binding Credits}" x:Name="Grid"
HorizontalAlignment="Left" RowBackground="Transparent">

