Zmiana kolejności kolumn wg wartości pola - DataGridView

0

Witam. Nie mogę sobie z tym poradzić i proszę o pomoc :) Chcę zmienić kolejności kolumn - to umiem. Tylko, że kolejność kolumn zależy od "wartości" kolumn. Wyjaśniam. Każda kolumna w jednym polu ma pewną wartość. I na podstawie tych wartości trzeba posortować kolumny, ale nie komórki tylko samą kolejność kolumn. Przykład:

kolumna1 kolumna2 kolumna3
... ... ...
5 1 10

Kolumny powinny mieć kolejność względem tych pól czyli:

kolumna3 kolumna1 kolumna2
... ... ...
10 5 1

Nie mogę sobie poradzić z tym sortowaniem właśnie, żeby połączyć indexy + wartości. Kombinowałem z listami, tablicami, słownikiem i ciągle mi się sypie coś. Może ktoś będzie wiedział jak to zrobić :| Ja będę próbowałem dalej.


Jak ktoś się chce pośmiać to oto jedna próba :D

List<int[]> newIndices = new List<int[]>();
for (int i = 1; i < dgvPoints.Columns.Count; i++)
    if (dgvPoints[i, 10].Value != null)
        newIndices.Add(new int[2] {i, int.Parse(dgvPoints[i, 10].Value.ToString())});
     else
        newIndices.Add(new int[2] {i, 0});

newIndices.Sort();

for (int i = 1; i < dgvPoints.Columns.Count; i++)
    dgvPoints.Columns[i].DisplayIndex = newIndices[i - 1][1];

[...] Now only god knows... ;)

0

A jaki jest cel tej zamiany kolejności kolumn??
Kolumna to kolumna dane są w niej ważne. Użytkownicyczęsto sami zmieniaja ich kolejność.

0

Chodzi o to, że kolumny mają być po kolei względem tych pól. Nie wiąże się to z ogólnym przeznaczeniem DataGridView, po prostu tak musi być :/


Dobra poradziłem sobie jednak, walka się opłacała. Zrobiłem to tak:

 // sort columns:
                List<DataGridViewColumn> columns = new List<DataGridViewColumn>();
                foreach (DataGridViewColumn c in dgvPoints.Columns)
                    if (c.Index != 0)
                        columns.Add(c);

                columns.Sort(new Comparison<DataGridViewColumn>(CompareBySum));

                foreach (DataGridViewColumn c in dgvPoints.Columns)
                    if (c.Index != 0)
                        c.DisplayIndex = columns.IndexOf(c) + 1;
            }
        }

        private int CompareBySum(DataGridViewColumn c1, DataGridViewColumn c2)
        {
            int value1, value2;

            if (dgvPoints[c1.Index, 10].Value != null)
                value1 = int.Parse(dgvPoints[c1.Index, 10].Value.ToString());
            else
                value1 = 0;

            if (dgvPoints[c2.Index, 10].Value != null)
                value2 = int.Parse(dgvPoints[c2.Index, 10].Value.ToString());
            else
                value2 = 0;

            if (value1 > value2)
                return -1;
            else if (value1 < value2)
                return 1;
            else
                return 0;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1