2

在我的 Winform 4.5 应用程序中,我有一个DataGridView第一列作为链接​​列。我想让所选链接单元格的链接颜色为白色。由于默认情况下所选行(或单元格)的背景颜色为蓝色,并且ForeColor所有链接的背景颜色也是蓝色的,因此当用户选择一行(或链接单元格)时,链接的文本不可读。我尝试编写以下代码,但它根本不会更改所选链接单元格的链接颜色。

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    foreach (DataGridViewLinkCell cell in ((DataGridView)sender).SelectedCells)
    {
        if (cell.ColumnIndex == 0)
        {
            if (cell.Selected)
            {
                cell.Style = new DataGridViewCellStyle()
                {
                    SelectionForeColor = SystemColors.HighlightText
                };
            }
        }
    }
}

然后我将上面的代码修改如下。但是它将所有链接的链接颜色更改为白色 - 这使得未选择的链接单元格不可读,因为这些链接的背景色也是白色:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewLinkCell cell in ((DataGridView)sender).SelectedCells)
        {
            if (cell.ColumnIndex == 0)
            {
                if (cell.Selected)
                {
                    cell.LinkColor = SystemColors.HighlightText;
                }
            }
        }
    }

我通过在 foreach 循环中设置断点并选择链接单元格来测试这两个代码。我注意到代码确实正确地通过了 foreach 循环的一次迭代。此外,我没有更改默认设置DataGridViewLinkColumn

编辑 默认情况下,DataGridView在行选择上看起来像这样。请注意,第二列中的单元格ForeColor变为白色,而不是第一列中的单元格: 在此处输入图像描述


我希望它在行选择中看起来像这样: 在此处输入图像描述

4

2 回答 2

1

编辑CellLeave事件将始终在尝试离开单元格时发生

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        foreach (DataGridViewLinkCell cell in 
            ((DataGridView) sender).SelectedCells.OfType<DataGridViewLinkCell>())
        {
            if (cell.Selected)
            {
                cell.LinkColor = SystemColors.HighlightText;
            }
        }

    }

    private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
    {
        foreach (DataGridViewLinkCell cell in
            ((DataGridView) sender).Rows[e.RowIndex].Cells.OfType<DataGridViewLinkCell>())
        {
            cell.LinkColor = cell.LinkVisited ? Color.Purple : Color.Blue;
        }
    }

结果

于 2014-09-01T05:55:39.787 回答
-1

我遇到了同样的问题,并且使用该CellFormatting事件使其正常工作。下面你会找到一个通用的解决方案:

void grd_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    SetGridLinkColor(sender as DataGridView, e.RowIndex, e.ColumnIndex, Color.White);
}

public static void SetGridLinkColor(DataGridView grd, int rowIndex, int columnIndex, Color selectedColor)
{
  if (grd == null || !(grd.Columns[columnIndex] is DataGridViewLinkColumn))
    return;

  if (grd.Rows[rowIndex].Selected)
  {
    ((DataGridViewLinkCell)grd.Rows[rowIndex].Cells[columnIndex]).LinkColor = selectedColor;
    ((DataGridViewLinkColumn)grd.Columns[columnIndex]).VisitedLinkColor = selectedColor;
  }
  else
  {
    Color color = ((DataGridViewLinkColumn)grd.Columns[columnIndex]).LinkColor;
    ((DataGridViewLinkCell)grd.Rows[rowIndex].Cells[columnIndex]).LinkColor = color;
    ((DataGridViewLinkColumn)grd.Columns[columnIndex]).VisitedLinkColor = color;
  }
}
于 2018-10-25T07:45:50.963 回答