У меня есть DataGridView, который связан с BindingSource, который связан с BindingList.Я могу отсортировать DataGridView, нажав на заголовок столбца, как и ожидалось.Но когда я помещаю элемент в DataGridView, он появляется внизу списка, а не в его правильном отсортированном положении.Я нашел код в сетке StackOverflow, чтобы проверить свойства сетки SortOrder и SortedColumn, а если они установлены, то прибегнуть к сетке.Однако, когда я помещаю точку останова в обработчик DragDrop, я обнаруживаю, что для SortOrder задано значение None, а для SortedColumn установлено значение null.
Вот обработчик DragDrop:
private void dgvCoils_DragDrop(object sender, DragEventArgs e)
{
int? coilStack = m_draggedCoil.Stack;
m_currentCharge.RemoveCoil(m_draggedCoil);
if (coilStack.HasValue)
{
DisplayStack(coilStack.Value);
}
if (!m_inventoryList.Any(coil => coil.Coil_id == m_draggedCoil.Coil_id))
{
m_inventoryList.Add(m_draggedCoil);
if (dgvCoils.SortOrder != SortOrder.None && dgvCoils.SortedColumn != null)
{
ListSortDirection dir = ListSortDirection.Ascending;
if (dgvCoils.SortOrder == SortOrder.Descending) dir = ListSortDirection.Descending;
dgvCoils.Sort(dgvCoils.SortedColumn, dir);
}
}
}
А вот код, в котором я создаю список и привязываю к нему источник:
InventorySet coilSet = new InventorySet(m_db);
coilSet.FilterOnField(coilSet.m_archived, 0);
coilSet.Open();
// coilBindingSource.DataSource = coilSet.UnderlyingTable;
while (!coilSet.IsEOF())
{
m_inventoryList.Add(coilSet.ExportData());
coilSet.MoveNext();
}
coilBindingSource.DataSource = m_inventoryList;
coilBindingSource.ResetBindings(false);
dgvCoils.Refresh();
Я не устанавливаюлюбые столбцы сортировки в моем объекте BindingSource.Нужно ли мне?
И нужно ли мне использовать BindingSource, если базовый список в BindingList?
Редактировать: просматривая свой исходный код, я вспомнил, что мне пришлось добавить код в мое событие ColumnHeaderMouseClickобработчик, чтобы заставить сортировку работать.Вот этот обработчик:
private void dgvCoils_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
string strColumnName = dgvCoils.Columns[e.ColumnIndex].DataPropertyName;
SortOrder strSortOrder = GetSortOrder(dgvCoils, e.ColumnIndex);
if (strSortOrder == SortOrder.Ascending)
{
m_inventoryList = new BindingList<InventorySetData>(m_inventoryList.OrderBy(x => typeof(InventorySetData).GetProperty(strColumnName).GetValue(x, null)).ToList());
}
else
{
m_inventoryList = new BindingList<InventorySetData>(m_inventoryList.OrderByDescending(x => typeof(InventorySetData).GetProperty(strColumnName).GetValue(x, null)).ToList());
}
dgvCoils.DataSource = m_inventoryList;
dgvCoils.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder;
}
Я предполагаю, что я делаю слишком много программно, и не позволяю DataGridView делать то, для чего он предназначен.