2

我有一个这样的列表视图,在 FormLoad 事件中我应该为它做一些初始化,例如:(我需要这些)。

    listView.Scrollable = true;
    listView.HideSelection = false;
    listView.FullRowSelect = true;
    listView.View = View.Details;
    listView.HeaderStyle = ColumnHeaderStyle.None;
    ColumnHeader header = new ColumnHeader();
    header.Text = "MyHdr";
    header.Name = "MyCol";
    header.Width = listView.ClientSize.Width;
    listView.Columns.Add(header);

我向其中添加项目的方式非常简单,如下所示:

listView.Items.Add("hello");
listView.Items.Add("How are you");
//... etc

但我希望它们按字母顺序添加和排序,但是当我向其中添加新项目并调用 Sort 方法时,它什么也不做。为什么?!:(

编辑:这是我在最后一行调用 Sort() 的整个部分 目标是有两个列表视图和一个移动按钮,当单击移动按钮时,一个列表视图中的选定项目应该移动到另一个列表视图. (两个列表视图都不需要排序。只需对 AvailLV 列表视图进行排序)

private void MoveBtn_Click(object sender, EventArgs e)
{
    ListView source=null;
    ListView target= null;

    if(AvailableLV.SelectedItems.Count>0)
    {
        source = AvailableLV;
        target = SelectedLV;
    }

    if(SelectedLV.SelectedItems.Count>0)
    {
        source = SelectedLV;
        target = AvailableLV;
    }

    if (source != null && target != null)
    {
        HaulItems(source, target);
    }
}

private void HaulItems(ListView source , ListView target)
{
    foreach(ListViewItem item in source.Items)
    {
        if(item.Selected)
        {
            source.Items.Remove(item);
            target.Items.Add(item);
        }
    }
    AvailableLV.Sort();
}
4

4 回答 4

6

你在哪里设置你的ListView.Sorting 属性

从上面的链接:

Sorting 属性允许您指定是否在 ListView 控件中对项目进行排序。默认情况下,不执行排序。当 Sorting 属性设置为 Ascending 或 Descending 时,ListView 中的项目将自动按字母升序(当属性设置为 Ascending 时)或字母降序(当属性设置为 Descending 时)排序。您可以使用此属性自动对 ListView 控件中显示的项目进行排序,以便用户在有大量可用项目时更容易找到项目。


查看您的编辑,我认为您需要做的就是设置ListView.Sorting属性AvailableLV,它会在添加项目时自动对您的项目进行排序。或代替打电话。

AvailableLV.Sort(); 

采用

AvailableLV.Sorting = SortOrder.Ascending;
于 2012-05-28T03:34:23.400 回答
1

如果有人关注这个话题,我发现最简单的方法是将列表视图发送到数据表并从中创建一个数据视图,然后对数据视图进行排序。对该数据视图进行排序后,创建一个临时表,然后将行推回列表视图。例如下面。

    public string SortOrder;
    public string ItemSorted;
    private void LSTHistory_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        DataTable TempTable = new DataTable();
        for (int i = 0; i < LSTHistory.Columns.Count; i++)
        {
            TempTable.Columns.Add(LSTHistory.Columns[i].Text);
        }
        foreach (ListViewItem Item in LSTHistory.Items)
        {
            DataRow iRow = TempTable.NewRow();
            iRow[0] = Item.Text;
            iRow[1] = Item.SubItems[1].Text;
            TempTable.Rows.Add(iRow);
        }
        if (SortOrder == string.Empty || SortOrder == "ASC") SortOrder = "DESC";
        else SortOrder = "ASC";
        if (e.Column == COLTime.Index)
        {
            ItemSorted = COLTime.Text;
        }
        else
        {
            ItemSorted = COLURL.Text;
        }
        DataView OldView = TempTable.DefaultView;
        OldView.Sort = ItemSorted + " " + SortOrder;
        DataTable SortedTable = OldView.ToTable();
        LSTHistory.Items.Clear();
        foreach (DataRow iRow in SortedTable.Rows)
        {
            LSTHistory.Items.Add(iRow[0].ToString()).SubItems.Add(iRow[1].ToString());
        }
    }
于 2014-07-02T18:30:01.143 回答
1

