我自己绘制了一张表格,其中显示了表格的标题和正文内容(所有其他行都没有标题)。 该表格在表格或小组上绘图。
如果表格太长而且我向下滚动,则会在控件顶部再次绘制标题,这样我总能看到标题。 它运作良好,但问题是滚动时我看到如果向上滚动则标题向下移动,如果我向下滚动则消失。 (它发生了几毫秒,但它仍然困扰我)
这是绘画活动的编码:
void TheControl_Paint(object sender, PaintEventArgs e)
{
DrawTable(e.Graphics);
}
public void DrawTable(Graphics dc)
{
try
{
FontMeasureHeight = dc.MeasureString("ABCD", FontForTable).Height;
Rectangle? ClientArea = null;
if (isTableConactedToControl)
ClientArea = TheControl.ClientRectangle;
if (ClientArea != null)
{
lock (Rows)
{
foreach (TableRow Row in Rows)
{
if (Row.isRowToShow || Row.IsHeaderRow)
{
if (ClientArea != dc.ClipBounds)
if (Row.Cells.Count > 0 && !GetColumnToHide(0))
if (Row.Cells[0].CellPoint.Y + Row.Cells[0].CellSize.Height + TheControl.DisplayRectangle.Location.Y >= dc.ClipBounds.Top)
{
if (Row.Cells[0].CellPoint.Y + TheControl.DisplayRectangle.Location.Y > dc.ClipBounds.Bottom)
break;
}
else
continue;
foreach (TableCell Cell in Row.Cells)
{
Cell.DrawCell(dc, TheControl.DisplayRectangle.Location, ClientArea);
}
}
}
}
if (isFreezingHeader)
{
lock (Rows)
{
foreach (TableRow Row in Rows)
{
if (!Row.IsHeaderRow)
break;
foreach (TableCell Cell in Row.Cells)
{
Cell.DrawCell(dc, TheControl.DisplayRectangle.Location, ClientArea, true);
}
}
}
}
if (TheControl is Form)
ScrolledPosition = (TheControl as Form).AutoScrollPosition;
else if (TheControl is Panel)
ScrolledPosition = (TheControl as Panel).AutoScrollPosition;
CurrentWindowHeight = TheControl.Size.Height;
}
}
catch { }
}
我抓住了一个我想解决的问题的例子(正如我所说,它出现了几毫秒,而不是自我修复) 第一张照片是有问题的,第二幅是固定的:
如果我只能滚动表格的正文部分,我的问题就会解决。
我该怎么做?
为什么重复的解释对我不起作用?
其中一个选项是使用LockWindowUpdate,如下面的代码所示:
void TheControl_Scroll(object sender, ScrollEventArgs e)
{
LockWindowUpdate(TheControl.Handle);
TheControl.Invalidate();
LockWindowUpdate(IntPtr.Zero);
TheControl.Update();
}
除非在滚动部分实际完成后调用滚动事件,否则它应该是完美的,因此在滚动之后会发生冻结部分。 如果有人能告诉我怎么能在它发生前抓住滚动事件,它将解决我的问题。所以我会在滚动之前冻结控件并在它发生后释放它。