【问题标题】:syncing custom horizontal scrollbar's scroll to datagridview's scroll将自定义水平滚动条的滚动同步到 datagridview 的滚动
【发布时间】:2018-08-08 05:45:18
【问题描述】:

我有一个 datagridviews 和两个自定义滚动条 - 一个垂直滚动条和一个水平滚动条。

我在填充 datagridview 时调整滚动条的大小

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

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

下面是两个滚动条的滚动事件代码

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

但是只有垂直滚动有效。水平滚动确实滚动,但网格不会随之滚动。请帮忙。

【问题讨论】:

  • 两个滚动条的 LargeChangeSmallChange 的值是多少?
  • LargeChange = 10SmallChange = 1 用于两个滚动条。

标签: c# winforms custom-controls


【解决方案1】:

当你有一个自定义滚动时,你总是设置 maximum、largechange 和 small change 的值,如下所示:

水平滚动

最大值 = 总宽度
LargeChange = 控制宽度
SmallChange = 总宽度的 10%,在本例中为第一列的宽度

垂直滚动

最大值 = 总高度
LargeChange = 控制高度
SmallChange = 总高度的 10%,在这种情况下是第一行的高度

所以对于水平:

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

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

编辑

对于 DataGridView 中的垂直滚动,您不能按像素滚动,而只能按行滚动。所以

垂直滚动

最大值 = 总行数
LargeChange = 可见行数,即使是一小部分也很重要
SmallChange = 1

所以对于垂直

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

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

【讨论】:

  • int totalwidthgrid1 = dataGridView1.RowHeadersWidth + 1; for (int i = 0; i &lt; dataGridView1.Columns.Count; i++) { totalwidthgrid1 += dataGridView1.Columns[i].Width; } scrollBarEx3.Maximum = totalwidthgrid1; scrollBarEx3.LargeChange = dataGridView1.Width; scrollBarEx3.SmallChange = dataGridView1.Columns[0].Width;
  • int totalheightgrid1 = dataGridView1.ColumnHeadersHeight + 1; for (int i = 0; i &lt; dataGridView1.Rows.Count; i++) { totalheightgrid1 += dataGridView1.Rows[i].Height; } scrollBarEx1.Maximum = totalheightgrid1; scrollBarEx1.LargeChange = dataGridView1.Height; scrollBarEx1.SmallChange = dataGridView1.Rows[0].Height; 前面的注释有宽度代码,这个代码是高度。
  • 这也行不通。 private void scrollBarEx1_Scroll(object sender, ScrollEventArgs e) { dataGridView1.VerticalScrollingOffset = e.NewValue; } 它在dataGridView1.VerticalScrollingOffset = e.NewValue; 下有一条波浪线,但没有特别说明其他任何内容。然而,private void scrollBarEx3_Scroll(object sender, ScrollEventArgs e) { dataGridView1.HorizontalScrollingOffset = e.NewValue; } 工作得很好。
  • @fasih 确实如此。我不知道。那是因为您可以按行滚动而不是按像素滚动。见编辑
  • 是的,那么//dataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue; dataGridView1.Rows[dataGridView1.FirstDisplayedScrollingRowIndex].Height = e.NewValue; 不会相应地改变吗?因为网格正在滚动但未同步。当滚动条移动了一点时,网格滚动到结束。默认滚动条按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多