2016-09-28 15 views
0

スタックオーバーフローWebサイトを掃除して、この問題を解決しようとしている私の頭を叩いていましたが、WindowsフォームDataGridView C#:タグ名と値の名前でデータを並べ替え

基本的には、私はDataGridViewを値の名前で列0を並べ替えるために、またタグ名で並べ替えるためにWindowsフォームに持っています。私は私の問題を示すのに役立つ簡単なコードを作成しました。

私はソートがトリガーされた値

public Form1() 
{ 
    InitializeComponent(); 
    dataGridView1.Rows.Add(11); 
    //column 1 
    dataGridView1.Rows[0].Cells[0].Value = "0 - TITLE"; 
    dataGridView1.Rows[1].Cells[0].Value = "1"; 
    dataGridView1.Rows[2].Cells[0].Value = "2"; 
    dataGridView1.Rows[3].Cells[0].Value = "3"; 
    dataGridView1.Rows[4].Cells[0].Value = "4"; 
    dataGridView1.Rows[5].Cells[0].Value = "5"; 
    dataGridView1.Rows[6].Cells[0].Value = "6"; 
    dataGridView1.Rows[7].Cells[0].Value = "7"; 
    dataGridView1.Rows[8].Cells[0].Value = "8"; 
    dataGridView1.Rows[9].Cells[0].Value = "9"; 
    dataGridView1.Rows[10].Cells[0].Value = "10"; 


    dataGridView1.Rows[0].Cells[0].Tag = "TITLE"; 
    dataGridView1.Rows[1].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[2].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[3].Cells[0].Tag = "FAIL"; 
    dataGridView1.Rows[4].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[5].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[6].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[7].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[8].Cells[0].Tag = "FAIL"; 
    dataGridView1.Rows[9].Cells[0].Tag = "PASS"; 
    dataGridView1.Rows[10].Cells[0].Tag = "PASS"; 
    //column 2 
    dataGridView1.Rows[0].Cells[1].Value = "A - TITLE"; 
    dataGridView1.Rows[1].Cells[1].Value = "B - THIS IS"; 
    dataGridView1.Rows[2].Cells[1].Value = "C - A"; 
    dataGridView1.Rows[3].Cells[1].Value = "D - TEST"; 
    dataGridView1.Rows[4].Cells[1].Value = "E - THAT"; 
    dataGridView1.Rows[5].Cells[1].Value = "F - I"; 
    dataGridView1.Rows[6].Cells[1].Value = "G - AM"; 
    dataGridView1.Rows[7].Cells[1].Value = "H - RUNNING"; 
    dataGridView1.Rows[8].Cells[1].Value = "I - RIGHT"; 
    dataGridView1.Rows[9].Cells[1].Value = "J - NOW"; 
    dataGridView1.Rows[10].Cells[1].Value = "K - !"; 
    //column 3 
    dataGridView1.Rows[0].Cells[2].Value = "0 - TITLE"; 
    dataGridView1.Rows[1].Cells[2].Value = "14.999999999999"; 
    dataGridView1.Rows[2].Cells[2].Value = "15.0001"; 
    dataGridView1.Rows[3].Cells[2].Value = "15.00"; 
    dataGridView1.Rows[4].Cells[2].Value = "15.0"; 
    dataGridView1.Rows[5].Cells[2].Value = "15"; 
    dataGridView1.Rows[6].Cells[2].Value = "11.99"; 
    dataGridView1.Rows[7].Cells[2].Value = "12.01"; 
    dataGridView1.Rows[8].Cells[2].Value = "12"; 
    dataGridView1.Rows[9].Cells[2].Value = "88.65"; 
    dataGridView1.Rows[10].Cells[2].Value = "33.25"; 

} 

第二部は、ボタンクリックトリガイベントである、とのDataGridViewを移入私の形での最初の部分。

