• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

przesyłanie danych między oknami WPF - c#

Object Storage Arubacloud
0 głosów
1,046 wizyt
pytanie zadane 19 sierpnia 2019 w C# przez Krst0 Obywatel (1,340 p.)

Witam, tworzę projekt oparty o WPF i mam taki problem.

Mam stworzone dwa okna: jedno okno logowania i drugie okno główne programu. Problem jest taki, że gdy się zaloguję poprawnie to przechodzę do nowego okna w prawidłowy sposób, ale nie wiem jak uzyskać dane pobrane z wcześniejszego okna logowania. Mój kod jest następujący.

Okno logowania:

using Oracle.DataAccess.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;

namespace TrainingProject
{
    /// <summary>
    /// Logika interakcji dla klasy LoginScreen.xaml
    /// </summary>
    public partial class LoginScreen : Window
    {
        OracleConnection con = new OracleConnection();
        public LoginScreen()
        {
            InitializeComponent();
        }

        private void BtnLoginSubmit_Click(object sender, RoutedEventArgs e)
        {   
            string sql = "select 'OK' from Uzytkownik where login = '" + txtLogin.Text + "' and haslo = dbms_obfuscation_toolkit.md5 (input => utl_i18n.string_to_raw ('" + txtPassword.Password + "'))";
            OracleCommand cmd = new OracleCommand(sql, con);
            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
            while(dr.Read())
            {
                if(dr.GetString(0).ToString() == "OK")
                {
                    MainWindow dashboard = new MainWindow();
                    dashboard.Show();
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Błędne dane");
                }
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string conString = "Data Source=(DESCRIPTION="
                    + "(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))"
                    + "(CONNECT_DATA=(SID=xe)));"
                    + "User Id=c##login; Password=passwd;";
            con.ConnectionString = conString;
            con.Open();
        }
    }
}

Kod, a właściwie jego brak w drugim oknie. Chciałbym na przykład w oknie logowania wyciągnąć login użytkownika (umiem to zrobić) i go przesłać do głównego okna, by tam móc robić odpowiednie czynności.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TrainingProject
{
    /// <summary>
    /// Logika interakcji dla klasy MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
        }
    }
}

Drugi problem pojawia się w przypadku samego przycisku zaloguj. Gdy podam błędne dane to nie wyświetla mi MessageBox'a w ogóle. Nie wchodzi mi do funkcji else. Próbowałem na kilka wariantów i nic nie pomogło.

3 odpowiedzi

0 głosów
odpowiedź 19 sierpnia 2019 przez Siemił Mądrala (7,380 p.)
"Chciałbym na przykład w oknie logowania wyciągnąć login użytkownika (umiem to zrobić) i go przesłać do głównego okna, by tam móc robić odpowiednie czynności."

Główne okno tworzysz w linii 40. Dlaczego nie wykorzystasz konstruktora aby przekazać login?
komentarz 19 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)
No dobra, to faktycznie jestem w stanie zrobić. Zadam pewnie idiotyczne pytanie, ale w jaki sposób mogę przesłać jeszcze stan aktualnego połączenia z bazą danych? I do tego czy wiesz może czemu nie wchodzi mi w else przy ifie?
komentarz 19 sierpnia 2019 przez Siemił Mądrala (7,380 p.)
Zastanów sie czy potrzebujesz stałego połączenia z bazą. Jeszcze się nie spotkałem z taką praktyką.

Co do ifa to nie jestem pewien. Myślę że select string zawsze zwróci ci tego stringa.
komentarz 20 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)
edycja 20 sierpnia 2019 przez Krst0
Właśnie testowałem tego selecta i on albo zwróci cokolwiek albo nic nie zwraca. Spróbuję podejść to nieco inaczej. Spróbuję zrobić Counta na tym i sprawdzić wartość. Powinno pomóc.

Może i faktycznie nie potrzebuję stałego połączenia z bazą danych, ale problem jeszcze był z tym taki, że jak zamykam połączenie z bazą (conn.Close()) w przypadku zamykania okna logowania to wtedy wyłącza się całkowicie program i nieważne, że mam widoczne już drugie okno. Coś jakby wywalało mi błąd (jakiś wyjątek) i nie bardzo rozumiem dlaczego. Może wiesz jak temu zaradzić?
0 głosów
odpowiedź 25 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)

W jaki sposób mógłbym przekazać tutaj poprzez konstruktor? Pewnie źle myślę, ale jak mam 40 linię i robię coś na ten wzór 

MainWindow dashboard = new MainWindow(txtLogin.Text);

to pokazuje mi, że to błędny sposób. Ma ktoś może jakiś inny sposób? 

komentarz 25 sierpnia 2019 przez Velta Maniak (52,010 p.)
Jaki "błędny sposób"? W klasie formularza konstruktor jest przeciążany lub przyjmuje dokładnie jeden argument jako ciąg znaków?
komentarz 25 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)
Pokazuje mi, że w tym miejscu jest błąd i tak jakby ten MainWindow ma nie przyjmować żadnych parametrów.
komentarz 25 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)
Dobra, mój błąd. Nie w tym oknie zmieniałem konstruktor. Już mi działa poprawnie.
0 głosów
odpowiedź 26 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)
Dobra, wystąpił kolejny problem, z którym niezbyt wiem jak sobie poradzić. Jestem w drugim formularzu i mogę zmienić kontrolkę w konstruktorze. Problem teraz polega na tym, że nie wiem co zrobić, żeby ta zmienna była widoczna również poza konstruktorem w funkcji na przykład onClick.

Próbowałem w jakiś sposób ustawić getter i setter, ale wyszło mi to nieudolnie strasznie. Równie dobrze mógłbym przypisać to do jakiejś niewidocznej kontrolki i na podstawie ten kontrolki ją sobie pobierać, ale to rozwiązanie jest niezgrabne i wygląda na masakryczny hardcoding.

Miałby ktoś pomysł jak to rozwiązać?
komentarz 27 sierpnia 2019 przez Krst0 Obywatel (1,340 p.)

Miałby ktoś pomysł na to? Chodzi mi o takie coś:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace TrainingProject
{
    /// <summary>
    /// Logika interakcji dla klasy MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow(string tekst)
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
             
        }
    }
}

Mam tutaj do konstruktora dodany parametr jaki przyjmuje i co zrobić, żeby ten parametr był widoczny w funkcji Window_loaded. Próbowałem setterem/getterem, ale z tego co udało mi się ustalić nie da się tego zrobić w oknie? To musiałaby być wtedy klasa, a nie wiem w jaki inny sposób to obejść. 

Podobne pytania

0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 13 grudnia 2022 w C# przez MisticVoid Początkujący (490 p.)
+1 głos
2 odpowiedzi 808 wizyt
0 głosów
3 odpowiedzi 214 wizyt
pytanie zadane 12 marca 2019 w C# przez seba Dyskutant (8,900 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...