C#自定义组合框排序

C#自定义组合框排序,c#,winforms,combobox,C#,Winforms,Combobox,在combox中是否可以自定义排序/显示顺序?假设我想要一个特殊的值“MasterValue”,在所有其他值之前。下面的代码将完成此操作 创建要排序的项目的单独列表,然后使用AddRange comboBox1.Items.Add("Master"); List<String> listToSort = new List<String>(); listToSort.Add("6nd"); listToSort.Add("3nd"); listToSort.Add("5

在combox中是否可以自定义排序/显示顺序?假设我想要一个特殊的值“MasterValue”,在所有其他值之前。

下面的代码将完成此操作

  • 创建要排序的项目的单独列表,然后使用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>());
    
    comboBox1.Items.Add(“主控”);
    List listToSort=新列表();
    列表排序。添加(“第6条”);
    listToSort.Add(“3nd”);
    列表排序。添加(“第5条”);
    列表排序。添加(“第4条”);
    列表排序。添加(“第二次”);
    listToSort.Sort();
    comboBox1.Items.AddRange(listToSort.ToArray());
    

  • 创建一个实现IComparable并重写ToString的类,而不是添加字符串


    将该类的实例添加到组合框中

    创建一个数据源作为视图(即存储过程),该视图返回值为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";
    }
    

    好的,但我仍然希望“MasterValue”作为显示值,并根据所有对象的ToString()值进行排序,但“MasterValue”应位于顶部。你的答案会起作用吗?@Duaner:这个想法是组合框对调用IComparable接口的CompareTo函数的元素进行排序。您需要做的是围绕String类创建一个包装器。ToString返回组合框中所需的字符串,CompareTo确保您具有所需的顺序。如果字符串是“MasterValue”,则CompareTo始终返回<0,因此“MasterValue”始终是第一个。这在.NET3.5中对我不起作用。System.Windows.Forms.ComboBox有其内部ItemComparer类,该类实际上调用了GetItemText()属性,该属性调用ToString()而不是IComparable接口。虽然ComboBox.Sorted=true,但从未调用函数IComparable.CompareTo。此答案是错误的。IComparable永远不会被称为!(框架4)为什么这是4票赞成的公认答案???第二,第三,第四?