gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:48:38 25 4
gpt4 key购买 nike

我正在处理一个项目,其中突出显示了 DataGridView 中的单元格。我想知道我是否可以在滚动条本身上做标记以指示这些亮点所在的位置。任何想法都可能有所帮助。

最佳答案

是、否和可能

根据this有可能的。但是,这只是一个链接答案;不确定那会导致..

:根据 Cody Gray 在他对 this post 的回答中的出色分析。无法在滚动条上绘画。

但是也许一种解决方法可以解决您的问题..?

思路是这样的:

您添加了一个薄的 Panel,它要么覆盖滚动条,要么将其自身附加到滚动条的左侧。我应该很瘦,超过滚动条的高度;它会使用通常的 Paint 事件重新绘制。

您保留一个行列表,应显示其标记。此列表在以下时间重新创建或维护:

  • 添加和删除
  • 改变你的目标行
  • 可能在排序或过滤时

这里有一些代码,只是概念的快速证明。为了获得更强大的解决方案,我想我会创建一个装饰器类,DataGridView 将注册到该类。

现在,当您将电梯移向标记时,您会找到目标行。有很大的改进空间,但我是一个开始......

您必须根据需要更改 isRowMarked() 函数。我选择测试第一个 Cell 的 Backcolor..

您还可以轻松地为不同的标记使用不同的颜色;也许通过从标记的行/单元格中复制它们。

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

注意 我已经删除了第一个答案,因为原始要求谈论的是“分数”,而不仅仅是“几个分数”。现在,第二个版本对我来说似乎更好。

关于c# - 在 DataGridView 垂直滚动条上绘制标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24391232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com