又一个后来者参加了球赛。

此解决方案用于Linq对项目进行排序。

它可以通过单击列标题进行排序。排序是按数字、字符串或日期,它将在升序和降序之间切换,它会忽略无效数据,将它们排序到开头或结尾。

您需要在一个简单的字符串中输入列的类型。

static class LvHelper
{
    public static void SortByColumn(this ListView lv, string colTypes, 
                                    ColumnClickEventArgs e)
    {
        string lvSort = "As0";
        if (lv.Tag != null) lvSort = lv.Tag.ToString();
        if (e.Column < 0 || e.Column > colTypes.Length - 1) return;
        char sortType = colTypes[e.Column];
        if (sortType == '-') return;
        int mini = lv.Items.Cast<ListViewItem>().Select(x => x.SubItems.Count).Min();
        if (sortType != 's'  && lv.Items.Cast<ListViewItem>()
                            .Select(x => x.SubItems.Count - 1).Min() < e.Column) return;


        int  sortCol = Convert.ToInt32(lvSort.Substring(2));
        bool asc = lvSort[0] == 'A';
        if (e.Column == sortCol) asc = !asc;
        DateTime dummyD;
        double dummyN;
        double maxDate = DateTime.MaxValue.ToOADate();
        int order = asc ? 1 : -1;

        List<ListViewItem> sorted = null;
        try
        {
            if (sortType == 'n')   // numbers
                sorted = lv.Items.Cast<ListViewItem>().Select(x => x)
                         .OrderBy(x => order * Convert.ToDouble(
                          double.TryParse(x.SubItems[e.Column].Text, out dummyN)
                                ? x.SubItems[e.Column].Text 
                                : (double.MinValue / 2).ToString())).ToList();
            else if (sortType == 'd')   // dates
                sorted = lv.Items.Cast<ListViewItem>().Select(x => x)
                         .OrderBy(x => (Convert.ToDateTime(
                          DateTime.TryParse(x.SubItems[e.Column].Text, out dummyD)
                                  ? x.SubItems[e.Column].Text 
                                  : "1900-01-01").ToOADate() * order)).ToList();

            else  // strings
            {
                if (asc)
                    sorted = lv.Items.Cast<ListViewItem>().Select(x => x)
                               .OrderBy(x => x.SubItems.Count -1 < e.Column 
                               ? "" : (x.SubItems[e.Column].Text)).ToList();
                else sorted = lv.Items.Cast<ListViewItem>().Select(x => x)
                               .OrderByDescending(x => x.SubItems.Count -1 < e.Column 
                               ? "" : (x.SubItems[e.Column].Text)).ToList();
            }
        }
        catch (ArgumentOutOfRangeException ex) { return; }

        lv.Items.Clear();
        lv.Items.AddRange(sorted.ToArray());

        lv.Tag = "" + (asc ? "A" : "D") + sortType.ToString() + e.Column;
    }

}

该解决方案使用 LVTag来记住当前排序。

该解决方案期望数据存在,因此缺少子项将使排序失败

它是作为扩展方法编写的,因此在添加类后,您可以在任何对象上调用它ListView

private void someListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
  ListView lv = sender as ListView;
  string colTypes = "sds-n";   // string, date, string, excluded, number
  lv.SortByColumn(colTypes, e);
}
于 2016-10-30T11:47:50.293 回答
0

如果您只是在寻找一次性排序并且您可以在将数据添加到 ListView 之前访问数据,那么这是一个整洁的解决方案:

        string[] exampleData = { "1", "2", "3" };
        string[] namesToSortBy = { "Sam", "Bill", "Jeff" };

        SortedList<string, ListViewItem> alphabetical = new SortedList<string, ListViewItem>();

        for (int i = 0; i < exampleData.Length; i++)
        {
            ListViewItem lvi = new ListViewItem();

            lvi.Text = exampleData[i];

            lvi.SubItems.Add(namesToSortBy[i]);

            alphabetical.Add(namesToSortBy[i], lvi);
        }

        foreach (KeyValuePair<string, ListViewItem> item in alphabetical)
        {
            listView1.Items.Add(item.Value);
        }
于 2019-10-18T23:58:56.277 回答