2009-09-04 73 views
4

是否有可能在combox中有自定义排序/显示顺序?假设我在所有其他人之前想要一个特殊值“MasterValue”。C#自定义组合框排序

回答

4

而是添加字符串,创建一个实现了IComparable接口和覆盖的ToString类。

添加该类的实例,以您的组合框

+0

好了,但我仍然想要“MasterValue”作为显示值,并根据除了应位于顶部的“MasterValue”之外的所有对象的ToString()值进行排序。你的答案是否有诀窍? – Toto 2009-09-04 11:00:28

+0

@Duaner:这个想法是,comboBox对调用IComparable接口的CompareTo函数的元素进行排序。你必须做的是围绕String类创建一个包装器。 ToString返回你想要在组合框中的字符串,并且CompareTo确保你有想要的订单。如果字符串是“MasterValue”,那么CompareTo总是返回一个<0,所以“MasterValue”总是第一个。 – 2009-09-04 11:09:35

+4

这在.NET 3.5中对我无效。 System.Windows.Forms.ComboBox有其内部的ItemComparer类,它实际上调用GetItemText()属性,它调用ToString()而不是IComparable接口。 – 2010-08-27 02:07:02

4

下面的代码将做的伎俩。

  1. 创建要排序的项目的单独列表,然后使用AddRange。

    comboBox1.Items.Add("Master"); 
    
    List<String> listToSort = new List<String>(); 
    
    listToSort.Add("6nd"); 
    listToSort.Add("3nd"); 
    listToSort.Add("5nd"); 
    listToSort.Add("4nd"); 
    listToSort.Add("2nd"); 
    
    listToSort.Sort(); 
    
    comboBox1.Items.AddRange(listToSort.ToArray<String>()); 
    
+0

second,thirdon,fourton? – Lars 2013-11-21 13:24:17

1

创建数据源作为一个视图(如存储过程),返回值1

然后获取数据源的附加字段,并添加额外的行添加到数据视图中,附加字段的值为0.

然后按照最初的那个字段对字段进行排序。

这将始终将您的“主值”放在第一位,然后按字母顺序排列其他值。

private void PopulateCombo() 
{ 
    // get data view that returns 3 columns, 
    //master sort column set to 1, id, and description // 
    DataView view = GetSource(); 

    // add a new row to the data source that has column values 
    // 0 for master sort column (all others are returned 1 
    // an appropriate ID and a description 
    // data view columns = master sort column, id, description  
    view.Table.Rows.Add(new object[] {0, 1, "MasterValue"}); 

    // sort first by master column then description // 
    view.Sort = "MasterSortColumn ASC, Description ASC"; 

    combo.DataSource = view; 
    combo.ValueMember = "Id"; 
    combo.DisplayMember = "Description"; 
}