简体   繁体   English

将自定义水平滚动条的滚动同步到datagridview的滚动

[英]syncing custom horizontal scrollbar's scroll to datagridview's scroll

I have a datagridviews and two custom scrollbars - one vertical and one horizontal scrollbar. 我有一个datagridviews和两个自定义滚动条-一个垂直滚动条和一个水平滚动条。

I am resizing the scrollbars when datagridview is populated 我在填充datagridview时调整滚动条的大小

scrollBarEx1.Maximum = dataGridView1.RowCount;
scrollBarEx3.Maximum = dataGridView1.ColumnCount;

This is the scroll event for datagridview1 这是datagridview1的滚动事件

private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
            {
                scrollBarEx1.Value = e.NewValue;
            }
            else if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
            {
                scrollBarEx3.Value = e.NewValue;
            }
        }

And here under is the code for scroll event for both scrollbars 这是两个滚动条的滚动事件代码

private void scrollBarEx1_Scroll(object sender, ScrollEventArgs e)
        {
            dataGridView1.Rows[dataGridView1.FirstDisplayedScrollingRowIndex].Height = e.NewValue;
}

private void scrollBarEx3_Scroll(object sender, ScrollEventArgs e)
        {
            dataGridView1.Columns[dataGridView1.FirstDisplayedScrollingColumnIndex].Width = e.NewValue;
        }

However only vertical scroll is working. 但是,只有垂直滚动条起作用。 Horizontal scroll does scroll, but the grid does not scroll with it. 水平滚动不会滚动,但是网格不会随之滚动。 Help please. 请帮助。

When you have a custom scroll you always set the values of maximum, largechange and small change as follows: 使用自定义滚动条时,请始终按以下方式设置最大值,大变化和小变化的值:

Horizontal Scroll 水平滚动

Maximum = total width 最大=总宽度
LargeChange = control width LargeChange =控制宽度
SmallChange = 10% of total width, in this case the width of first column SmallChange =总宽度的10%,在这种情况下为第一列的宽度

Vertical Scroll 垂直滚动

Maximum = total height 最大=总高度
LargeChange = control height LargeChange =控制高度
SmallChange = 10% of total height, in this case the height of first row SmallChange =总高度的10%,在这种情况下为第一行的高度

So for horizontal: 所以对于水平:

//set these values probably at form load event
int totalwidth = dataGridView1.RowHeadersWidth + 1;

for( int i = 0; i < dataGridView1.Columns.Count; i++ ) {
    totalwidth += dataGridView1.Columns[ i ].Width;
}

hScrollBar1.Maximum = totalwidth;
hScrollBar1.LargeChange = dataGridView1.Width;
hScrollBar1.SmallChange= dataGridView1.Columns[ 0 ].Width;

and

private void dataGridView1_Scroll( object sender, ScrollEventArgs e ) {
    if( e.ScrollOrientation == ScrollOrientation.HorizontalScroll ) {
        hScrollBar1.Value = e.NewValue;
    }
}

private void hScrollBar1_Scroll( object sender, ScrollEventArgs e ) {
    dataGridView1.HorizontalScrollingOffset = e.NewValue;
}

EDIT 编辑

for verticall scroll in DataGridView you can't scroll by pixels but by rows only. 对于DataGridView中的 verticall滚动,您不能按像素滚动,而只能按行滚动。 So 所以

Vertical Scroll 垂直滚动

Maximum = total number of rows 最大值=总行数
LargeChange = number of visible rows, even a small part counts LargeChange =可见行数,即使是很小的零件数
SmallChange = 1 SmallChange = 1

So for vertical 所以对于垂直

vScrollBar1.Maximum = dataGridView1.RowCount;
vScrollBar1.LargeChange = dataGridView1.DisplayedRowCount(true);
vScrollBar1.SmallChange = 1;

and

private void dataGridView1_Scroll( object sender, ScrollEventArgs e ) {
    if( e.ScrollOrientation == ScrollOrientation.VerticalScroll ) {
        vScrollBar1.Value = e.NewValue;
    }
}

private void vScrollBar1_Scroll( object sender, ScrollEventArgs e ) {  
    dataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM