Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

WPF aplikacija sa vise prozora (WINDOW)

[es] :: .NET :: WPF Programiranje :: WPF aplikacija sa vise prozora (WINDOW)

[ Pregleda: 5053 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

theilusion

Član broj: 331616
Poruke: 44
*.teol.net.



+1 Profil

icon WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 08:18 - pre 96 meseci
Pozdrav svima ljudi. Kako da resim ovo:

Imam vise prozora u WPF aplikaciji.Ja cu uzeti smao za primer 2 (MainWindow i AddUser).
U MainWindow imam listu korisnika koja se ucitava iz baze nakon pokretanja aplikacije.
U AddUser mi je forma koju pozivam sa tog dela MainWindow-a gde mi se ucitava lista korisnika.
Kada popunim polja za unos User-a sve to lepo ode u bazu ali bi trebalo i nekako da "refreshujem" listu korisnika automatski.
Dakle u AddUser treba da pozovem metodu iz MainWindow koja mi pravi listu korisnika iz baze. Ja znam da su to principi OOP,
ali ne znam kako da izvedem to. Evo dole i source kako to otprilike izgleda.

Code:



namespace Korisnici
{
   
    public partial class MainWindow : RibbonWindow
    {

        ObservableCollection<User> OCUserList = new ObservableCollection<User>();
        
        public MainWindow()
        {
            InitializeComponent();
            LoadListFromDB();
            ListaKorisnici.ItemsSource = OCUserList;
   
        }
        
        public void LoadListFromDB()
        {
            LoadUserList();

        }
        
        public void LoadUserList()
        {
            using (USERSENTITY cntx = new USERSENTITY())
            {
                var userlist = (from u in cntx.User select u).ToList();
                foreach (User user in userlist)
                {
                    OCUserList.Add(user);
                } 
            } 
        }

    }
}



Code:

namespace Korisnici
{
  
    public partial class AddUser : Window
    {
        public AddUser()
        {
            InitializeComponent();
            
        }
       
        private void btnDodajKor_Click(object sender, RoutedEventArgs e)
        {          
            User korisnik = new User
            {
                username = korIme.Text,
                password = Encrypt(korLozinka.Password) ,
                name = korisnikIme.Text,
                surname = korisnikPrezime.Text,
                dateCreated=DateTime.Now    
            };

            try
            {
                using (USERSENTITY cntx = new USERSENTITY())
                {
                    cntx.User.Add(korisnik);
                    cntx.SaveChanges();
                    MessageBox.Show("Dodat je Korisnik", "Poruka", MessageBoxButton.OK, MessageBoxImage.Information);
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }
}


Otprilike to je to. Izdvojio sam samo ovo sto mi pravi problem.
Dakle, imam event "btnDodajKor_Click" koji je realizovan u AddUser koji mi dodaje novog korisnika u bazu.
Tu treba da pozevem metodu LoadUserList() iz MainWindow koja pravi listu ObservableCollection<OCUserList> i puni je iz baze.
Jedino je problem sto ne znam kako to da izvedem, hehe :D Sala mala, pomoc bi mi dobro dosla. Hvala unapred
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 08:44 - pre 96 meseci
Nemoj da pozivaš direktno metodu MainWindow-a jer tako praviš direktnu zavisnost između AddUser i MainWindow.

Postoji nekoliko "boljih" načina, ja obično koristim varijantu publisher/subscriber patterna za ovo:

1. U klasi AddUser, napravi jedan public event i nazovi ga recimo DataUpdated
Code:

public event Action DataUpdated;

2. Na kraju btnDodajKor_Click metode fire-uj DataUpdated event
Code:

if (DataUpdated != null) DataUpdated();

3. U klasi MainWindow kada instanciraš AddUser, zakači na DataUpdated te instance neku metodu
koja poziva LoadUserList (ili možeš i direkt na LoadUserList ako je potpis eventa void())
Code:

var auw = new AddUser();
auw.DataUpdated += LoadUserList;

4. Opciono, ako znaš kada se AddUser zatvara, otkači event handler sa DataUpdated
Code:

auw.DataUpdated -= LoadUserList;

 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
*.teol.net.



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 08:48 - pre 96 meseci
Hvala mnogo na odgovoru.
Sad nisam u mogucnosti da probam ali cu probati posle podne pa se javljam sa rezultatima.
Nadam se da cu uspeti. Hvala jos jednom.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 09:02 - pre 96 meseci
Mozes i da implementiras INotifyPropertyChanged u User klasi i ako si u UI-u lepo bind-ovao sve, promene ce se prikazati automatski.

Inace,
var userlist = (from u in cntx.User select u).ToList();
mozes jednostavno zameniti sa
var userlist = cntx.User.ToList();
(s tim da ja ne volim da koristim var, ali eto, da ti ostane u istom fazonu :) ).
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 16:04 - pre 96 meseci
INotifyPropertyChanged ce regulisati samo promene u trenutnim instancama, da bi se sama lista sirila I skupljala, mora neki kontejner koji implementira INotifyCollectionChanged, tipa ObservableCollection<T>

Edit; ok, sorry, vidim da vec koristi observable...
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
31.223.144.*



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 21:52 - pre 96 meseci
Citat:
dusans:
Nemoj da pozivaš direktno metodu MainWindow-a jer tako praviš direktnu zavisnost između AddUser i MainWindow.

Postoji nekoliko "boljih" načina, ja obično koristim varijantu publisher/subscriber patterna za ovo:

1. U klasi AddUser, napravi jedan public event i nazovi ga recimo DataUpdated
Code:

public event Action DataUpdated;

2. Na kraju btnDodajKor_Click metode fire-uj DataUpdated event
Code:

if (DataUpdated != null) DataUpdated();

3. U klasi MainWindow kada instanciraš AddUser, zakači na DataUpdated te instance neku metodu
koja poziva LoadUserList (ili možeš i direkt na LoadUserList ako je potpis eventa void())
Code:

var auw = new AddUser();
auw.DataUpdated += LoadUserList;

4. Opciono, ako znaš kada se AddUser zatvara, otkači event handler sa DataUpdated
Code:

auw.DataUpdated -= LoadUserList;




Lepo je ovo dodatno objasnjeno, slikovito ali nisam shvatio stavku pod 3. posto ja upravo bas imam event tipa void().
U tom slucaju moram dobiti poruku da ne mogu konvertovati tip 'void' u 'system.action'. Nije mi jasno kako da to realizijem
direktno kako pise u zagradi pod 3.

Evo detaljno sta sam uradio:

AddUser klasa:
Code:

namespace Korisnici
{
    public partial class AddUser : Window
    {
         //Event
         public event Action DataUpdated;
      
        public AddUser()
        {
            InitializeComponent();
            
        }
       
        private void btnDodajKor_Click(object sender, RoutedEventArgs e)
        {          
            User korisnik = new User
            {
                username = korIme.Text,
                password = Encrypt(korLozinka.Password) ,
                name = korisnikIme.Text,
                surname = korisnikPrezime.Text,
                dateCreated=DateTime.Now    
            };

            try
            {
                using (USERSENTITY cntx = new USERSENTITY())
                {
                    cntx.User.Add(korisnik);
                    cntx.SaveChanges();
                    MessageBox.Show("Dodat je Korisnik", "Poruka", MessageBoxButton.OK, MessageBoxImage.Information);
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
           //Fire DataUpdated
           if (DataUpdated != null) DataUpdated();
        }
    }
}


MainWindow Class:
Code:

namespace Korisnici
{
   
    public partial class MainWindow : RibbonWindow
    {

        ObservableCollection<User> OCUserList = new ObservableCollection<User>();
        
        public MainWindow()
        {
            InitializeComponent();
            LoadListFromDB();
            ListaKorisnici.ItemsSource = OCUserList;
   
        }
        
        public void LoadListFromDB()
        {
            LoadUserList();

        }
        
        public void LoadUserList()
        {
            using (USERSENTITY cntx = new USERSENTITY())
            {
                var userlist = (from u in cntx.User select u).ToList();
                foreach (User user in userlist)
                {
                    OCUserList.Add(user);
                } 
            } 
        }

        
        //Instanciranje AddUser klase
        private void buttonUnosKorisnika_Click(object sender, RoutedEventArgs e)
        {
            AddUser addKor = new AddUser();
            addKor.Show();
             
            //Can not implicitly convert type 'void' to 'system.action'
            addKor.DataUpdated += LoadUserList();
           
        }

    }
}
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 21:55 - pre 96 meseci
Kod sam pisao napamet tako da može biti nekih grešaka...
Ovde treba bez onih zagrada () iza LoadUserList kao što i stoji u mojoj poruci.
Code:

addKor.DataUpdated += LoadUserList;
 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
31.223.144.*



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)26.04.2016. u 22:10 - pre 96 meseci
Da, otprilike to je to.
Samo sto u ovom slucaju duplira listu.
Zar ne bi trebalo negde, pre nego sto zakačim na DataUpdated AddUser instance metodu
LoadUserList, reci Clear() prethodnog stanja.
Pre nego sto instaciram AddUser ja vidim moju LoadUserList() u jednom DataGrid-u.
Kada "okinem" buttonUnosKorisnika_Click ostaje mi stari zapis iz liste i novo stanje,
a treba samo novo. Nadam se da me razumes.

Hvala u svakom slucaju iako me ne razumes naci cu vec nacin kako da ovo resim.
Hvala jos jednom, sad ovo kapiram
 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
*.teol.net.



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)27.04.2016. u 08:19 - pre 96 meseci
Resio sam problem tako sto sam napravio jos jedan public event Action DataClear;.
On mi je posluzio da ocistim listu pre nego sto "novo stanje" prikazem iz baze.
Ne znam koliko je to elegantno resenje ali radi.

Moje pitanje bi sada glasilo da li mogu da koristim ova odva javna event-a DataUpdated i DataClear ponovo
kada mi zatreba da ocistim i dodam novo stanje u neku drugu listu. Po mojoj logici "DA".

Voleo bih sada da malo vidimo kako se ovo jos moze izvesti sa INotifyPropertyChanged s obzirom da vec
koristim ObservableCollection. Mislim da u tom slucaju moje bindovanje DataGrid redova ne bi moglo samo
da se izvede npr ovako kako sad stoje stvari:

Code:
<DataGrid.Columns>
     
      <DataGridTextColumn Binding="{Binding name}" Header="Ime" ></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding surname}" Header="Prezime" ></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding username}" Header="Korisnicko ime" ></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding password}" Header="Lozinka" ></DataGridTextColumn>
      <DataGridTextColumn Binding="{Binding dateCreated}" Header="Datum kreiranja" ></DataGridTextColumn>
</DataGrid.Columns>


Hvala svima jos jednom na savetima.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)27.04.2016. u 09:34 - pre 96 meseci
A šta će ti DataClear event kad možeš jednostavno na početku LoadUserList da očistiš OCUserList?
Dakle, ako svaki put učitavaš sve item-e iz baze, sasvim je normalno da prvo počistiš postojeće
pa tek onda dodaš nove, nema ništa pogrešnog u tome.

Da bi ti radilo sa ObservableCollection i INotifyPropertyChanged morao bi da
modifikuješ baš onu instancu liste i item-e koji stoje u DataSource grida.

Citat:

Moje pitanje bi sada glasilo da li mogu da koristim ova odva javna event-a DataUpdated i DataClear ponovo
kada mi zatreba da ocistim i dodam novo stanje u neku drugu listu. Po mojoj logici "DA".

Naravno - generalno, na svaki event možeš da zakačiš nula, jedan ili više event handler-a.
Kada se event fire-uje, pozivaju se svi zakačeni event handleri, jedan po jedan.
Šta ćeš da uradiš u tim event handler-ima i zašta će da ti posluže je stvar tvoje volje - as simple as that.

[Ovu poruku je menjao dusans dana 27.04.2016. u 10:55 GMT+1]
 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
31.223.144.*



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)29.04.2016. u 14:25 - pre 96 meseci
Ajde na kratko da zanemarimo ovaj problem, ako se tako može reći pošto ovako kako sam ja to izveo radi onako kako sam želeo
ali kapiram da imam "viška korak", ali dobro vratiću se kasnije na ovo.

Interesuje me sada bas ovo NotifypropertyChanged, ali za neku drugu stvar.
Naime napravio sam listu dugmića koje dinamički učitavam iz baze, evo kako to izgelda u XAML

