【问题标题】:Scrolling list view when another list view is scrolled滚动另一个列表视图时滚动列表视图
【发布时间】:2013-01-21 11:29:12
【问题描述】:

在我的 win forms 应用程序中,我使用两个列表视图来比较两个文件。 当用户使用文件夹浏览器选择两个文件时,文件将加载到列表视图中。 我比较了不匹配的文件和行以不同的颜色显示。 这绝对没问题。 现在,当我滚动一个列表视图时,我希望另一个列表视图也应该以相同的量滚动。 我试过了,但你不能设置 Listview 的水平滚动或垂直滚动​​属性。 我怎样才能做到这一点 ? 提前致谢。

【问题讨论】:

标签: c# winforms listview scroll


【解决方案1】:

我有类似的任务。两个列表必须彼此相邻显示他们的项目。

我在 Iorn Man 的回答中找到了这个帖子,这对我来说太难了,因为我没有足够的 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 属性,并将具有相同索引的项目设置为另一个列表的顶部。

它不像自定义ListView那么正确。但是简单一点。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您也可以在Better ListViewBetter ListView Express 中仅使用托管代码执行此操作:

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

    【讨论】:

      【解决方案3】:

      您需要创建一个自定义列表视图,以便您可以检测到它的滚动并将滚动消息传递给另一个文本框,以便它同步滚动。

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

      【讨论】:

      • 当您拖动滚动幻灯片并按下鼠标左键时,您如何上下移动幻灯片,好友列表视图不会对滚动做出反应?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多