滚动控件的一部分(表单或面板)

时间:2015-11-16 19:03:12

标签: c# forms scroll panel

我自己绘制了一张表格,其中显示了表格的标题和正文内容(所有其他行都没有标题)。 该表格在表格或小组上绘图。

如果表格太长而且我向下滚动,则会在控件顶部再次绘制标题,这样我总能看到标题。 它运作良好,但问题是滚动时我看到如果向上滚动则标题向下移动,如果我向下滚动则消失。 (它发生了几毫秒,但它仍然困扰我)

这是绘画活动的编码:

    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 { }
    }

我抓住了一个我想解决的问题的例子(正如我所说,它出现了几毫秒,而不是自我修复) 第一张照片是有问题的,第二幅是固定的:

Double header table

Normal state

如果我只能滚动表格的正文部分,我的问题就会解决。

我该怎么做?

为什么重复的解释对我不起作用?

其中一个选项是使用LockWindowUpdate,如下面的代码所示:

    void TheControl_Scroll(object sender, ScrollEventArgs e)
    {
        LockWindowUpdate(TheControl.Handle);
        TheControl.Invalidate();
        LockWindowUpdate(IntPtr.Zero);
        TheControl.Update();
    }

除非在滚动部分实际完成后调用滚动事件,否则它应该是完美的,因此在滚动之后会发生冻结部分。 如果有人能告诉我怎么能在它发生前抓住滚动事件,它将解决我的问题。所以我会在滚动之前冻结控件并在它发生后释放它。

0 个答案:

没有答案