c#中的多列列表框


介紹 當我第一次開始使用。net時,我對列表框和列表框都很失望 ComboBox沒有多列支持。更准確地說,列表框並沒有按照我期望的方式實現它(每個條目水平堆放而不是垂直堆放)。我聽說Windows窗體有一組豐富的控件,但它們沒有微軟窗體2.0 (Office VBA使用的ActiveX庫)那么多的功能。然而,現在我已經使用了。net和Windows窗體,我很高興MS開發人員花了更少的時間來編寫花哨的控件,而花了更多的時間來讓其他人更容易這樣做。 這是從System.Windows.Forms.ListBox繼承的一個所有者繪制的列表框。它的主要功能是將每個項格式化為多個列。其次,客戶應該能夠 輕松檢索任何行中任何列的內容。我決定做這個最好的方法是模仿標准的繪圖 DataGrid。這樣做的副作用是它必須綁定到數據源。 特性 具有可配置寬度的多列 基於列的#和它們的寬度自動計算水平范圍 屬性來快速限制列的#,而不修改 數據源 2 .新事件,隱藏復制CodeMeasureSubItem並隱藏為客戶端代碼復制CodeDrawSubItem以獲取繪制的所有權 ValueMember現在對應於多olumnlistbox。值(而不是文本)。也是一個 TextMember屬性已經被添加,它對應於MultiColumnListBox.Text 可以設置ValueIndex和TextIndex屬性,以便使用列位置而不是列名 MatchEntryStyle枚舉屬性擴展類型化字符匹配,以區分大小寫和完成字符串匹配(帶有可配置的超時) FindString()和FindStringExact()將列考慮在內。 GetItemAt()方法快速獲取指定行和列中的對象(4個重載) 反射用於確定是否可以將對象繪制成圖像。這包括圖像位圖和隱藏。復制Codebyte [] (如果它真的是一個圖像的話) 包括一個帶有單個靜態方法ToDataSet的helper對象數據數組 它將1-3維(非鋸齒)數組轉換為數據集。 使用 隱藏,收縮,復制Code

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using AsYetUnnamed;

public class Form1 : System.Windows.Forms.Form
{
    private DataSet ds;
    private MultiColumnListBox listBox1;
    public Form1()
    {
        ds = DataArray.ToDataSet(new object[,]{ 
                    {"Row0, col0",  "Row0, col1" ,1},
                    {"Row00, col0", "Row1, col1" ,new object()},
                    {"Row1, col0",  "Row2, col1" ,"Some String"},
                    {"Row1a, col0", "Row3, col1" ,Rectangle.Empty},
                    {"row1aa,col0", "Row4, col1" ,1},
                    {"row0, col0",  "Row5, col1" ,1},
                    {"pow0, col0",  "Row6, col1" ,1},
                    {"Row7, col0",  "Row7, col1" ,new ExampleClass()},
                    {"Row8, col0",  "Row8, col1" ,Image.FromFile("StopLight.gif")}
                    });
            
        listBox1 = new MultiColumnListBox();
        listBox1.Parent = this;

        listBox1.DataSource = arr;            
    }
    class ExampleClass
    {
        Public override string ToString()
        {
            return "Hello from ExampleClass!!";
        }
    }

}

將產生類似於上面的截圖。演示項目演示了更多特性。 挑戰 可能最大的挑戰是弄清楚在WinForms上如何進行復雜的數據綁定。結果是,任何實現了IList的東西都被枚舉以獲得行列表。ListBox與DataGrid的區別如下: ListBox:對IList中包含的每個項調用oString()。如果DisplayMember被設置,它會調用IList[index].DisplayMember.ToString() 方法中包含的每個項都調用ToString() 它使用反射來查找對象公開的每個公共可讀屬性。它在一個列中顯示這些內容。 但是,如果數據源隱含了ITypedList,則它使用由 ITypedList代替。當與包含ICustomTypeDescriptor的對象一起使用時, 可以為對象提供不存在的屬性 DataGrid。幸運的是數據集,或者說是DataView對象 為你實現這個。ListBox已經提供的DataManager能夠自動查詢這些接口。 另一件煩人的事情是使用SelectionMode.MultiExtended。在此模式下,在一個已經選中但沒有焦點的項目上設置SelectedIndex將不會給該項目聚焦。此外,在多擴展模式下調用ClearSelected()清除選擇,然后選擇項目0。我花了好幾個小時試圖弄清楚如何設置一個互斥選擇,而不強制重新繪制,也不閃爍項目0。 \ \待辦事項: 這絕對是一個正在進行的工作。除了沒有設計代碼,缺乏文檔,嚴重缺乏代碼注釋,以及太多我想吃掉的異常 實現如下: 用列樣式替換列寬度,列樣式除了寬度還指定 字體,顏色,背景色,甚至一個委托來執行單列繪制,而不需要完全擴展OwnerDraw。 對基於鼠標的列調整有什么想法嗎?這是否超出了列表框的用途? todataset()我想實際創建一個對象 實現ITypedList和ICustomTypeDesriptor,它們解釋對包含數組的調用,而不僅僅是循環遍歷和復制元素到 數據集。 我真的需要一個命名空間… 結論 希望這能滿足別人的需要,而不僅僅是我自己的…我非常感謝任何反饋、評論、建議、bug發現等等。 本文轉載於:http://www.diyabc.com/frontweb/news231.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM