1. 程式人生 > >C# 同步兩個ListBox滾動條

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用於設定寬度大小。寬度是指每一次輸