web-dev-qa-db-ja.com

DataGridViewで列ヘッダーの並べ替えを無効にする最良の方法

DataGridViewの列ヘッダーの並べ替えを無効にする必要があります。

個々の列のプロパティを次のように設定することでそれを行うことができます

BalancesGridView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;

この場合、すべての列をループする必要があります。

より良い方法はありますか?

28
Ananth

いいえ、列にSortModeを直接設定することは、できる限り良いと思います。しかし、正直なところ、誰が気にしますか?単純なループの何がそんなに悪いのですか?

14
bitbonk

これについて何がそんなに悪いの?列をループするのが面倒な場合、または複数のDataGridViewがある場合は、このための拡張メソッドを記述できます。

public static class DatatGridViewExtensions
{
    public static void SetColumnSortMode(this DataGridView dataGridView, DataGridViewColumnSortMode sortMode)
    {
        foreach (var column in dataGridView.Columns)
        {
            column.SortMode = sortMode;
        }
    }
}

次のように使用します。

BalancesGridView.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);
13
VVS

誰もあなたにこれを行うLinqの方法を提案しない理由はわかりません:

BalancesGridView.Columns.Cast<DataGridViewColumn>().ToList().ForEach(f => f.SortMode = DataGridViewColumnSortMode.NotSortable);
8
Co. Aden

特にデータソースが時々変更される場合、列をループすることはそれほど良い答えではありません。 ColumnAddedイベントの1行のコードでトリックが行われます。

e.Column.SortMode = DataGridViewColumnSortMode.NotSortable
4
oldvbguy

まあ、これは少し古いですが、個々の列のソートモードを設定するためのループには少し問題があります。たとえば、ユーザーが列を追加できるようにしてから、もう一度すべてループするか、追加された列を見つける必要がありますソートモードを設定します。それはもう少し作業です。

私が見つけた解決策は次のリンクのようなものです: DataGridView列ヘッダーをクリックしたときにソートを無効にする

その中に、そのDataGridViewにColumnAddedのイベントハンドラーを追加するだけなので、datagridが列を追加するたびに、ソート不可として自動的に設定されます。

これは実際には@OldDogの答えとまったく同じです。違いは、彼の答えでは、ソートモードがラウンドアバウトに設定されていることです。

Private Sub DataGridView1_ColumnAdded(sender As Object, e As DataGridViewColumnEventArgs) Handles DataGridView1.ColumnAdded
    e.Column.SortMode = DataGridViewColumnSortMode.NotSortable
End Sub
4
am05mhz

今日、この問題に遭遇しました。このメソッドを作成し、フォームロードイベントで呼び出しました。

    public void DisableGridviewSorting(DataGridView grid, int index)
    {
        //Index = DataGridView.Columns.Count
        for (int i = 0; i < index; i++)
        {
            grid.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
        }
    }

バインドされたデータを使用しない限り、どのように実行してもDataGridViewをループしているように見えます。次に、各列にソート不可を設定できます。

3
Andrew

実行時にDataGridViewを構築する場合、ColumnAddedイベントを使用して列が追加されるときに列の並べ替えを無効にできます。

private void BalancesGridView_ColumnAdded(object sender, System.Windows.Forms.DataGridViewColumnEventArgs e)
{
     e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}
2
OldDog

私はこの方法でそれをやった:

private void gvItReq_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int colIdx = 0; colIdx < gvItReq.Columns.Count; colIdx++)
        gvItReq.Columns[colIdx].SortMode = DataGridViewColumnSortMode.NotSortable;
}
1
Bravo 3030

VBでは、列をソート不能にする各dgvに対して呼び出す小さなサブルーチンを使用します。

Public Sub subNo_Sort_DGV_Columns(dgv As DataGridView)

  For intColumn_Count As Integer = 1 To dgv.Columns.Count - 1
    dgv.Columns(intColumn_Count).SortMode = _ DataGridViewColumnSortMode.NotSortable
  Next

End Sub
0
Kristian

ソートを防ぐために私が見つけた最善の方法は、多くの列を処理する必要があると思われる場合にforループを定義することです。

for (int i = 0; i < 10; i++)
{
   dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}
0
Pasquale