1

学生とそのテストの点数を含む「StudentRecords」のリストがあります。各生徒について、名前、年齢、連絡先電話番号、テストの点数、テストを受けた日付を持っています。

public class StudentRecord
{
       public String Name  { get; set; }
       public int Age  { get; set; }
       public String PhoneNum  { get; set; }
       public int TestScore1  { get; set; }
       public DateTime TestScore1Date  { get; set; }
}

List<StudentRecord> StudentList = new List<StudentRecord>();
dataGridView1.DataSource = StudentList;

List を DataGridView コントロールにバインドし、情報を表示できるようになりました。ここで、DataGrid コントロール内で、最初に名前、次にスコア、次に年齢などで List の内容を並べ替えられるようにしたいと考えています。

私はこれを見つけました: http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.columnheadermouseclick.aspx

デフォルトの動作は、クリックされた列ヘッダーに基づいてグリッド行を並べ替えることです。ただし、クリックしてもデフォルトでは発生しません。実際、列ヘッダーをクリックしても何も起こりません。私が間違っているかもしれないことは何ですか?

4

3 に答える 3

3

残念ながら、この動作はコントロールですぐに使用できませんDataGridView。バインディング ソースとして使用List<T>し、列のクリック ソートを可能にするには、次のように のColumnHeaderMouseClickイベントを処理する必要があります。DataGridView

protected void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    // Get the information about the column clicked
    var strColumnName = dataGridView1.Columns[e.ColumnIndex].Name;
    SortOrder strSortOrder = getSortOrder(e.ColumnIndex);

    // Sort the list
    StudentList.Sort(new StudentComparer(strColumnName, strSortOrder));

    // Rebind to use sorted list
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = StudentList;

    // Update user interface icon for sort order in column clicked
    dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder;
}

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;
    }
}

public class StudentComparer : IComparer<StudentRecord>
{
    string memberName = String.Empty;
    SortOrder sortOrder = SortOrder.None;

    public StudentComparer(string strMemberName, SortOrder sortingOrder)
    {
        memberName = strMemberName;
        sortOrder = sortingOrder;
    }

    public int Compare(StudentRecord student1, StudentRecord 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 "Age":
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = student1.Age.CompareTo(student2.Age);
                }
                else
                {
                    returnValue = student2.Age.CompareTo(student1.Age);
                }
                break;
            case "PhoneNum":
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = student1.PhoneNum.CompareTo(student2.PhoneNum);
                }
                else
                {
                    returnValue = student2.PhoneNum.CompareTo(student1.PhoneNum);
                }
                break;
            case "TestScore1":
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = student1.TestScore1.CompareTo(student2.TestScore1);
                }
                else
                {
                    returnValue = student2.TestScore1.CompareTo(student1.TestScore1);
                }
                break;
            case "TestScore1Date":
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = student1.TestScore1Date.CompareTo(student2.TestScore1Date;
                }
                else
                {
                    returnValue = student2.TestScore1Date.CompareTo(student1.TestScore1Date);
                }
                break;
            default:
                if (sortOrder == SortOrder.Ascending)
                {
                    returnValue = Student1.Name.CompareTo(Student2.Name);
                }
                else
                {
                    returnValue = Student2.Name.CompareTo(Student1.Name);
                }
                break;
        }
        return returnValue;
    }
}

注: デフォルトのソート基準はNameです。

于 2013-11-05T03:12:44.410 に答える
1

データグリッドがデータを並べ替えることができるように、カスタム コードを実装する必要があります。デフォルトの動作に関するそのドキュメントの意味は、デザイン モードでグリッドをダブルクリックすると、VS がこのイベントを処理するメソッドを生成することです。これを読んでください:DataGridの並べ替え

于 2013-11-05T03:02:53.290 に答える
0

まず、その動作を実装する必要があると思いますが、すぐに使えるとは思えません。

次に、 を使用してオブジェクトを簡単にソートし、LINQ適切なグループなどを作成できます。

ここで、クリック数に応じてさまざまな基準で並べ替えたい場合は、ListView を使用する必要があるかもしれません。その後でフィルターを設定できますが、通常、これを行うには少し時間がかかります。これがMSDNページで、一番下にはクリックされたヘッダーでソートする方法へのリンクがあります...

于 2013-11-05T03:03:18.137 に答える