문제

300 픽셀 높이의 패널에 400 픽셀 높이의 DataGridView를 넣고 패널에 스크롤 막대가 있도록 아래로 스크롤하여 그리드의 하반부가 표시되도록 스크롤 한 다음 패널 외부의 컨트롤을 클릭하십시오. 그런 다음 그리드의 줄을 클릭하면 패널이 상단까지 스크롤하고 그리드의 잘못된 행이 선택됩니다.

그것은 단지 datagridview가 아닙니다. 그것은 패널보다 높은 컨트롤, 예를 들어 Infragistics Ultrawingrid, Rich Text Box에서 발생합니다. 나는 그것을 적용 론의 버그로 올렸지 만 마이크로 소프트 문제라고 말합니다.

컨트롤에 대한 모든 관련 이벤트를 사용해 보았지만 패널 스크롤은 이벤트가 시작되기 전에 발생합니다.

제안이 있습니까?

도움이 되었습니까?

해결책

패널의 자동 스크롤 속성을 True로 설정하고 있다고 생각합니다. 그렇게하면 스위칭 응용 프로그램이 스크롤 위치를 0으로 재설정하고 패널은 위치를 재설정합니다.

Autoscroll을 끄고 자신의 스크롤 바를 추가하면 패널의 요구 사항과 일치하도록 스크롤바의 최대 및 최소값을 설정 한 다음 스크롤 바의 스크롤 이벤트에서 패널의 스크롤 값을 설정할 수 있습니다. Windows를 전환 할 때는 재설정되지 않습니다.

같은 것 :

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

이것은 나에게 새로운 것이었고 나는 그것을 재현해야했다. 내 사이트에 기사에 기사를 추가해야 할 수도 있습니다 :-)

다른 팁

이는 ScrollableControl 클래스에 의해 Scrolltocontrol 이벤트가 자동으로 발사되고 이벤트 핸들러가 스크롤하여 초점을 맞춘 컨트롤의 왼쪽 상단을 표시함으로써 발생합니다. 이 동작은 스크롤 가능한 컨테이너 컨트롤에 하나의 컨트롤 만 포함 된 경우 도움이되지 않습니다. 나는 그것을 막는 방법을 알 때 까지이 행동에 매우 좌절했습니다.

이 동작을 중지하는 방법은 다음과 같이 스크롤 토크 컨트롤 이벤트 핸들러를 무시하는 것입니다.

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

패널 컨트롤을이 패널 컨트롤로 교체하십시오. 완료.

감사합니다 Skypecakes, 아름답게 작동했습니다 :) 여기에 Scrollbar가 위치를 추적하는 편집 된 컨트롤 버전이 있습니다.

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

패널에 하나의 컨트롤 만있는 경우에만 작동합니다 (하나 이상의 컨트롤로 테스트하지는 않았지만).

나는 당신의 고통을 이해합니다. 이것은 나를 두 번 이상 얻었습니다.

DataGridView가 패널에서 유일한 것인 경우 도크를 채우도록 설정하고 DGV가 스크롤을 자체적으로 처리하도록하십시오. 나는 그것이 더 이상 점프하는 일을 할 것이라고 생각하지 않습니다. 그렇지 않으면, 당신은 단지 크기를 크기로 만들 수 있으므로 패널보다 적어서 스크롤을 스크롤하게하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top