■■■

2016年3月31日木曜日

DataGridViewで自動ソートされるようにする方法

DataGridViewで自動ソートされるようにする方法
VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim c As DataGridViewColumn
For Each c In dgv1.Columns
c.SortMode = DataGridViewColumnSortMode.Automatic
Next c
End Sub

Private Sub btn1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btn1.Click
If dgv1.CurrentCell Is Nothing Then
Return
End If


Dim sortColumn As DataGridViewColumn = _
dgv1.CurrentCell.OwningColumn

Dim sortDirection As System.ComponentModel.ListSortDirection = _
System.ComponentModel.ListSortDirection.Ascending
If Not (dgv1.SortedColumn Is Nothing) AndAlso _
dgv1.SortedColumn.Equals(sortColumn) Then
sortDirection = IIf(dgv1.SortOrder = SortOrder.Ascending, _
System.ComponentModel.ListSortDirection.Descending, _
System.ComponentModel.ListSortDirection.Ascending)
End If

dgv1.Sort(sortColumn, sortDirection)
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
foreach (DataGridViewColumn c in dgv1.Columns)
c.SortMode = DataGridViewColumnSortMode.Automatic;
}

private void btn1_Click(object sender, EventArgs e)
{
if (dgv1.CurrentCell == null)
return;

DataGridViewColumn sortColumn = dgv1.CurrentCell.OwningColumn;

ListSortDirection sortDirection = ListSortDirection.Ascending;
if (dgv1.SortedColumn != null &&
dgv1.SortedColumn.Equals(sortColumn))
{
sortDirection =
dgv1.SortOrder == SortOrder.Ascending ?
ListSortDirection.Descending : ListSortDirection.Ascending;
}

dgv1.Sort(sortColumn, sortDirection);
}
強制的にDataGridViewをソートさせる方法
VB.NET
Private Sub dgv1_ColumnHeaderMouseClick(ByVal sender As Object, _
ByVal e As DataGridViewCellMouseEventArgs) _
Handles dgv1.ColumnHeaderMouseClick
Dim clickedColumn As DataGridViewColumn = _
dgv1.Columns(e.ColumnIndex)
If clickedColumn.SortMode <> DataGridViewColumnSortMode.Automatic Then
Me
.SortRows(clickedColumn, True)
End If
End Sub


Private Sub dgv1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles dgv1.RowsAdded
Me.SortRows(dgv1.SortedColumn, False)
End Sub

Private Sub dgv1_CellValueChanged(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs) _
Handles dgv1.CellValueChanged
If Not (dgv1.SortedColumn Is Nothing) AndAlso _
e.ColumnIndex = dgv1.SortedColumn.Index Then
Me
.SortRows(dgv1.SortedColumn, False)
End If
End Sub


Private Sub SortRows(ByVal sortColumn As DataGridViewColumn, _
ByVal orderToggle As Boolean)
If sortColumn Is Nothing Then
Return
End If


If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic AndAlso _
Not (dgv1.SortedColumn Is Nothing) AndAlso _
Not dgv1.SortedColumn.Equals(sortColumn) Then
dgv1.SortedColumn.HeaderCell.SortGlyphDirection = _
SortOrder.None
End If

Dim sortDirection As System.ComponentModel.ListSortDirection
If orderToggle Then
sortDirection = IIf(dgv1.SortOrder = SortOrder.Descending, _
System.ComponentModel.ListSortDirection.Ascending, _
System.ComponentModel.ListSortDirection.Descending)
Else
sortDirection = IIf(dgv1.SortOrder = SortOrder.Descending, _
System.ComponentModel.ListSortDirection.Descending, _
System.ComponentModel.ListSortDirection.Ascending)
End If
Dim
sOrder As SortOrder = _
IIf(sortDirection = System.ComponentModel.ListSortDirection.Ascending, _
SortOrder.Ascending, SortOrder.Descending)

dgv1.Sort(sortColumn, sortDirection)

If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic Then
sortColumn.HeaderCell.SortGlyphDirection = sOrder
End If
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
dgv1.RowsAdded += new DataGridViewRowsAddedEventHandler(
dgv1_RowsAdded);
dgv1.CellValueChanged += new DataGridViewCellEventHandler(
dgv1_CellValueChanged);
dgv1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(
dgv1_ColumnHeaderMouseClick);
}

private void dgv1_ColumnHeaderMouseClick(object sender,
DataGridViewCellMouseEventArgs e)
{
DataGridViewColumn clickedColumn = dgv1.Columns[e.ColumnIndex];
if (clickedColumn.SortMode != DataGridViewColumnSortMode.Automatic)
this.SortRows(clickedColumn, true);
}

private void dgv1_RowsAdded(object sender,
DataGridViewRowsAddedEventArgs e)
{
this.SortRows(dgv1.SortedColumn, false);
}

private void dgv1_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
{
if (dgv1.SortedColumn != null &&
e.ColumnIndex == dgv1.SortedColumn.Index)
this.SortRows(dgv1.SortedColumn, false);
}

private void SortRows(DataGridViewColumn sortColumn, bool orderToggle)
{
if (sortColumn == null)
return;

if (sortColumn.SortMode == DataGridViewColumnSortMode.Programmatic &&
dgv1.SortedColumn != null &&
!dgv1.SortedColumn.Equals(sortColumn))
{
dgv1.SortedColumn.HeaderCell.SortGlyphDirection =
SortOrder.None;
}

ListSortDirection sortDirection;
if (orderToggle)
{
sortDirection =
dgv1.SortOrder == SortOrder.Descending ?
ListSortDirection.Ascending : ListSortDirection.Descending;
}
else
{
sortDirection =
dgv1.SortOrder == SortOrder.Descending ?
ListSortDirection.Descending : ListSortDirection.Ascending;
}
SortOrder sortOrder =
sortDirection == ListSortDirection.Ascending ?
SortOrder.Ascending : SortOrder.Descending;

dgv1.Sort(sortColumn, sortDirection);

if (sortColumn.SortMode == DataGridViewColumnSortMode.Programmatic)
{
sortColumn.HeaderCell.SortGlyphDirection = sortOrder;
}
}




■■■