在我的 win forms 应用程序中,我使用两个列表视图来比较两个文件。当用户使用文件夹浏览器选择两个文件时,文件将加载到列表视图中。我比较了不匹配的文件和行以不同的颜色显示。这绝对没问题。现在,当我滚动一个列表视图时,我希望另一个列表视图也应该以相同的量滚动。我试过了,但你不能设置 Listview 的水平滚动或垂直滚动属性。我怎样才能做到这一点 ?提前致谢。
问问题
2674 次
3 回答
2
您需要创建一个自定义列表视图,以便您可以检测到它的滚动并将滚动消息传递给另一个文本框,以便它同步滚动。
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);
}
于 2013-02-11T04:57:40.140 回答
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 那样正确。但是稍微简单一点。希望它会有所帮助。
于 2016-09-02T09:38:16.593 回答
0
您也可以仅使用托管代码在Better ListView或Better 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);
}
于 2013-02-16T15:19:00.900 回答