private void button1_Click(object sender, EventArgs e) 
{ 
    DataGridViewColumn newColumn = dataGridView1.Columns[0]; 
    DataGridViewColumn oldColumn = dataGridView1.SortedColumn; 
    ListSortDirection direction; 

    // If oldColumn is null, then the DataGridView is not sorted. 
    if (oldColumn != null) 
    { 
     // Sort the same column again, reversing the SortOrder. 
     if (oldColumn == newColumn && 
      dataGridView1.SortOrder == SortOrder.Ascending) 
     { 
      direction = ListSortDirection.Descending; 
     } 
     else 
     { 
      // Sort a new column and remove the old SortGlyph. 
      direction = ListSortDirection.Ascending; 
      oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None; 
     } 
    } 
    else 
    { 
     direction = ListSortDirection.Ascending; 
    } 

    // Sort the selected column. 
    dataGridView1.Sort(newColumn, direction); 
    newColumn.HeaderCell.SortGlyphDirection = 
     direction == ListSortDirection.Ascending ? 
     SortOrder.Ascending : SortOrder.Descending; 
} 

ので、このコードは、値の名前(両方昇順と降順)で、列0を並べ替えることができますが、私はもう一度ボタンをクリックしたときに、私はタグ名でソートできるようにしたい、と特定の順序で、最初にタイトルを意味し、その後に失敗し、続いてパスを意味する。

誰かがアイディアを持っている場合は、私に知らせてください。ありがとう。

+0

あなたのデータソース、例えば 'DataTable'やデータが含まれている'一覧 'を並べ替えることができます。 –

+0

彼は1つ持っていないように見えます。 2番目と3番目の答え[ここ](http://stackoverflow.com/questions/435177/c-custom-sort-of-datagridview)は、DGVのカスタムソートの作成についてです。しかし、データソースを作成して使用する方が簡単かもしれませんが、カスタムの方が柔軟性があります。 – TaW

答えて

1

DGVにはDataSourceが含まれていないので、カスタムソートと書く必要があります。

これは実際には単純です。提供したいさまざまな種類の間で切り替えるためのロジックを記述することはおそらくより困難です。

まずあなたがソート可能になりたいすべての列を準備します

dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Automatic; 
dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Automatic; 
dataGridView1.Columns[2].SortMode = DataGridViewColumnSortMode.Automatic; 

は、あなたのカラム名を使用してください!

次に、SortCompareイベントをコードします。ここvalue.ToString表現の長さによってソート、簡単な例である:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
{ 
    var v1 = e.CellValue1.ToString().Length; 
    var v2 = e.CellValue2.ToString().Length; 
    e.SortResult = v1 < v2 ? -1 : v1 == v2 ? 0 : 1; 
    e.Handled = true; 
} 

あなたがless, equal and greaterを意味し、-1, 0 or 1のいずれかにe.SortResultを設定する必要が見ることができるように。そして、e.Handledパラメータをtrueに設定しました。

これがすべてです。あなたは、すべてのデータへのアクセス権を持っているのでなど

var v1 = dataGridView1[e.Column.Index, e.RowIndex1].Tag.ToString(); 

...もちろん

は、あなたがはるかに複雑なコードを書くことができ、処理:あなたはこのようなコードを使用することができますTagデータにアクセスするための

他の列のデータにアクセスすることもできます。

DataGridViewSortCompareEventArgs eを参照してください。多分SortCompareコードでColumnHeaderMouseClickイベントとテストでは、それをインクリメントし、あなたは現在の1を格納することができ、あなたのソートモードをswichする

..

1

あなたはSortメソッドを呼び出す前にDataGridView.SortCompareイベントにハンドラをアタッチすることができますし、そこにあなたのロジックを適用してください。例えば

static readonly Dictionary<string, int> sortOrder = new Dictionary<string, int> 
{ 
    { "TITLE", 0 }, 
    { "FAIL", 1 }, 
    { "PASS", 2 } 
}; 

static void OnSortCompareByTag(object sender, DataGridViewSortCompareEventArgs e) 
{ 
    var dgv = (DataGridView)sender; 
    var tag1 = dgv.Rows[e.RowIndex1].Cells[e.Column.Index].Tag as string; 
    var tag2 = dgv.Rows[e.RowIndex2].Cells[e.Column.Index].Tag as string; 
    int result = sortOrder[tag1].CompareTo(sortOrder[tag2]); 
    if (result == 0) 
     result = Comparer<string>.Default.Compare(e.CellValue1 as string, e.CellValue2 as string); 
    e.SortResult = result; 
    e.Handled = true; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    // ... 

    // Sort the selected column. 
    dataGridView1.SortCompare += OnSortCompareByTag; 
    dataGridView1.Sort(newColumn, direction); 
    dataGridView1.SortCompare -= OnSortCompareByTag; 

    // ...  
} 
関連する問題