C# 滚动另一个列表视图时滚动列表视图

C# 滚动另一个列表视图时滚动列表视图,c#,winforms,listview,scroll,C#,Winforms,Listview,Scroll,在我的win forms应用程序中,我使用两个列表视图来比较两个文件。 当用户使用文件夹浏览器选择两个文件时,文件将加载到列表视图中。 我比较了不同颜色的文件和不匹配的行。 这绝对行得通。 现在,当我滚动一个列表视图时,我希望另一个列表视图的滚动量也相同。 我尝试过,但您无法设置Listview的水平滚动或垂直滚动属性。 我该怎么做? 提前感谢。您需要创建一个自定义列表视图,以便检测滚动,并将滚动消息传递给其他文本框,使其同步滚动 class SyncListView: ListView {

在我的win forms应用程序中,我使用两个列表视图来比较两个文件。 当用户使用文件夹浏览器选择两个文件时,文件将加载到列表视图中。 我比较了不同颜色的文件和不匹配的行。 这绝对行得通。 现在,当我滚动一个列表视图时,我希望另一个列表视图的滚动量也相同。 我尝试过,但您无法设置Listview的水平滚动或垂直滚动属性。 我该怎么做?
提前感谢。

您需要创建一个自定义列表视图,以便检测滚动,并将滚动消息传递给其他文本框,使其同步滚动

 class SyncListView: ListView
{
    public SyncListView()
    {
    }

    public Control Buddy { get; set; }

    private static bool scrolling;   // In case buddy tries to scroll us

    protected override void WndProc(ref Message m) 
    {
    base.WndProc(ref m);
    // Trap WM_VSCROLL message and pass to buddy
    if ((m.Msg == 0x115 || m.Msg == 0x20a) && !scrolling && Buddy != null && Buddy.IsHandleCreated)
    {
        scrolling = true;
        SendMessage(Buddy.Handle, m.Msg, m.WParam, m.LParam);
        scrolling = false;
    }
}

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

}
也可以在托管代码中或仅使用托管代码执行此操作:

public class CustomListView : BetterListView
{
    public void SynchronizeScroll(BetterListView listView)
    {
        VScrollBar.Value = listView.VScrollProperties.Value;
    }
}
然后使用如下方式处理其VScrollPropertiesChanged事件:

    private void ListViewVScrollPropertiesChanged(object sender, BetterListViewScrollPropertiesChangedEventArgs eventArgs)
    {
        CustomListView listViewThis = (sender as CustomListView);

        listViewThis.SynchronizeScroll(this.listViewAnother);
    }

我也有类似的任务。两个必须相邻显示其项目的列表

我发现这条线索与Iron人的答案一致,这对我来说太难了,因为我在C#方面没有足够的经验

我找到了一个更简单的解决办法。 我在表单中添加了一个计时器。对于它的滴答声事件,我添加了以下内容:

Form active_form = Form.ActiveForm;
if (active_form == null) return;
Control control = Form.ActiveForm.ActiveControl;
if (control == newFilesList)
{
  Sync_lists(newFilesList);
}
else
{
  Sync_lists(oldFilesList);
}
它检查哪个列表处于活动状态,并使用此列表作为参数调用Sync_list例程

private void Sync_lists(ListView sender)
    {
        if ((newFilesList.Items.Count > 0) && (oldFilesList.Items.Count > 0))
        {
            int cur_top_index = sender.TopItem.Index;
            ListViewItem future_top_item;
            if (sender == oldFilesList)
            {
                future_top_item = newFilesList.Items[cur_top_index];
                newFilesList.TopItem = future_top_item;
            }
            else
            {
                future_top_item = oldFilesList.Items[cur_top_index];
                oldFilesList.TopItem = future_top_item;
            }
        }
    }
它只获取基本列表的TopItem属性,并为另一个列表设置与top具有相同索引的项


它不如自定义ListView那样正确。但要简单一点。希望能有所帮助。

检查这个:还有,这个:@Thaven:谢谢你的帮助。当你拖动滚动幻灯片并按下鼠标左键时,你上下移动幻灯片,好友列表视图不会对滚动做出反应,怎么样?