Tablica wielowymiarowa / tablice o różnych rozmiarach C#

0

Cześć. Po wielu godzinach rozmyślań i poszukiwań rozwiązań się wypaliłem... Do rzeczy:
Program ma składać się z form1 i form2. W form 2 mam datagridview(wierszy n, kolumn 14). Po uzupełnieniu danych w datagridview i zamknięciu form2, przenoszę dane do tablicy dwuwymiarowej Table[n,14] w form1.
Zależałoby mi na tym, żeby w momencie ponownego otworzenia form2 i uzupełnieniu danych dodawać te dane do tablicy Table (kontynuować tablice). Próbowałem już opcję z trzema wymiarami Table[m,n,14], ale problem pojawia się gdy ilość wierszy w kolejnych datagridview jest różna. Nie mogę wtedy założyć rozmiaru tablicy "n" Table[m,n,14]. Nie wiem też ile razy będzie sporządzany nowy datagridview więc wartość "m" też nie jest znana..
To chyba bez sensu zakładać tablicę Table[100,1000,14] i później usuwać puste miejsca NULL...
Będę wdzięczny za każdą sugestię.

3

Może zamiast tablic opakować te dane w jakąś klasę/strukturę a następnie tworzyć listę?

0

Dziękuję za podpowiedź atmal. Będę próbował w tą stronę :)

1

Jeśli ilość danych nie jest przytłaczająca (mówię o tysiącach operacji) to jak mówił @atmal opakuj sobie dane w jaką klasę czy strukturę :). List wydaje się najłatwiejsza do implementacji ale zerknij do reszty typów kolekcji: Rozdział 7

0

Bardzo trafione. W tabli mam 14 kolumn i max 200-300 wierszy. Więc ilość typów obiektów(?) w klasie będzie wynosić 18 (18 kolumn). Ilość wprowadzanych tabel może być różna, ale max 100. Wyników niby robi się sporo, ale chyba bez problemu będę mógł wczytać interesujące mnie dane z powrotem do tabeli...
Nie wiem czy dobrze kombinuje, ale mogę liczyć liczbę wierszy, które wprowadzam do listy z danej tabli (będę znał indeks początkowy i końcowy listy, którą tworzę)?

0

Nie bardzo rozumiem, raz piszesz, że masz 14 kolumn raz, że 18 kolumn. Możesz spróbować tworzyć obiekt, jako wiersz w tabeli, który posiada te 18 pól :) i do nich przypisać odpowiednie dane z tabeli. Potem stworzysz np 300 obiektów bo tyle masz wierszy. Lista i wiele innych kolekcji danych , które ci wysłałem nie wymagają deklaracji długości (czy tez wymiarów). Oznacza to, że możesz dowolnie dodawać kolejne obiekty/elementy listy :). Ważne lista musi być typu takiego jak twoje obiekty. https://www.dotnetperls.com/list Tutaj masz przykład jak działa lista. Jeśli chcesz to możesz uzyskać aktualną długość listy korzystając z:

nazwaTwojejListy.Count() 

Ja to widzę tak tworzysz klasę która będzie zawierać pojedynczy wiersz:

public class Row
    {
        ///tutaj wpisujesz sobie propertisy, które będą odpowiadać danym przechowywanym w kolejnych kolumnach.
    }

Później tworzysz obiekty Row i pakujesz do listy typu row:

var row1 = new Row(); 

var list = new List<Row>();
list.Add(row1)
0

Przepraszam, oczywiście chodzi o 14 kolumn :) Dziękuję za nakierowanie na sposób. Dopiero zaczynam przygodę z programowaniem i z C#, więc trochę błądzę. Spróbuje zrobić to tak jak piszesz i dam znać jakie wnioski :)

0

Już natrafiłem na problem. Datagridview zawiera na razie 3 kolumny. W pętli for chcę odczytać ZAWSZE pierwszy element listy. Nie wiem dlaczego MessageBox wyświetla mi aktualny element na którym jest pętla, a nie element pierwszy...

        class Row
        {
            public string a;
            public string b;
            public string c;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var row1 = new Row();
            var list = new List<Row>();

            for (int r = 0; r < dataGridView1.RowCount; r++) //ilosć powtórzeń równa liczbie wierszy 
            {
                row1.a = dataGridView1[0, r].Value.ToString(); //zapis do row1
                row1.b = dataGridView1[1, r].Value.ToString();
                row1.c = dataGridView1[2, r].Value.ToString();
                list.Add(row1); // dodanie row1 do listy
                var row2 = list[0];  // chcę odczytać zawsze pierwszy wyraz z listy (pierwszy wiersz)
                MessageBox.Show("a. " + row2.a + ", b. " + row2.b + ", c.  " + row2.c);
            }

            MessageBox.Show("liczba elementów listy: " + list.Count); // liczba elementów listy (liczba wierszy) jest prawidłowa

        }

Ilość elementów w liście jest prawidłowa...

1

Wydaje mi się, że masz błąd w pętli for według mnie powinna ona tak wyglądać:

 private void button1_Click(object sender, EventArgs e)
        {
           
            var list = new List<Row>();

            for (int r = 0; r < dataGridView1.RowCount; r++) //ilosć powtórzeń równa liczbie wierszy 
            {
               var row1 = new Row();
                row1.a = dataGridView1[0, r].Value.ToString(); //zapis do row1
                row1.b = dataGridView1[1, r].Value.ToString();
                row1.c = dataGridView1[2, r].Value.ToString();
                list.Add(row1); // dodanie row1 do listy
               
                MessageBox.Show("a. " + list[0].a + ", b. " + list[0].b + ", c.  " + list[0].c);
            }

            MessageBox.Show("liczba elementów listy: " + list.Count); // liczba elementów listy (liczba wierszy) jest prawidłowa

        }

Nie tworzyłeś nowego obiektu tylko zmieniałeś stary obiekt dlatego obserwowałeś aktualne zmiany. Jakbyś podejrzał na debugu to w liście będą takie same obiekty ciągle bo dodajesz ciągle ten sam obiekt.

0

Dziękuję za pomoc Akihito. Problem rozwiązany, wszystko działa jak należy :)

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