2010-03-29 13 views
5

Czy jest coś takiego jak SESJA w aplikacji Windows? Chcę zachować kilka wartości, które będą trwałe między formularzami.Czy jest coś takiego jak SESJA w aplikacji Windows?

Na przykład: Pierwszy formularz ma kilka pól wyboru, a trzeci formularz przetwarza je odpowiednio. Muszę więc gdzieś przechowywać zaznaczone pola wyboru.

+0

Pomoże Ci to, jeśli możesz podać przykład tego, co próbujesz osiągnąć.Czy chcesz przechowywać wartości dla pojedynczego użytkownika w "sesji" i czy dane mają przetrwać cały cykl życia? –

Odpowiedz

3

Możesz tylko wystawić stan CheckBoxes Checked poprzez właściwości tego formularza, w którym umieścisz CheckBoxe i uzyskać dostęp do tych właściwości z trzeciego formularza lub Formularza procesu.

public partial class MainForm : Form { 
    // We assume we have let's say three CheckBoxes named chkFirst, chkSecond and chkThird 
    public bool IsFirstChecked { get { return chkFirst.Checked; } } 
    public bool IsSecondChecked { get { return chkSecond.Checked; } } 
    public bool IsThirdChecked { get { return chkThird.Checked; } } 

    // Calling this form from where these checked states will be processed... 
    // Let's suppose we have to click a button to launch the process, for instance... 
    private void btnLaunchProcess(object sender, EventArgs e) { 
     ProcessForm f = new ProcessForm(); 
     f.Parent = this; 
     if (DialogResult.OK == f.ShowDialog()) { 
      // Process accordingly if desired, otherwise let it blank... 
     } 
    }  
} 

public partial class ProcessForm : Form { 
    // Accessing the checked state of CheckBoxes 
    private void Process() { 
     if ((this.Parent as MainForm).FirstChecked) 
      // Process according to first CheckBox.Checked state. 
     else if ((this.Parent as MainForm).SecondChecked) 
      // Process according to second CheckBox.Checked state. 
     else if ((this.Parent as MainForm).ThirdChecked) 
      // Process according to third CheckBox.Checked state. 
    } 
} 

Proszę zwrócić uwagę, że wybrałem ten kod się w mojej głowie, więc może się zdarzyć, nie skompilować. W każdym razie, mam nadzieję, że to daje ci wyobrażenie, jak przekazywać wartości w swoich formularzach.

Największą różnicą między programowaniem w sieci i WinForm jest to, że sieć Web jest bezstanowa. SESJA i VIEWSTATE to obejścia pozwalające zachować wartości.

WinForm są stanowe, więc nie trzeba przechodzić przez SESJĘ i zmienne podobne do VIEWSTATE. Wartość jest zachowywana, o ile obiekt istnieje.

+0

+1 za wszystkie najważniejsze dwa ostatnie akapity. –

+0

+1 za to samo ... – Manish

5

Jeśli mówisz o różnych formularzach w obrębie tej samej aplikacji, po prostu utworzę statyczne elementy na klasie, będzie ona zachowywana przez cały okres istnienia pliku wykonywalnego.

+0

Myślę, że chciałby wartości do dzielenia między różnymi instancjami. To rozwiązanie obejmuje tylko jeden plik wykonywalny. –

1

Jeśli chcesz zachować dane między niezależnym uruchomieniem tej samej aplikacji (jak w przypadku jednoczesnego żądania w farmie HTTP), po prostu wypisz trochę XML lub użyj systemu mashalling/serialization z twoim środowiskiem uruchomieniowym/plaform (nie wiem co to jest będzie dla C#).

Następnie zaimportuj ponownie. Po prostu obserwuj kontrolę współbieżności.

2

Możesz użyć app.config (lub sekcji Ustawienia w Właściwościach projektu), jeśli korzystasz z Visual Studio, lub po prostu serializować swoje wartości i zapisać je w jakimś pliku.

0

Jeśli chcesz przechowywać dane dla poszczególnych użytkowników między sesjami wykonawczymi, powinieneś rozważyć izolowaną przestrzeń dyskową.

  • Nie zaśmiecać katalogu instalacyjnym
  • Nie powoduje problemów z oprogramowaniem Bernt
  • część systemu operacyjnego, w tym obiektów .NET, nie ma potrzeby instalowania czegokolwiek innego
  • Już pracuje z Model zabezpieczeń systemu Windows
  • Występuje na każdego użytkownika, tak zapisane ustawienia są rozdzielone dla każdego użytkownika
  • Czy serializacji/deserializacji obects bezpośrednio do niego
1

Jeśli jest to po prostu zwykła aplikacja Windows pojedynczego użytkownika, należy utworzyć klasę modelu stan chcesz przejść wokół i potrzebują w swoich konstruktorów forma:

internal class ApplicationState 
{ 
    // Store the selected checkbox values here, for example 
    public List<int> SelectedProductIds { get; } 
    // ... additional state ... 
} 

internal class EditOrderForm: Form 
{ 
    private ApplicationState applicationState; 
    public EditCustomerForm(ApplicationState applicationState) { 
     this.applicationState = applicationState; 
    } 
    // Rest of the code 
} 

You mógł używać zmiennych statycznych zamiast instancji - ale są to tylko zmienne globalne, które utrudniają czytanie i utrzymywanie kodu.

+0

+1 twoje rozwiązanie było drugim, o którym myślałem. Dzięki za przegrany. =) –

Powiązane problemy