Курорт DataGridView после добавления в связанный список - PullRequest
0 голосов
/ 29 мая 2018

У меня есть 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 делать то, для чего он предназначен.

...