在DataGridView垂直滚动条上绘制标记

纳卡沙

我正在研究一个突出显示DataGridView中单元格的项目。我想知道是否可以在滚动条上做标记以指示这些突出显示在哪里。任何想法可能会有所帮助。

塔瓦

是,否,也许

是的:据此,是可能的。但是,这是仅链接的答案;不知道会导致什么。

否:根据科迪·格雷(Cody Gray)的出色分析,他不可能在滚动条上回答此帖子

但是,也许有一种解决方法可以解决您的问题。

这是想法:

您添加了Panel一个覆盖滚动条或将其自身附加到滚动条左侧的细线我应该很瘦,要越过摇把的高度;它会与通常的Paint事件一起重绘。

您保留行列表,应为其显示标记。在以下条件下重新创建或维护此列表:

  • 添加和删​​除 Rows
  • 更改目标行
  • 可能在排序或过滤时

这里有一些代码,只是概念的快速证明。对于更强大的解决方案,我想我将创建一个装饰器类,该类将向其DataGridView注册。

现在,将升降机移向标记处时,将找到目标行。有很大的改进空间,但是开始。

您必须根据需要更改isRowMarked()功能。我选择测试第一个单元的背景色。

您还可以轻松地将不同的颜色用于不同的标记。可能是通过从标记的行/单元格复制它们来实现的。

public Form1()
{
    InitializeComponent();

    dataGridView1.Controls.Add(indicatorPanel);
    indicatorPanel.Width = 6;
    indicatorPanel.Height = dataGridView1.ClientSize.Height - 39;
    indicatorPanel.Top = 20;
    indicatorPanel.Left = dataGridView1.ClientSize.Width - 21;
    indicatorPanel.Paint += indicatorPanel_Paint;
    dataGridView1.Paint += dataGridView1_Paint;
}

Panel indicatorPanel = new Panel();
List<DataGridViewRow> tgtRows = new List<DataGridViewRow>();

void dataGridView1_Paint(object sender, PaintEventArgs e)
{
    indicatorPanel.Invalidate();
}

void indicatorPanel_Paint(object sender, PaintEventArgs e)
{   // check if there is a HScrollbar
    int hs = ((dataGridView1.ScrollBars & ScrollBars.Vertical) != ScrollBars.None ? 20 : 0);

    e.Graphics.FillRectangle(Brushes.Silver, indicatorPanel.ClientRectangle);
    foreach (DataGridViewRow tRow in tgtRows)
    {
        int h = (int)(1f * (indicatorPanel.Height - 20 + hs) * tRow.Index 
                         / dataGridView1.Rows.Count);
        e.Graphics.FillRectangle(Brushes.Red, 0, h-3, 6, 4);
    }
}

bool isRowMarked(DataGridViewRow row)
{
    return row.Cells[0].Style.BackColor == Color.Red;  // <<-- change!
}

// call in: dataGridView1_RowsRemoved, dataGridView1_RowsAdded
// also whenever you set or change markings and after sorting or a filtering
void findMarkers()
{
    tgtRows.Clear();
    foreach (DataGridViewRow row in dataGridView1.Rows)
        if (isRowMarked(row) ) tgtRows.Add(row); 
    indicatorPanel.Invalidate();
}

请注意,我删除了第一个答案,因为最初的要求是说“标记”而不仅仅是“几个标记”。现在,第二个版本对我来说似乎更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在滚动条上绘制曲线SVG

来自分类Dev

在滚动条上绘制文本

来自分类Dev

如何加快垂直滚动条标记的渲染

来自分类Dev

如何向下滚动JScrollPane上的垂直滚动条?

来自分类Dev

如何向下滚动JScrollPane上的垂直滚动条?

来自分类Dev

删除垂直滚动条

来自分类Dev

在闪亮的仪表板上禁用垂直滚动条

来自分类Dev

在滚动条上移动垂直线

来自分类Dev

使用skrollr在滚动条上绘制SVG

来自分类Dev

QScrollArea:垂直滚动条引起的水平滚动条

来自分类Dev

垂直滚动条不滚动

来自分类Dev

DatagridView不显示水平滚动条

来自分类Dev

DatagridView不显示水平滚动条

来自分类Dev

DataGridView滚动条未显示

来自分类Dev

Bootstrap:如何禁用垂直滚动条?

来自分类Dev

CSS-垂直滚动条删除

来自分类Dev

段落产生垂直滚动条

来自分类Dev

如何强制显示垂直滚动条?

来自分类Dev

QTreeWidget垂直滚动条跳得太远

来自分类Dev

Jekyll Rouge中的垂直滚动条

来自分类Dev

Bootstrap:如何禁用垂直滚动条?

来自分类Dev

ItemsControl缺少垂直滚动条

来自分类Dev

CSS-垂直滚动条删除

来自分类Dev

无法获得活动的垂直滚动条

来自分类Dev

图例框的垂直滚动条

来自分类Dev

UWP垂直滚动条未显示

来自分类Dev

向表格垂直添加滚动条

来自分类Dev

如何在UWP上隐藏列表视图垂直滚动条?

来自分类Dev

-webkit- textarea在垂直滚动条上丢失顶部和底部填充