WorkUnit.xaml
Code:

 <ListView Name="listadugme" MouseDoubleClick="listadugme_MouseDoubleClick">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding idWorkingUnit}">
                        <GridViewColumnHeader>ID</GridViewColumnHeader>
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding name}">
                        <GridViewColumnHeader>OJ</GridViewColumnHeader>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
 </ListView>


Tu citam kao sto vidite ID i naziv neke organizacione jedinice OJ.To sve lepo radi.
Treba da "uhvatim" ovaj idWorkingUnit i da ga koristim u MainWindow klasi.
Ja sam to uspeo da uradim ovako:

WorkUnit.cs
Code:

public partial class WorkUnit : Window,INotifyPropertyChanged
{
       
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

       public WorkingUnit selected_WorkUnit { get; set; }

        public WorkingUnit Selected_WorkUnit
        {
            get { return selected_WorkUnit; }
            set
            {
                selected_WorkUnit = value;
                OnPropertyChanged("Selected_WorkUnit");
            }
        }

        private void listadugme_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (listadugme.SelectedItems.Count == 1)
            {
                Selected_WorkUnit = listadugme.SelectedItem as WorkingUnit;
                MessageBox.Show(selected_WorkUnit.idWorkingUnit.ToString());

                MainWindow mw = new MainWindow();
                mw.Show();
            }
            else
            {
                Selected_WorkUnit = null;
            }
        }
}


