从DataGridView WinForms中删除蓝色行

时间:2011-05-11 07:47:29

标签: c# .net winforms datagridview

当我逐行填充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;
        }
    }

在调试器中,我发现在DataGridViewParties.CurrentCell = null之前,CurrentCell已经为null;执行。

这个问题http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/c440c4f6-6dfc-47b6-97c0-1ce49c105b64/也与它有关,但没有提供解决方案。

编辑:它很奇怪,但它适用于Load事件,我在构造函数中执行它。 我希望当选择第一行并且当用户按下向上箭头键时,焦点移动到某个文本框。但在这种情况下它不起作用(第一行显示为蓝色)

    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();
        }
    }

5 个答案:

答案 0 :(得分:4)

要与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;
}

答案 1 :(得分:4)

我尝试了上述方法,但对我没什么用。

最后,我决定将所选单元格的默认颜色设置为与非选定单元格相同。

然后,在单元格单击方法中,我将它们设置回来。这样,在点击之前没有任何内容被选中,这对我的应用来说已经足够了。这是我在click方法中用来将所有内容恢复正常的代码:

dataGridView.DefaultCellStyle.SelectionBackColor = SystemColors.Highlight;
dataGridView.DefaultCellStyle.SelectionForeColor = SystemColors.Window;

令人讨厌的是,如果我把它放在一个按钮中,ClearSelection方法实际上工作正常,但如果我创建包含datagrid的控件,将一些数据加载到其中,然后尝试清除它,那么它不会工作。我希望我知道为什么......

答案 2 :(得分:2)

尝试将ClearSelection()添加到VisibleChanged事件,如下所示:

private void datagridview1_VisibleChanged(object sender, EventArgs e)
{
datagridview1.ClearSelection();
}

答案 3 :(得分:1)

经过三个小时的排查后,我发现了问题:在调用DataGridView之前,您的dataGridView.ClearSelection()需要在屏幕上显示。

我如何知道这是有效的:

我有两个DataGridViews,每个都在不同的面板中。一次只能看到一个面板。在最初可见的面板中,DataGridView从未忽略我对ClearSelection()的调用,因此我从未见过立即选择的行。

我曾经填充其他DataGridView并在显示包含它的面板之前清除其选择,但该顶行始终仍然突出显示。在清除DataGridView的选择之前,我更改了代码以显示其他面板,并且对ClearSelection()的调用正常工作。

答案 4 :(得分:1)

Form.Shown事件中只需执行:

dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;