ViewState - zapis/odczyt kilku stanów strony

0

Witam, mam formularz zawierający text, checkboxy i dropdownlisty, chciałbym zapisywać po każdym kliknięciu buttona stany strony np do bulletedlisty a potem je wczytywać z powrotem do kontrolek po wybraniu z listy. Możecie mnie trochę nakierować jak to zrobić? Jestem zielony jeśli chodzi o ViewState. Pozdrawiam.

0

Nie wiem do końca po co masz je zpowrotem wczytywać... jeśli chcesz to zrobić bo potrzebujesz np. populować dropDownFor wartościami zależnymi od wcześniejszych wyborów to możesz to użyskać dzięki AJAX.
Natomiast ogólnie ja takie rzeczy rozwiązuje modelem, zwykła klasa która ma te wszystkie pola i po kliknięciu w kontrolerze wstawiam wartości do obiektu, który później przesyłam.

0

Kontrolki służą jako input do pliku excela, viewstate chcę zapisać w celu np wybrania konkretnego stanu z listy, jego edycji/poprawy i zapisu w dane miejsca do arkusza.

1

Ogólnie do takich zastosowań całkiem fajnie sprawdza się ta kontrolka Telerika.
http://www.telerik.com/support/code-library/excel-look-and-feel-for-radgrid

0

Tak więc zagłębiłem się w temat ViewState i zrobiłem w taki łopatologiczny sposób zapisywanie stanu przykładowych kontrolek:

        ViewState["1"] = TextBox26.Text;
        ViewState["2"] = TextBox27.Text;
        ViewState["3"] = TextBox28.Text;
        ViewState["4"] = TextBox29.Text;
        ViewState["5"] = TextBox30.Text;
 

i wczytując w ten sposób z powrotem do formularza np poprzez event wybrania danego stanu z listy w celu edycji tego, co wypełniło się wcześniej w formularzu. (Pola są uniwersalne i służą do zapisu kolejnych zestawów danych)

        TextBox26.Text = (string)ViewState["1"];
        TextBox27.Text = (string)ViewState["2"];
        TextBox28.Text = (string)ViewState["3"];
        TextBox29.Text = (string)ViewState["4"];
        TextBox30.Text = (string)ViewState["5"]; 

Problem w tym, że nie wiem, jak zapisać w ten sposób x takich zestawów (jeden zestaw to stan tych 5 kontrolek wyżej) bo chyba nie będę kopiował i wklejał kodu dla 20 stanów przy 25 kontrolkach (textboxy, checkboxy, dropdownlisty). Mam globalną zmienną Counter, która określa mi numer zestawu danych, który wypełniłem i zapisałem w pliku .xlsx. Chciałbym porównać Counter do danego stanu (zapisać taki zestaw viewstateów do listy, ifem sprawdzić counter==numer listy, tablicy i jeśli numer listy i counter są takie same, wypełnić formatkę danym stanem - czy da radę dynamicznie tworzyć listy albo tablice z nazwą typu "List"+Counter?) i w rezultacie edytować zestaw danych zapisany uprzednio. Wiem, że mógłbym to rozwiązać pobierając dane z pliku excela na sztywno do textboxów i wczytując je po wybraniu zestawu danych z listy ale to byłoby nieoptymalne rozwiązanie. Będę wdzięczny za pomoc, każdy pomysł sie przyda :)

1

No, ale stan kontrolek zapisuje się w ViewState automatycznie, wystarczy tylko ustawić EnableViewState na true, prawda?

czy da radę dynamicznie tworzyć listy albo tablice z nazwą typu "List"+Counter?

Wszystkie kontrolki są w kolekcji Controls, możesz ją przeszukiwać i znajdować w niej np. TextBoxy, a następnie parsować właściwość Name i znaleźć w ten sposób numer, na podstawie którego wstawisz wartość z tablicy.

0

Owszem, mam ustawione na true i dla jednego zestawu danych ten sposób działa, jednak dla większej ilości nie wiem, w jaki sposób indeksować takie "zestawy" viewstateów i później odwoływać się do nich.

0

Ale czemu chcesz mieć "zestaw viewstatów"? ViewState to stan widoku konkretnej strony/kontrolki, więc jeden widok może mieć tylko jeden stan.

Mógłbyś dokładniej wyjaśnić o co Ci chodzi? Opisz może na przykładzie akcji, które ma wykonać użytkownik (od momentu wejścia na stronę) i spodziewanych efektów, to coś wymyślimy. Bo jak na razie, to rozumiem, że jedną stronę chcesz wypełniać różnymi danymi w zależności od czegoś tam, ale takiego czegoś nie ma sensu robić przez ViewState.

0
somekind napisał(a):

Ale czemu chcesz mieć "zestaw viewstatów"? ViewState to stan widoku konkretnej strony/kontrolki, więc jeden widok może mieć tylko jeden stan.

Mógłbyś dokładniej wyjaśnić o co Ci chodzi? Opisz może na przykładzie akcji, które ma wykonać użytkownik (od momentu wejścia na stronę) i spodziewanych efektów, to coś wymyślimy. Bo jak na razie, to rozumiem, że jedną stronę chcesz wypełniać różnymi danymi w zależności od czegoś tam, ale takiego czegoś nie ma sensu robić przez ViewState.

Moja strona wygląda i działa w następujący sposób:

  1. Klient otwiera formularz składający się z X textboxów, checkboxów i dropdownów.
  2. Dane po kliknięciu następna lokalizacja (formularz służy do zamawiania pewnych usług) zapisują się do pliku .xlsx, formularz czyści się a klient może wprowadzać dane dla nastepnych lokalizacji, które zapisują się z każdym klinięciem przycisku do pliku xlsx.
  3. Dane są wysyłane mailowo.

Zależy mi na tym, by zapisywać stan kontrolek po każdym kliknięciu przycisku następna lokalizacja i zapisaniu do excela oraz na dostępie do tych stanów np poprzez wybranie z listy. Stan odpowiada wtedy lokalizacji i klient może dokonać edycji lokalizacji, która nadpisze dane w odpowiedniej lokalizacji w pliku xlsx (używam do tego globalnej zmiennej counter więc porównanie numeru stanu i countera nie powinno być problemem).

Może jest jakiś lepszy sposób niż ViewState, np zapisanie wartości kontrolek do jakiejś tablicy, listy?

0

Czyli Twoja strona właściwie służy do edycji pliku xlsx? Rozumiem, że poszczególne lokalizacje to oddzielne wiersze w tym pliku?

0

Właściwie do tworzenia formularza w postaci pliku ale ogólnie zgadza się, kolejne lokalizacje to kolejne kolumny w pliku xlsx.

1

W takim razie powinieneś mieć klasę Lokalizacja opisującą lokalizację, dane z pliku wczytywać do kolekcji List<Lokalizacja>, a wyświetlać tylko jeden obiekt, najlepiej przez jakieś ObjectDataSource zbindowane z kontrolkami GUI. Bezpośrednie operowanie na ViewState nie jest Ci tu do niczego potrzebne, bo on służy do czegoś innego niż Ty potrzebujesz.

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