Как отсортировать столбец в DataGridView, который связан со списком в WinForm? - PullRequest
2 голосов
/ 04 ноября 2011

В моей форме есть DataGridView, и я связываю этот DataGridView со списком.Для столбца установлено значение SortMode=Automatic.

Это мой код

List<string> lstLines = new List<string>();
StreamReader sr = new StreamReader(tbFile.Text);
while ((line = sr.ReadLine()) != null)
{
  lstLines.Add(line);
}
dgvLines.DataSource = lstLines.Select(x=>new {Text=x}).ToList();

Когда я нажимал на заголовок столбца, я ожидал, что столбец будет отсортирован, но ничего не происходит.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Вы можете попробовать это ......

Полный код для сортировки столбца таблицы данных, источником данных которого является общий список

// ----------------------------------------------------------------------------------------- // В форме - при загрузке конструктора или формы заполните сетку.// --------------------------------------------------------------------------------------------

    List<student> students;

    private void PopulateList()
    {
        student std1 = new student("sss", 15, "Female");
        student std2 = new student("ddd", 12, "Male");
        student std3 = new student("zzz", 16, "Male");
        student std4 = new student("qqq", 14, "Female");
        student std5 = new student("aaa", 11, "Male");
        student std6 = new student("lll", 13, "Female");

        students = new List<student>();
        students.Add(std1);
        students.Add(std2);
        students.Add(std3);
        students.Add(std4);
        students.Add(std5);
        students.Add(std6);

        dataGridView1.DataSource = students;
    }

// ---------------------------------------------------------------------------------------------

// Класс Comparer для выполнения сортировки на основе имени столбца и порядка сортировки // ---------------------------------------------------------------------------------------------

class StudentComparer : IComparer<Student>
{
    string memberName = string.Empty; // specifies the member name to be sorted
    SortOrder sortOrder = SortOrder.None; // Specifies the SortOrder.

    /// <summary>
    /// constructor to set the sort column and sort order.
    /// </summary>
    /// <param name="strMemberName"></param>
    /// <param name="sortingOrder"></param>
    public StudentComparer(string strMemberName, SortOrder sortingOrder)
    {
        memberName = strMemberName;
        sortOrder = sortingOrder;
    }

    /// <summary>
    /// Compares two Students based on member name and sort order
    /// and return the result.
    /// </summary>
    /// <param name="Student1"></param>
    /// <param name="Student2"></param>
    /// <returns></returns>
    public int Compare(Student Student1, Student Student2)
    {
        int returnValue = 1;
        switch (memberName)
        {
            case "Name" :
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = Student1.Name.CompareTo(Student2.Name);
                }
                else
                {
                    returnValue = Student2.Name.CompareTo(Student1.Name);
                }

                break;
            case "Sex":
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = Student1.Sex.CompareTo(Student2.Sex);
                }
                else
                {
                    returnValue = Student2.Sex.CompareTo(Student1.Sex);
                }
                break;
            default:
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = Student1.Name.CompareTo(Student2.Name);
                }
                else
                {
                    returnValue = Student2.Name.CompareTo(Student1.StudentId);
                }
                break;
        }
        return returnValue;
    }
}

// ---------------------------------------------------------------------------------------------

// Выполнение сортировки по щелчку заголовка столбца // ---------------------------------------------------------------------------------------------

    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        //get the current column details
        string strColumnName = dataGridView1.Columns[e.ColumnIndex].Name;
        SortOrder strSortOrder = getSortOrder(e.ColumnIndex);

        students.Sort(new StudentComparer(strColumnName, strSortOrder));
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = students;
        customizeDataGridView();
        dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder;
    }

   /// <summary>
    /// Get the current sort order of the column and return it
    /// set the new SortOrder to the columns.
    /// </summary>
    /// <param name="columnIndex"></param>
    /// <returns>SortOrder of the current column</returns>
    private SortOrder getSortOrder(int columnIndex)
    {
        if (dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.None ||
            dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.Descending)
        {
            dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
            return SortOrder.Ascending;
        }
        else
        {
            dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
            return SortOrder.Descending;
        }
    }

Я надеюсь, что это поможет вам .....

1 голос
/ 01 апреля 2014

Немного переработан код из ответа:

class StudentComparer : IComparer<Student>
{
    private readonly string _memberName = string.Empty; // the member name to be sorted
    private readonly SortOrder _sortOrder = SortOrder.None;

    public StudentComparer(string memberName, SortOrder sortingOrder)
    {
        _memberName = memberName;
        _sortOrder = sortingOrder;
    }

    public int Compare(student student1, student student2)
    {
        if (_sortOrder != SortOrder.Ascending)
        {
            var tmp = student1;
            student1 = student2;
            student2 = tmp;
        }

        switch (_memberName)
        {
            case "Name":
                return student1.Name.CompareTo(student2.Name);
            case "Sex":
                return student1.Sex.CompareTo(student2.Sex);
            default:
                return student1.Name.CompareTo(student2.Name);
        }
    }
}

//

private void dgwOrders_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridViewColumn column = dataGridView1.Columns[e.ColumnIndex];

    string columnName = column.Name;

    SortOrder sortOrder = column.HeaderCell.SortGlyphDirection == SortOrder.Ascending
                              ? SortOrder.Descending
                              : SortOrder.Ascending;

    students.Sort(new StudentComparer(columnName, sortOrder));

    dataGridView1.Refresh();

    column.HeaderCell.SortGlyphDirection = sortOrder;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...