У меня есть DataGridView в приложении C # WinForms, которое имеет семь столбцов и используется для двух сценариев, назовите их Сценарий A и Сценарий B, которые используют точно такие же данные, но показывают разные столбцы: -
Первый столбец никогда не виден (это внутренний идентификатор)
Второй и третий столбцы всегда видны
Четвертый и пятый столбцы видны в сценарии A
шестой и седьмой столбцы видны в сценарии B
Источник данных является источником привязки, а второй-седьмой столбцы настроены одинаково в свойстве Columns Collection объекта DataGridView.Единственное различие между каждым столбцом - это HeaderText, DataPropertyName и Width.
В частности, для всех шести столбцов для SortMode установлено значение Automatic, а для ColumnType - DataGridViewTextBoxColumn.
Каждый столбец является столбцом с привязкой к базе данных, связаннымк одному из полей источника привязки.
Все столбцы показывают правильные данные.
Если я щелкну заголовок для второго или третьего столбца, в любом сценарии они будут отсортированы правильно,и по возрастанию, и по убыванию.
Если я нахожусь в Сценарии A, где показаны столбцы четвертый и пятый, и нажимаю на заголовки для любого из них, они оба сортируются правильно, как по возрастанию, так и по убыванию.
Если я нахожусь в Сценарии B, который показывает столбцы шесть и семь, и нажимаю на заголовки для любого из них, они оба сортируют НЕПРАВИЛЬНО, как по возрастанию, так и по убыванию.
Даже незнакомец, столбцы шесть и семь недаже не дают одинаковые результаты каждый раз.
Например, скажем, данные в шестом столбце пустые,пусто, A, A, B, B, B, C, D, D
Данные изначально сортируются по столбцу два, поэтому столбец шестой не сортируется.
Я щелкаю заголовок столбцашесть, стрелка сортировки показывает возрастание, но данные пусты, B, пусто, D, C, A, B, A, D, B
Я снова щелкаю заголовок шестого столбца, теперь стрелка сортировкипоказывает по убыванию, но данные B, пустые, C, D, D, пустые, A, B, A, B
Я снова щелкаю заголовок шестого столбца, стрелка сортировки показывает возрастание, но данныетеперь пусто, D, C, A, пусто, B, B, A, D, B, отличается от предыдущего возрастающего порядка
Я снова щелкаю заголовок шестого столбца, стрелка сортировки теперь отображается по убыванию,но теперь данные D, пустые, A, B, B, пустые, C, D, A, B, отличающиеся от предыдущего убывающего порядка.
Однако после третьего цикла кажется, что они устанавливаются наордер, по-прежнему не отсортированный должным образом, но, по крайней мере, стабильный, поэтому все возрастающие ордера одинаковы, а все убывающие ордера с этого момента одинаковы, пока я не закрою изаново откройте форму.
Код сортировки для этой сетки вообще не существует, он остается обрабатывать сам.
Код очень прост (сокращен до соответствующих битов, иимена изменены для ясности): -
В событии Load формы данные выбираются и присваиваются источнику привязки.Это одни и те же данные независимо от сценария.
Затем я устанавливаю флаг Visible в значение true или false для столбцов 4-7 в зависимости от сценария (для всех четырех столбцов в конструкторе установлено значение visible = true).
private void Form_Load(object sender, EventArgs e)
{
GetData();
SetColumnsVisible();
}
private void GetData()
{
_bindingSource.DataSource = _dataService.GetData();
}
private void SetColumnsVisible()
{
if (_scenario == ScenarioA)
{
dgvData.Columns["ColumnFour"].Visible = true;
dgvData.Columns["ColumnFive"].Visible = true;
dgvData.Columns["ColumnSix"].Visible = false;
dgvData.Columns["ColumnSeven"].Visible = false;
}
if (_scenario == ScenarioB)
{
dgvData.Columns["ColumnFour"].Visible = false;
dgvData.Columns["ColumnFive"].Visible = false;
dgvData.Columns["ColumnSix"].Visible = true;
dgvData.Columns["ColumnSeven"].Visible = true;
}
dgvData.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.False;
}
Весь оставшийся код формы не связан с сортировкой, и все работает правильно.
Я вставил событие, чтобы отследить щелчки заголовка столбца, чтобы проверить, возможно ли это былопытается отсортировать по одному из невидимых столбцов, но индекс столбца является правильным в каждом случае, например, если я нахожусь в сценарии B и щелкаю заголовок для столбца шесть, индекс столбца равен 5 (так как индекс начинается с 0).
Не то, чтобы сортировка по другому столбцу объясняла бы разные результаты первые несколько раз, но это стоило того.
Любой, у кого когда-либо был DataGridView, просто выдавал случайные результаты, когда вы щелкали по столбцуотсортировать это?
Или есть мысли о том, как это исправить?
Подводя итог: -
Точно такие же данные используются в любом случае.
Столбцы настроены одинаково.
Код сортировки отсутствует, только сортировка по умолчанию DataGridView.
Столбцы со второго по пятый сортируются правильно каждый раз.
Столбцы шестой и седьмой сортируются каждый раз неправильно, и первые три раза будут отличаться перед установкой.