我正在研究一个突出显示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] 删除。
我来说两句