24

高さ 300 ピクセルのパネルに高さ 400 ピクセルの DataGridView を配置して、パネルにスクロール バーを表示する場合は、下にスクロールしてグリッドの下半分を表示し、パネルの外側のコントロールをクリックします。をクリックしてグリッド内の行をクリックすると、パネルが一番上までスクロールし、グリッド内の間違った行が選択されます。

これは単なる DataGridView ではありません。Infragistics UltraWinGrid、Rich Text Box など、パネルよりも高いコントロールで発生します。私はこれを Infragistics のバグとして提起しましたが、彼らはそれが Microsoft の問題だと言っています。

コントロールに関連するすべてのイベントを使用しようとしましたが、イベントが発生する前にパネルのスクロールが発生します。

助言がありますか?

4

4 に答える 4

51

これは、ScrollableControl クラスによって自動的に発生する ScrollToControl イベントと、フォーカスを取得したコントロールの左上を表示するためにイベント ハンドラーがスクロールすることが原因です。スクロール可能なコンテナー コントロールに含まれるコントロールが 1 つだけの場合、この動作は役に立ちません。それを止める方法を見つけるまで、私はこの振る舞いに非常に不満を感じていました.

この動作を停止するには、次のように ScrollToControl イベント ハンドラーをオーバーライドします。

class PanelNoScrollOnFocus : Panel
{
    protected override System.Drawing.Point ScrollToControl(Control activeControl)
    {
        return DisplayRectangle.Location;
    }
}

パネル コントロールをこのパネル コントロールに置き換えます。終わり。

于 2009-05-26T20:33:49.373 に答える
2

パネルのAutoScrollプロパティをtrueに設定していると思います。これを行うと、アプリケーションを切り替えるとスクロール位置がゼロにリセットされ、パネルがその位置をリセットします。

AutoScrollをオフにして独自のスクロールバーを追加すると、パネルの要件に一致するようにスクロールバーの最大値と最小値を設定してから、スクロールバーのScrollイベントでパネルのスクロール値を設定できます。ウィンドウを切り替えても、これはリセットされません。

何かのようなもの:

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
    panel1.VerticalScroll.Value = vScrollBar1.Value;
}

これは私にとって新しいものであり、私はそれを再現しなければなりませんでした。私はそれについて私のサイトに記事を追加しなければならないかもしれません:-)

于 2009-01-07T18:00:44.330 に答える
1

美しく機能したskypecakesに感謝します:)これは、スクロールバーの場所を追跡するコントロールの編集バージョンです。

class AutoScrollPanel : Panel
{
    public AutoScrollPanel()
    {
        Enter += PanelNoScrollOnFocus_Enter;
        Leave += PanelNoScrollOnFocus_Leave;
    }

    private System.Drawing.Point scrollLocation;

    void PanelNoScrollOnFocus_Enter(object sender, System.EventArgs e)
    {
        // Set the scroll location back when the control regains focus.
        HorizontalScroll.Value = scrollLocation.X;
        VerticalScroll.Value = scrollLocation.Y;
    }

    void PanelNoScrollOnFocus_Leave(object sender, System.EventArgs e)
    {
        // Remember the scroll location when the control loses focus.
        scrollLocation.X = HorizontalScroll.Value;
        scrollLocation.Y = VerticalScroll.Value;
    }

    protected override System.Drawing.Point ScrollToControl(Control activeControl)
    {
        // When there's only 1 control in the panel and the user clicks
        //  on it, .NET tries to scroll to the control. This invariably
        //  forces the panel to scroll up. This little hack prevents that.
        return DisplayRectangle.Location;
    }
}

これは、パネルにコントロールが 1 つしかない場合にのみ機能します (ただし、複数のコントロールでテストしたことはありません)。

于 2009-12-09T11:29:23.607 に答える
0

私はあなたの痛みを理解しています。

パネルに DataGridView しかない場合は、Dock を Fill に設定し、DGV が独自にスクロールを処理できるようにします。私はそれがもうジャンプすることをしないと思います。それ以外の場合は、パネルよりも小さくなるようにサイズを変更して、それ自体でスクロールできるようにすることができると思います。

于 2009-01-07T16:54:26.740 に答える