private async void RestoreSortIfNeed() { if (this.InvokeRequired) { this.BeginInvoke(_RestoreSortIfNeedAction); return; } if (!_LastSortInfo.TryGetSorting(out var columnIndex, out var sortOrder)) { DGV.ClearHeaderSortGlyphDirection(); return; } #region [.get comparison routine.] var comparison = default(Comparison <DownloadRow>); switch (columnIndex) { case OUTPUTFILENAME_COLUMN_INDEX: comparison = (x, y) => string.Compare(x.OutputFileName, y.OutputFileName, true); break; case OUTPUTDIRECTORY_COLUMN_INDEX: comparison = (x, y) => string.Compare(x.OutputDirectory, y.OutputDirectory, true); break; case STATUS_COLUMN_INDEX: comparison = (x, y) => SortHelper.ToInt32(x.Status).CompareTo(SortHelper.ToInt32(y.Status)); break; case DOWNLOAD_PROGRESS_COLUMN_INDEX: comparison = (x, y) => x.SuccessDownloadParts.CompareTo(y.SuccessDownloadParts); break; case DOWNLOAD_BYTES_COLUMN_INDEX: comparison = (x, y) => x.DownloadBytesLength.CompareTo(y.DownloadBytesLength); break; case APPROX_REMAINED_BYTES_COLUMN_INDEX: comparison = (x, y) => x.GetApproxRemainedBytes().CompareTo(y.GetApproxRemainedBytes()); break; case APPROX_TOTAL_BYTES_COLUMN_INDEX: comparison = (x, y) => x.GetApproxTotalBytes().CompareTo(y.GetApproxTotalBytes()); break; case URL_COLUMN_INDEX: comparison = (x, y) => string.Compare(x.Url, y.Url, true); break; case DOWNLOAD_TIME_COLUMN_INDEX: case APPROX_REMAINED_TIME_COLUMN_INDEX: case DOWNLOAD_SPEED_COLUMN_INDEX: //---comparison = (x, y) => x..CompareTo( y. ); return; default: DGV.ClearHeaderSortGlyphDirection(); throw (new NotImplementedException($"columnIndex: {columnIndex}")); } #endregion var coeff = ((sortOrder == SortOrder.Ascending) ? 1 : -1); var row = GetSelectedDownloadRow(); _Model.Sort(SortHelper.CreateComparison(comparison, coeff)); DGV.SetHeaderSortGlyphDirection(columnIndex, sortOrder); await Task.Delay(1); SelectDownloadRowInternal(row, true); }