Tablica struktury

0

Witam, mam pewien problem w C# i zatrzymałem się na strukturach.

Mam np.

 
public struct Struktura 
{
int a{get;set;};
int b{get;set;};
} 

potem mamy

 
public Strukura NowaStruktura = new Struktura[20];

i chce tą NowąStrukture wykorzystać w pliku Settings żeby mi zapisywało wartości na dataGridzie... mam dostęp do całej struktury, czyli moge sobie zapisać coś takiego

Settings.Default.Struktura.x = jakaś zmienna
 

ale chce mieć coś takiego:

 
for(int i = 0; i < 10; i++)
NowaStruktura[i].a = dataGrid.Rows[i].Cells[1].Value;
NowaStruktura[i].b = dataGrid.Rows[i].Cells[2].Value;

Żeby zapisywało mi jakie były wartosci na dataGridzie i potem żeby mi je z powrotem wyświetlało ale nie mam dostępu do tej jakby stworzonej struktury...

0

Jesli chcesz miec tablice tych Twoich struktur, to powinienes zadeklarowac ją jako:

public Strukura[] NowaStruktura = new Struktura[20];
0

Należy użyć do tego klasy, a nie struktury, która jest typem wartosciowym. Po drugie każde pole takiej klasy odpowiada jednej komórce wiersza tabeli datagrid. Po trzecie to co robisz jest nieprawidłowe gdyż w wypadku WPF należy użyć czegoś co nazywa sie Data binding. Po czwarte nie używa się do tego tablicy tylko kolekcji typu ObservableCollection<T>.

Jeżeli to jest WPF to jest to do napisania od nowa. Poczytaj sobie o dataGrid binding to zobaczysz jak się robi. Jest tego w sieci mnóstwo.

0

Używam Windows Forms nie WPF, czyli rozumiem że ciężko będzie coś takiego wykonać ? Program działa na zasadzie, że jak wyłączę forme to zapisuje wszystkie wartości z pól i jak włączam to je wczytuje. Wszystko działa prawidłowo tylko właśnie z tym dataGridem mam problem. W C++ robiłem to do xmla i potem wczytywałem z xmla. Myślałem że w C# dzięki temu settings będzie łatwiej, ale widzę, że jednak nie. Co radzicie zrobić ? To data binding to chodzi o wykorzystanie data source ?

0

wystarczy zrobić to co opisał FakeAccount

3

Programowania należy uczyć się w konsoli, żeby poznać wszystkie podstawowe operacje i konstrukcje, dopiero później można się uczyć jakichś konkretnych technologii, GUI, itd. W drugą stronę to nie ma sensu.

0

Wiem jak zadeklarować strukturę żeby była tablicą. Chodzi o to że w C++ nie musiałem deklarować jej wielkości, i nie musiałem deklarować jej jako tablica czy coś. Po prostu tworzyłem nową strukturę a potem tak jak w przykładzie:

 
Struktura NowaStruktura;

NowaStruktura[i].x = this.dataGridView.Rows[i].Cells[1].Value;

I zapisywało wartość do tej struktury

A w c# nie wiem dokładnie jak to zrobić bo zaczynam sie nim bawić. Spróbowałem z klasą, zadeklarowałem ją z użyciem

 
[UserScopedSetting()]
[SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Xml)]

Potem dodaje w settings ją poprzez wybór jako Type z Browse po prostu Projekt.Klasa

Edytuje plik Settings.Designers.cs tak żeby było:

 
[global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public global::Projekt.Klasa[] Klasa {
            get {
                return ((global::Projekt.Klasa[])(this["Klasa"]));
            }
            set {
                this["Klasa"] = value;
            }
        }

Jednak podczas "zapisu" wywala NullExceptionReflection

0
SuperDuper napisał(a):

Wiem jak zadeklarować strukturę żeby była tablicą.

To świetnie, bo w C# czegoś takiego nie da się zrobić. Można najpierw zdefiniować strukturę, a potem zadeklarować (a nawet zdefiniować) tablicę takich struktur. Zresztą, tak samo jest w C++ (tylko oczywiście składnia jest inna).

Chodzi o to że w C++ nie musiałem deklarować jej wielkości, i nie musiałem deklarować jej jako tablica czy coś.

Nie no, jasne, przecież C++ sam wykrywa co programista ma na myśli. :)

Serio - najpierw dowiedz się co to są zmienne, tablice, klasy i struktury, potem bierz się za programowanie. Struktura w C++ i w C# to są zupełnie inne rzeczy, i zupełnie czym innym różnią się od klas w tych językach.

0

Źle to może napisałem, wiec nie ważne bo i tak nie o to tutaj chodzi. Jak zapisać ustawienia DataGridView tak żeby trzymała je aplikacja a nie np poprzez xmla

0

Aplikacja może trzymać ustawienia w jakimś pliku (czy to xml, czy txt to nie ma znaczenia), w rejestrze systemu lub gdzieś w internecie. W samej aplikacji, nawet jeśli dokleiłbyś konfigurację do exe albo jakoś dekompilował i kompilował "w locie" ze zmienionymi ustawieniami, to i tak one nie będą - będą przecież wciąż w pliku :P

0

Tak tak, wiem o tym, ale czy da się jakoś wykorzystać te Settings do tego aby trzymać wartości z DataGridView, tak samo jak np. z textBox'ow ?

0

Chodzi o to, że wcześniej w aplikacji windows forms w c++ musiałem się trochę namęczyć używając TinyXML, żeby zapisywać ustawienia na formie i wczytywać je gdy otwierałem forme. Teraz wykorzytuje c# i jest fajne rozwiązanie z tymi Settings ale widzę, że z DataGridView jest już problem. Mógłbym zapisywać do xmla wartości z tego DataGridView ale wolałbym żeby już wszystko było w jednym miejscu

0

Widze nikt nie potrafił pomóc, rozwiązałem ten problem przez edycje pliku Settings.Designer.cs dodając własną strukture i teraz pieknie hula zapisywanie dataGridView

0

Aż do momentu użycia designera, który skasuje z tego pliku Twoje zmiany.
Pliki designer nie są do ręcznej edycji.

0

Jeszcze nie miałem takiego problemu, na początku gdy chciałem dodać nową nazwe do Settings.settings wyskakiwał komunikat, że wartość się zmieniła i czy chce zamienić na nową, klikałem nie za każdym razem, działało cały czas, jednak trochę wkurzało mnie to że ciągle muszę klikać nie, wiec zmieniłem jeszcze plik xml Settings.settings i już jest lepiej. Poza tym aplikacja działa, po wyłączeniu jej i włączeniu, dataGridView jest uzupełniony tak jak wcześniej i o to mi chodziło. Wiec można zamknąć temat a nawet usunąć, chyba że jeszcze chcesz mi coś napisać co robię źle albo czego nie umie.

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