C# 同步兩個ListBox滾動條
有時需要對2個listbox的選項一一對比,兩邊來回拖容易搞亂搞錯,所以google了一下,找到了幾個listbox同步的方法。
同時也親自試驗了一下,先把成功的貼上來
1 、方法一
Winform介面裡放入2個listbox——listBox1,listBox2,From1新增程式碼:
執行後顯示:public Form1() { InitializeComponent(); //新增選項 <span style="white-space:pre"> </span> for (int i = 0; i <40; i++) { listBox1.Items.Add("Items " + i); listBox2.Items.Add("Items " + i); } //新增同步 EventHandler handler = (s, e) => { if(s == listBox1) listBox2.TopIndex =listBox1.TopIndex; if(s == listBox2) listBox1.TopIndex =listBox2.TopIndex; }; this.listBox1.MouseCaptureChanged +=handler; this.listBox2.MouseCaptureChanged +=handler; this.listBox1.SelectedIndexChanged +=handler; this.listBox2.SelectedIndexChanged +=handler; }
優點:程式碼量少,簡單
缺點:不支援滑鼠滾輪,兩邊都是獨立選中,不會自動選中對齊
2 、方法二
在form1中新增2個listBox——listBox1,listBox2,進入程式碼介面:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace SyncTwoListBox { public partial class Form1 : Form { private SyncListBoxes_SyncListBoxes = null; public Form1() { InitializeComponent(); this.Load += Form1_Load; //add options for (inti = 0; i < 40; i++) { listBox1.Items.Add("Item " + i); listBox2.Items.Add("Item " + i); } } private voidForm1_Load(object sender, EventArgs e) { this._SyncListBoxes = new SyncListBoxes(this.listBox1, this.listBox2); } } //建立一個listbox同步的類 public class SyncListBoxes { <span style="white-space:pre"> </span> private ListBox _LB1 = null; private ListBox _LB2 = null; private ListBoxScroll _ListBoxScroll1 = null; private ListBoxScroll _ListBoxScroll2 = null; public SyncListBoxes(ListBox LB1, ListBox LB2) { if (LB1 != null && LB1.IsHandleCreated && LB2 != null && LB2.IsHandleCreated && LB1.Items.Count == LB2.Items.Count && LB1.Height == LB2.Height) { this._LB1 = LB1; this._ListBoxScroll1 = new ListBoxScroll(LB1); this._ListBoxScroll1.Scroll += _ListBoxScroll1_VerticalScroll; this._LB2 = LB2; this._ListBoxScroll2 = new ListBoxScroll(LB2); this._ListBoxScroll2.Scroll += _ListBoxScroll2_VerticalScroll; this._LB1.SelectedIndexChanged += _LB1_SelectedIndexChanged; this._LB2.SelectedIndexChanged += _LB2_SelectedIndexChanged; } } private void _LB1_SelectedIndexChanged(object sender, EventArgs e) { if (this._LB2.TopIndex != this._LB1.TopIndex) { this._LB2.TopIndex = this._LB1.TopIndex; } if (this._LB2.SelectedIndex != this._LB1.SelectedIndex) { this._LB2.SelectedIndex = this._LB1.SelectedIndex; } } private void _LB2_SelectedIndexChanged(object sender, EventArgs e) { if (this._LB1.TopIndex != this._LB2.TopIndex) { this._LB1.TopIndex = this._LB2.TopIndex; } if (this._LB1.SelectedIndex != this._LB2.SelectedIndex) { this._LB1.SelectedIndex = this._LB2.SelectedIndex; } } private void _ListBoxScroll1_VerticalScroll(ListBox LB) { if (this._LB2.TopIndex != this._LB1.TopIndex) { this._LB2.TopIndex = this._LB1.TopIndex; } } private void _ListBoxScroll2_VerticalScroll(ListBox LB) { if (this._LB1.TopIndex != this._LB2.TopIndex) { this._LB1.TopIndex = this._LB2.TopIndex; } } private class ListBoxScroll : NativeWindow { private ListBox _LB = null; private const int WM_VSCROLL = 0x115; private const int WM_MOUSEWHEEL = 0x20a; public event dlgListBoxScroll Scroll; public delegate void dlgListBoxScroll(ListBox LB); public ListBoxScroll(ListBox LB) { this._LB = LB; this.AssignHandle(LB.Handle); } protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case WM_VSCROLL: case WM_MOUSEWHEEL: if (this.Scroll != null) { this.Scroll(_LB); } break; } } } } }
執行後顯示:
優點:支援滾輪、支援同步選中,直接使用listbox
缺點:滾輪同步略有延遲
3、方法三
還有其他方法,我還在試驗中,成功後後期補充上來。相關推薦
C# 同步兩個ListBox滾動條
有時需要對2個listbox的選項一一對比,兩邊來回拖容易搞亂搞錯,所以google了一下,找到了幾個listbox同步的方法。 同時也親自試驗了一下,先把成功的貼上來 1 、方法一 Winform介面裡放入2個listbox——listBox1,listBox2,F
C語言 兩個小知識點
text sizeof 包括 5% har 賦值 知識 ring include strlen 函數原型 extern unsigned int strlen(char *s); 在Visual C++ 6.0中,原型為size_t strlen(const c
兩個內存條不能啟動
無法啟動 時間 img 再次 image justify 1-1 p s logs 新買了一個金士頓DDR2 2G的內存,原來那個也是一樣的,兩條插上後電腦無法啟動,拔下任意一條都能啟動, 怎麽回事那? 【解決方法】 設置BIOS的延遲時間。我分析可能是兩個內存條需要更
C# 取兩個集合的交集並集差集
兩個 color pre str exce class 並集 blog span 交集:Intersect 並集:Union 差集:Except var A= new List() { 1, 2, 3, 4, 5, 6 }; var B= new List() { 3
兩個Listbox添加、刪除、全部添加、全部刪除
.cn 刪除 alt flag cti -1 move tex .com function moveOption(e1,e2,flag){ if(flag==false){ for(var i=0;i&
C# 判斷兩個集合(List)是否相等
getc tcollect color 是否 rep 復雜度 etl blog 重復項 1.兩個list如果有重復元素(如List1: a,b,a List2: b,b,a) 是無法通過包含關系來判斷是否相等的. 有兩個辦法,其一是兩個List排序後再按順序比較.另一個辦
c#實現兩個(DataTable)數據合並
eric ima foreach pro pos field tde source pre 在C#代碼中,要將這兩個表拼接起來,也有很多比較“笨”的辦法,就是例如循環獲取數據一條條拼起來,此辦法在數據量少、字段少的可以使用此辦法,但在數據量大的情況下
今天剛學的c++,兩個程序。
日常#include<iostream>using namespace std;int main(){int a,b,sum;cin>>a>>b;sum=a+b;cout<<"a+b="<<sum<<endl;retu
C#比較兩個字符串的相似度【轉】
出現 href 單詞 mar 情況 base 程序代碼 RR 字符 原文地址:http://www.2cto.com/kf/201202/121170.html 我們在做數據系統的時候,經常會用到模糊搜索,但是,數據庫提供的模糊搜索並不具備按照相關度進行排序的功能
c++中兩個類互相引用的問題
pro 如何 ++ code 泛型 cin padding 直接 fine 原文鏈接http://www.cnblogs.com/weixliu/p/3957227.html 最近在改一個C++程序的時候碰到一條警告信息,警告信息為:“
c# 計算兩個日期之間相差的天數
策劃要求有每日任務,因為對時間不瞭解,所以查了一下資料,終於完成了要求,現把程式碼記錄在下面。 算不上轉載,更算不上原創的一點想法吧 public vo
C++ 合併兩個有序單向連結串列
struct Node { Node* pNext; int val; Node(int v) { val = v; pNext = nullptr; } }; Node* MergeNodeList(Node* p1,Node*p2) { Node *pRoot,*pCur
c語言 兩個乒乓球隊進行比賽,各出3人,A說他不和x比,C說他不和x,z比 找出3對賽手的名單
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
PTA - 找出不是兩個陣列共有的元素 (C語言) - 兩個40大小陣列實現
7-8 找出不是兩個陣列共有的元素 (20 分) 給定兩個整型陣列,本題要求找出不是兩者共有的元素。 輸入格式: 輸入分別在兩行中給出兩個整型陣列,每行先給出正整數N(≤20),隨後是N個整數,其間以空格分隔。 輸出格式: 在一行中按照數字給出的順序輸出不是兩
C# 將兩個不同的dataTable合併到一個自定義的dataTable中
[csharp] view plain copy //比較三種情況 &
DbForge Data Compare for SQL Server入門教程:連線到資料庫、快速同步兩個資料庫
在連線到資料庫之前,必須建立伺服器連線。 要建立連線: 1. 在資料庫選單上,單擊新建連線。將開啟“ 資料庫連線屬性” 對話方塊。 2. 在“ 伺服器” 組合框中,單擊“ <瀏覽...>” 。將開啟“ 瀏覽伺服器” 視窗。 3. 在“ 本地伺服器” 選
c++ 交換兩個容器
#include <iostream> #include <vector> using namespace std; int main () { vector<int> foo (3,100); // three ints with a v
C++實現兩個超大的字符數字相加的算法的代碼
numbers lead last let rst ace num cout -i 如下資料是關於C++實現兩個超大的字符數字相加的算法的代碼。 #include <iostream> #include <string> #include <s
C++實現兩個超大的字元數字相加的演算法的程式碼
如下資料是關於C++實現兩個超大的字元數字相加的演算法的程式碼。 #include <iostream> #include <string> #include <stack> using namespace std; void deleteLeadingZeros(st
C++中兩個常用的控制語句格式的函式(width和precision函式)
width 語法: int width(); int width( int w ); 函式 width()返回當前的寬度。可選擇引數w用於設定寬度大小。寬度是指每一次輸