从 DataGridView WinForms 中删除蓝色行
本文关键字:蓝色 删除 DataGridView WinForms | 更新日期: 2023-09-27 17:55:55
当我逐行填充DataGridView(调用它的add函数)时,第一行变成蓝色。它没有被选中,因为我也尝试了 ClearSelection(),但它不起作用。它给人一种错误的错觉,即选择了第一行。
如何摆脱它?
void FillDGV()
{
dataGridViewParties.Rows.Clear();
for (int i = 0; i < dataGridViewParties.Columns.Count; i++)
{
dataGridViewParties.Columns[i].Width = this.Width / dataGridViewParties.Columns.Count;
}
DataTable partyTbl = UtilityClass.GetDataTable(@"SELECT [PartyID]
,[PartyName]
,[PartyAddress]
,[PartyState]
,[PartyCity]
,[PartyPhone]
FROM [VegiManager].[dbo].[Parties]
WHERE [PartyName] LIKE '" + textBoxPartySearch.Text + "%' ");
foreach (DataRow dr in partyTbl.Rows)
{
dataGridViewParties.Rows.Add(1);
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[0].Value = dr["PartyID"].ToString();
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[1].Value = dr["PartyName"].ToString();
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[2].Value = dr["PartyAddress"].ToString();
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[3].Value = dr["PartyState"].ToString();
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[4].Value = dr["PartyCity"].ToString();
dataGridViewParties.Rows[dataGridViewParties.Rows.Count - 1].Cells[5].Value = dr["PartyPhone"].ToString();
}
if (dataGridViewParties.Rows.Count > 0)
{
dataGridViewParties.ClearSelection();
dataGridViewParties.CurrentCell = null;
}
}
在调试器中,我发现 CurrentCell 在 DataGridViewParty.CurrentCell = null; 执行之前已经为空。
这个问题 http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/c440c4f6-6dfc-47b6-97c0-1ce49c105b64/也与此有关,但没有提供解决方案。
编辑:这很奇怪,但它适用于加载事件,我在构造函数中这样做。我希望当选择第一行并且当用户按向上箭头键时,焦点移动到某个文本框。但在这种情况下它不起作用(第一行显示为蓝色)
private void dataGridViewInwards_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && dataGridViewParties.SelectedRows.Count > 0 && dataGridViewParties.SelectedRows[0].Index == 0)
{
textBoxPartySearch.Focus();
dataGridViewParties.ClearSelection();
dataGridViewParties.CurrentCell = null;
}
else if (e.KeyCode == Keys.Up && dataGridViewParties.SelectedRows.Count == 0)
{
textBoxPartySearch.Focus();
}
}
要实现这一点以及ClearSelection
您需要再设置一个属性
在DataBindingComplete
试试这个
dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;
编辑
根据您的注释,您可以将代码修改为
if (e.KeyCode == Keys.Up && dataGridView1.CurrentCell.RowIndex == 0)
{
this.ActiveControl = textBoxPartySearch;
dataGridView1.Refresh();
dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;
e.Handled = true;
}
我尝试了上述方法,但没有任何效果。
最后,我决定将所选单元格的默认颜色设置为与非选定单元格相同。
然后,在单元格单击方法中,我将它们设置回来。这样,在单击之前不会显示任何选定状态,这对于我的应用程序来说已经足够了。这是我在 click 方法中使用的代码,用于将所有内容恢复正常:
dataGridView.DefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
dataGridView.DefaultCellStyle.SelectionForeColor = SystemColors.Window;
令人讨厌的是,如果我将 ClearSelect 方法放在按钮中,它实际上可以正常工作,但是如果我创建包含数据网格的控件,将一些数据加载到其中,然后尝试立即清除它,它不起作用。我希望我知道为什么...
尝试将 ClearSelection() 添加到 VisibleChanged 事件中,如下所示:
private void datagridview1_VisibleChanged(object sender, EventArgs e)
{
datagridview1.ClearSelection();
}
在Form.Shown
事件中,只需执行以下操作:
dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;
经过三个小时的故障排除,我已经弄清楚了:在呼叫dataGridView.ClearSelection()
之前,您的DataGridView
需要显示在屏幕上。
我怎么知道这有效:
我有两个DataGridViews
,每个在不同的面板中。 一次只能看到一个面板。 在最初可见的面板中,DataGridView
从未忽略我对ClearSelection()
的调用,因此我从未看到立即选择的行。
我曾经填充其他DataGridView
并在显示包含它的面板之前清除其选择,但顶行始终突出显示。在清除DataGridView
的选择之前,我更改了我的代码以显示另一个面板,并且对ClearSelection()
的调用正常工作。