【问题标题】:How to synchronise horizontal scrolling in DataGridViews如何在 DataGridViews 中同步水平滚动
【发布时间】:2014-01-07 14:14:18
【问题描述】:

我有三个 DataGridView: dgvSTART; dgv过滤器; dgvEdit.

我已经编辑了 dgvSTART 的滚动事件,与答案 here 内联,如下所示:

dgvEdit.FirstDisplayedScrollingColumnIndex = dgvSTART.FirstDisplayedScrollingColumnIndex;
dgvFilter.FirstDisplayedScrollingColumnIndex = dgvSTART.FirstDisplayedScrollingColumnIndex;

这有效,但仅在 dgvSTART 的左侧列发生更改时滚动其他两个 DataGridView(即该列消失/出现在面板侧面)。

是否可以让所有数据网格视图作为一个滚动(忽略列边界)?

我认为使用 DataGridView 的 HorizontalScrollingOffset 属性可以做到这一点,但我的尝试没有成功:

private void dgvSTART_Scroll(object sender, ScrollEventArgs e)
    {
        //using matching the first column shown
        dgvEdit.FirstDisplayedScrollingColumnIndex = dgvSTART.FirstDisplayedScrollingColumnIndex;
        dgvFilter.FirstDisplayedScrollingColumnIndex = dgvSTART.FirstDisplayedScrollingColumnIndex;

        try
        {
            //trying to use horizontalscrollingoffset
            if (e.NewValue < e.OldValue)
            {
                dgvEdit.HorizontalScrollingOffset = dgvFilter.HorizontalScrollingOffset - 10;
                dgvFilter.HorizontalScrollingOffset = dgvFilter.HorizontalScrollingOffset - 10;
            }
            else
            {
                dgvEdit.HorizontalScrollingOffset = dgvEdit.HorizontalScrollingOffset + 10;
                dgvFilter.HorizontalScrollingOffset = dgvFilter.HorizontalScrollingOffset + 10;
            }
        }
        catch (Exception) { }//do nothing with the exception        
    }

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    这段代码怎么样?

    dataGridView_Scroll需要在form的构造函数中注册什么的。

    dgvSTART.Scroll  += new ScrollEventHandler(dataGridView_Scroll);
    dgvFilter.Scroll += new ScrollEventHandler(dataGridView_Scroll);
    dgvEdit.Scroll   += new ScrollEventHandler(dataGridView_Scroll);
    

    dataGridView_Scroll如下。

    void dataGridView_Scroll(object sender, ScrollEventArgs e)
    {
        DataGridView src;
        DataGridView dst1 = null;
        DataGridView dst2 = null;
    
        src = (DataGridView)sender;
    
        if (src == dgvSTART)
        {
            dst1 = dgvFilter;
            dst2 = dgvEdit;
        }
        else if (src == dgvFilter)
        {
            dst1 = dgvSTART;
            dst2 = dgvEdit;
        }
        else if (src == dgvEdit)
        {
            dst1 = dgvSTART;
            dst2 = dgvFilter;
        }
    
        if (dst1 != null && dst2 != null)
        {
            dst1.HorizontalScrollingOffset = dst2.HorizontalScrollingOffset = src.HorizontalScrollingOffset;
    
            dst1.FirstDisplayedScrollingRowIndex = Math.Min(dst1.RowCount - 1, src.FirstDisplayedScrollingRowIndex);
            dst2.FirstDisplayedScrollingRowIndex = Math.Min(dst2.RowCount - 1, src.FirstDisplayedScrollingRowIndex);
        }
    }
    

    【讨论】:

    • 它可以工作,但它在绘制网格时很跳跃。关于如何阻止这种情况的任何想法?
    • 在单个datagridview的情况下也是一样的。当用户拖动滚动条时,网格会平滑滚动。当用户单击滚动条的箭头按钮时,网格会跳动。
    • 平滑度可以通过提供相等的 e.NewValue 来实现
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2017-05-15
    • 2020-06-11
    • 2011-12-13
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多