MessageBox zaista prikaze idWorkingUnit onog item-a na kojima sam kliknuo dva puta.

E sad meni treba selected_WorkUnit.idWorkingUnit u MainWindow klasi.

U MainWindow instaciram WorkUnit klasu i na klik dugmeta probam da proverim imam li "uhvaceni" idWorkingUnit
i dobijem poruku da neki objekat neke klase pozivam pre nego sto sam ga kreirao:

Citat:
Object reference not set to an instance of an object


MainWindow
Code:

private void button1_Click(object sender, RoutedEventArgs e)
{
     WorkUnit wu = new WorkUnit();
     MessageBox.Show(wu.selected_WorkUnit.idWorkingUnit.ToString());
}


Pretpostavljam da je ovo problem. U WorkUnit klasi gde oobradjujem MouseDoubleClick event imam ovo sa as operatorom:

Code:
Selected_WorkUnit = listadugme.SelectedItem as WorkingUnit;


Da li sam ga u MainWindow zbunio sto on nigde ne vidi instancu objekta WorkingUnit

Šta grešim???
 
Odgovor na temu

theilusion

Član broj: 331616
Poruke: 44
*.teol.net.



+1 Profil

icon Re: WPF aplikacija sa vise prozora (WINDOW)03.05.2016. u 11:08 - pre 96 meseci
Narode,

ja samo ovo rešio, hvala puno na pomoći. Otvoriću novu temu vezano nešto za EntityF i upit iz više tabela.
Hvala još jednom.
 
Odgovor na temu

[es] :: .NET :: WPF Programiranje :: WPF aplikacija sa vise prozora (WINDOW)

[ Pregleda: 5053 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.