[ crnjin @ 18.01.2011. 23:10 ] @
Ovako ... Uzeo sam da radim diplomski u WPF-u .
Video sam da WPF aplikacije dobro izgledaju graficki i voleo bih da iskoristim sve prednosti WPF-a , a naravno da izbegnem mane...
Molim za kritike , predloge i pomoc naravno ... Postavicu XAML i .cs kod ....
[ crnjin @ 18.01.2011. 23:12 ] @
Code (xml):

<Window x:Class="Diplomski.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       
       Title="Aplikacija za prijavu ispita - VISER 2010" Height="700" Width="1000"  Background="AliceBlue" Loaded="Window_Loaded">
    <Window.Resources>
       
    </Window.Resources>
   
    <DockPanel>
        <StackPanel DockPanel.Dock="Top">
            <Image Source="D:\Projects\VisualStudioProjects\Diplomski\slike\logo.jpg" Stretch="Fill"></Image>
        </StackPanel>
        <StackPanel Orientation="Horizontal" x:Name="GlavniStackPanel">
            <StackPanel>
                <Image x:Name="prof_slika" Height="110" Width="110" Margin="5" Source="{Binding Image}" Stretch="Fill"></Image>
                <TextBlock Margin="5" Text="{Binding Biografija}"></TextBlock>
            </StackPanel>
            <StackPanel HorizontalAlignment="Center">

                <WrapPanel>
                    <Label Margin="2" Name="lblProf" Width="150">Profesor</Label>
                    <Label Margin="2" Name="lblRok" Width="120">Ispitni rok</Label>
                    <Label Margin="2" Name="lblIspit" Width="300">Ispit</Label>
                    <Label Margin="2" Name="lblProstorija" Width="120">Prostorija</Label>
                </WrapPanel>
                <WrapPanel>
                    <ComboBox Margin="2" Height="23" Width="150" Name="comboBoxProfesor" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" SelectedValuePath="ID" >
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <!--<Image Source="{Binding Image}" Margin="3" Height="45"></Image>-->
                                    <StackPanel Orientation="Vertical">
                                        <TextBlock Text="{Binding Ime}"></TextBlock>
                                        <!--<TextBlock Text="{Binding ID}"></TextBlock>-->
                                    </StackPanel>
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                    <ComboBox Margin="2" Height="23" Name="comboBoxRok" Width="120" />
                    <ComboBox Margin="2" Height="23" Name="comboBoxIspit" Width="300" />
                    <ComboBox Margin="2" Height="23" Width="120" x:Name="comboBoxProstorija" ItemsSource="{Binding}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Check}" Content="{Binding Naziv}" ></CheckBox>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </WrapPanel>

                <Label Height="10" Name="lblRazmak1" Width="120"></Label>
                <WrapPanel>
                    <Label Name="lblDatum" Width="194">Datum</Label>
                    <Label Name="lblVreme" Width="120">Vreme</Label>
                </WrapPanel>
                <WrapPanel>
                    <Calendar Name="calendar"></Calendar>
                    <TextBox VerticalAlignment="Top" Margin="10 2 1 2" Height="23" Name="txtVreme" Width="50" />
                    <Label>:</Label>
                    <TextBox VerticalAlignment="Top" Margin="1 2 2 2" Height="23" Name="txtVreme1" Width="50" />
                    <Button  Margin="5" Height="30" Name="btnZakazi" Width="90" Click="btnZakazi_Click">Zakazi</Button>
                    <StackPanel Orientation="Vertical">
                        <StackPanel Orientation="Horizontal">
                            <Label Name="l0">0</Label>
                            <Label Name="l1" Margin="1 0 0 0">1</Label>
                            <Label Name="l2" Margin="1 0 0 0">2</Label>
                            <Label Name="l3" Margin="1 0 0 0">3</Label>
                            <Label Name="l4" Margin="1 0 0 0">4</Label>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <Rectangle Height="20" Name="rectangle1" Fill="Green" Width="120"  />
                            <Rectangle Height="20" Name="rectangle2" Fill="Red" Width="40"  />
                            <Rectangle Height="20" Name="rectangle3" Fill="Green" Width="80"  />
                        </StackPanel>
                    </StackPanel>
                   
                </WrapPanel>

                <DataGrid Name="dataGrid1" Height="200" Margin="5" SelectionMode="Single" ItemsSource="{Binding}" AutoGenerateColumns="False" >
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" />
                        <DataGridTextColumn Header="Profesor" Binding="{Binding Path=Profesor}" />
                        <DataGridTextColumn Header="Sifra Ispita" Binding="{Binding Path=SifraIspita}" />
                        <DataGridTextColumn Header="Naziv Ispita" Binding="{Binding Path=NazivIspita}" />
                        <DataGridTextColumn Header="Prostorija" Binding="{Binding Path=Prostorija}" />
                        <DataGridTextColumn Header="Rok" Binding="{Binding Path=Rok}" />
                        <DataGridTextColumn Header="Datum" Binding="{Binding Path=Datum}" />
                        <DataGridTextColumn Header="Vreme" Binding="{Binding Path=Vreme}" />
                    </DataGrid.Columns>
                </DataGrid>
                <WrapPanel>
                    <Button HorizontalAlignment="Right" Height="30" Name="btnIzvezi" Width="90" Click="btnIzvezi_Click">Izvezi u Excel</Button>
                    <Button HorizontalAlignment="Right" Margin="5" Height="30" Name="btnBrisanje" Width="90" Click="btnBrisanje_Click">Brisanje</Button>
                </WrapPanel>
            </StackPanel>
        </StackPanel>
       

    </DockPanel>

</Window>
 
[ crnjin @ 18.01.2011. 23:13 ] @
Code (csharp):

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
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;
using System.Data;
using System.IO;
using System.Diagnostics;

namespace Diplomski
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class
        MainWindow : Window
    {
        FileStream fs; StreamReader sr; string tekst = "";
        List<Profesor> profesori = new List<Profesor>();
        List<Prostorija> prostorije = new List<Prostorija>();
       
        DataSet1TableAdapters.ProfesoriTableAdapter taP;
        DataSet1TableAdapters.RokoviTableAdapter taR;
        DataSet1TableAdapters.IspitiTableAdapter taI;
        DataSet1TableAdapters.ProstorijaTableAdapter taProstorija;
        DataSet1TableAdapters.ZakazaniTableAdapter taZ;
        public MainWindow()
        {
            InitializeComponent();
            taP = new Diplomski.DataSet1TableAdapters.ProfesoriTableAdapter();
            taR = new Diplomski.DataSet1TableAdapters.RokoviTableAdapter();
            taProstorija = new Diplomski.DataSet1TableAdapters.ProstorijaTableAdapter();
            taI = new Diplomski.DataSet1TableAdapters.IspitiTableAdapter();
            taZ = new Diplomski.DataSet1TableAdapters.ZakazaniTableAdapter();

           
                //fs = new FileStream("Zoran Banjac.txt", FileMode.Open, FileAccess.Read);
                //sr = new StreamReader(fs);
                //while (!sr.EndOfStream)
                //    tekst += sr.ReadLine();
                //sr.Close();
           
           
        }

        public class Profesor
        {
            private string ime,image,biografija;
            private int id;

            public Profesor(int Id, string Ime, string Image,string Biografija)
            {
                id = Id; ime = Ime; image = Image; biografija = Biografija;
            }

            public string Ime
            {
                get { return ime; }
                set { ime = value; }
            }

            public string Image
            {
                get { return image; }
                set { image = value; }
            }

            public string Biografija
            {
                get { return biografija; }
                set { biografija = value; }
            }

            public int ID
            {
                get { return id; }
                set { id = value; }
            }
        }

        public class Prostorija
        {
            private int id, kapacitet;
            private string naziv;
            private bool check;

            public Prostorija(int Id, int Kap, bool Check, string Naziv)
            {
                id = Id; kapacitet = Kap; check = Check; naziv = Naziv;
            }
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
            public int Kapacitet
            {
                get { return kapacitet; }
                set { kapacitet = value; }
            }
            public bool Check
            {
                get { return check; }
                set { check = value; }
            }
            public string Naziv
            {
                get { return naziv; }
                set { naziv = value; }
            }
        }

        public void ucitaj_DataGrid()
        {
            DataSet1.RokoviDataTable dtR = taR.GetData();
            DataSet1.ProfesoriDataTable dtP = taP.GetData();
            DataSet1.IspitiDataTable dtI = taI.GetData();
            DataSet1.ProstorijaDataTable dtProstorija = taProstorija.GetData();
            DataSet1.ZakazaniDataTable dtZ = taZ.GetData();

            DataTable dtZakazani = new DataTable();
            dtZakazani.Columns.Add("ID", typeof(int));
            dtZakazani.Columns.Add("Profesor", typeof(string));
            dtZakazani.Columns.Add("SifraIspita", typeof(string));
            dtZakazani.Columns.Add("NazivIspita", typeof(string));
            dtZakazani.Columns.Add("Prostorija", typeof(string));
            dtZakazani.Columns.Add("Rok", typeof(string));
            dtZakazani.Columns.Add("Datum", typeof(string));
            dtZakazani.Columns.Add("Vreme", typeof(string));

            string profDG = "", sifraIspitaDG = "", nazivIspitaDG = "", prostorijaDG = "";

            bool pom = false, pom1 = false; int j = 0, i = 0;
            int[] niz = new int[4 * dtZ.Rows.Count];

            foreach (DataSet1.ZakazaniRow r in dtZ.Rows)
            {
                pom1 = false;
                foreach (int br in niz) { if (br.Equals(r.ID)) pom1 = true; } i++;
                if (pom1) continue;

                foreach (DataSet1.ProfesoriRow rp in dtP.Rows)
                {
                    if (r.id_prof.Equals(rp.ID))
                        profDG += " " + rp.Ime + " " + rp.Prezime + " ";
                }
                foreach (DataSet1.IspitiRow ri in dtI.Rows)
                {
                    if (r.id_ispita.Equals(ri.ID))
                    { sifraIspitaDG = " " + ri.Sifra + " "; nazivIspitaDG = " " + ri.Naziv + " "; }
                }
                foreach (DataSet1.ProstorijaRow rp in dtProstorija.Rows)
                {
                    if (r.id_prostorije.Equals(rp.ID))
                        prostorijaDG += " " + rp.Naziv + " ";
                }

                foreach (DataSet1.ZakazaniRow rr in dtZ.Rows)
                {

                    if (j == 0) { j++; continue; }


                    if (r.id_prof.Equals(rr.id_prof) && r.id_ispita.Equals(rr.id_ispita) && !r.id_prostorije.Equals(rr.id_prostorije)
                    && r.Rok.Equals(rr.Rok) && r.Datum.Equals(rr.Datum) && r.Vreme.Equals(rr.Vreme) && !r.ID.Equals(rr.ID))
                        pom = true;
                    else
                        pom = false;

                    if (pom)
                    {
                        foreach (DataSet1.ProstorijaRow rp in dtProstorija.Rows)
                        {
                            if (rr.id_prostorije.Equals(rp.ID))
                                prostorijaDG += " , " + rp.Naziv;
                        }
                        niz[i++] = rr.ID;
                    }
                }
                dtZakazani.Rows.Add(r.ID, profDG, sifraIspitaDG, nazivIspitaDG, prostorijaDG, r.Rok, r.Datum.Day+"."+r.Datum.Month+"."+r.Datum.Year+".", r.Vreme);
                profDG = ""; sifraIspitaDG = ""; nazivIspitaDG = ""; prostorijaDG = "";
            }
            dataGrid1.DataContext = dtZakazani;
        }
       
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //MessageBox.Show(tekst);
            DataSet1.RokoviDataTable dtR = taR.GetData();
            DataSet1.ProfesoriDataTable dtP = taP.GetData();
            DataSet1.IspitiDataTable dtI = taI.GetData();
            DataSet1.ProstorijaDataTable dtProstorija = taProstorija.GetData();

            //***************************************************** Binding za comboBoxProfesor
            profesori.Add(new Profesor(0, "" , "", ""));

            foreach (DataSet1.ProfesoriRow r in dtP.Rows)
            {
                //string tekst = "";
                //fs = new FileStream(r.Ime + " " + r.Prezime + ".txt", FileMode.Open, FileAccess.Read);
                //sr = new StreamReader(fs);
                //while (!sr.EndOfStream)
                //    tekst = sr.ReadLine();
                //MessageBox.Show(tekst);
                profesori.Add(new Profesor(r.ID, r.Ime + " " + r.Prezime, r.Ime + " " + r.Prezime + ".jpg", ""));
               
            }
            this.GlavniStackPanel.DataContext = profesori;

            ucitaj_DataGrid();
            //********************************************************** Binding za comboBoxIspit
            string ime = "";
            DataTable dtPomIspit = new DataTable();
            dtPomIspit.Columns.Add("ID", typeof(int));
            dtPomIspit.Columns.Add("Ime", typeof(string));
            foreach (DataSet1.IspitiRow r in dtI.Rows)
            {
                ime += r.Sifra + " " + r.Naziv;
                dtPomIspit.Rows.Add(r.ID, ime);
                ime = "";
            }
            Binding b = new Binding() { Source = dtPomIspit };
            this.comboBoxIspit.SetBinding(ComboBox.ItemsSourceProperty, b);
            this.comboBoxIspit.DisplayMemberPath = "Ime";
            this.comboBoxIspit.SelectedValuePath = "ID";
            //****************************************************************** Binding za comboBoxProstorija
            //b = new Binding() { Source = dtProstorija };
            //this.comboBoxProstorija.SetBinding(ComboBox.ItemsSourceProperty, b);
            //this.comboBoxProstorija.DisplayMemberPath = "Naziv";
            //this.comboBoxProstorija.SelectedValuePath = "ID";
            foreach (DataSet1.ProstorijaRow r in dtProstorija.Rows)
            {
                prostorije.Add(new Prostorija(r.ID, r.Kapacitet, false, r.Naziv));
            }
            this.comboBoxProstorija.DataContext = prostorije;
            //*********************************************************************************** puni comboBoxRok
            foreach (DataSet1.RokoviRow r in dtR.Rows)
            {
                comboBoxRok.Items.Add(r.ID);
            }

        }

       
        private void btnZakazi_Click(object sender, RoutedEventArgs e)
        {

            double sat = 0, min = 0;
            DateTime n = new DateTime();
            sat = double.Parse(txtVreme.Text);
            min = double.Parse(txtVreme1.Text);
            // = sat;
            n = n.AddHours(sat);
            n = n.AddMinutes(min);
            MessageBox.Show("" + n.ToShortTimeString());

            try
            {
                bool prostorUnet = false;
                foreach (Prostorija p in prostorije)
                {
                    if (p.Check)
                    {
                        taZ.Insert(int.Parse(comboBoxProfesor.SelectedValue.ToString()),
                               int.Parse(comboBoxIspit.SelectedValue.ToString()),
                               p.ID,
                               comboBoxRok.SelectedItem.ToString(),
                               calendar.DisplayDate, txtVreme.Text);
                        prostorUnet = true;
                    }

                }
                if (prostorUnet)
                        MessageBox.Show("Ispit zakazan !");
                else
                    MessageBox.Show("Niste izabrali sve podatke !");
            }
            catch
            {
                MessageBox.Show("Nije uspelo!");
            }
            ucitaj_DataGrid();
        }

        private void btnIzvezi_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.SelectionMode = DataGridSelectionMode.Extended;
            dataGrid1.SelectAllCells();
            dataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
            ApplicationCommands.Copy.Execute(null, dataGrid1);
            string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Raspored_Ispita.csv";
            string dataExp = Clipboard.GetData(DataFormats.CommaSeparatedValue) as string;
            File.WriteAllText(docPath, dataExp);
            if (MessageBox.Show("Podaci sacuvani u Documents/Raspored_Ispita.csv . Da li zelite da otvorite taj fajl ?", "Podaci sacuvani u Excel dokumentu", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                Process.Start(docPath);
               
            }
           
            dataGrid1.UnselectAllCells();
        }


        private void btnBrisanje_Click(object sender, RoutedEventArgs e)
        {

            object selected = dataGrid1.SelectedItem;
            DataSet1.ZakazaniDataTable dtZ = taZ.GetData();
            try
            {
                DataRow row = ((DataRowView)selected).Row;
                int pomId = 0, pomId_prof = 0, pomId_ispit = 0, pomId_Prostor = 0;
                string pomRok = "", pomVreme = ""; DateTime pomDatum = DateTime.Today;
                foreach (DataSet1.ZakazaniRow r in dtZ.Rows)
                {
                    if (!pomId.Equals(r.ID) && pomId_prof.Equals(r.id_prof) && pomId_ispit.Equals(r.id_ispita) &&
                        !pomId_Prostor.Equals(r.id_prostorije) && pomRok.Equals(r.Rok) && pomDatum.Equals(r.Datum) &&
                        pomVreme.Equals(r.Vreme))
                    { taZ.Delete(r.ID, r.id_prof, r.id_ispita, r.id_prostorije, r.Rok, r.Datum, r.Vreme); }

                    pomId = r.ID; pomId_prof = r.id_prof; pomId_ispit = r.id_ispita; pomId_Prostor = r.id_prostorije;
                    pomRok = r.Rok; pomDatum = r.Datum; pomVreme = r.Vreme;

                    if (r.ID.Equals(row[0]))
                        if (MessageBox.Show("Da li ste sigurni da zelite da obrisete izabrani ispit ?", " ", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                        { taZ.Delete(r.ID, r.id_prof, r.id_ispita, r.id_prostorije, r.Rok, r.Datum, r.Vreme); }
                }
            }
            catch
            {
                MessageBox.Show("Morate prvo izabrati jedan ispit (red u tabeli) !");
            }
            ucitaj_DataGrid(); // nejasno zasto taZ.Delete(... trazi ovoliko argumenata a ne samo ID
        }

    }
}
 
[ crnjin @ 18.01.2011. 23:17 ] @
Izgleda nepregledno ali nadam se da ce vredeti ...

Sada pitanje :

Kako sortirati DataGrid po nekom kriterijumu (koloni) ? Konkretno dataGrid1 po ID ?
Treba da kada dodam novi ispit, i refresujem prikaz u dataGrid1 , on bude na kraju , zato sto ce imati najveci ID (AutoNumber u bazi podataka)...

[ crnjin @ 18.01.2011. 23:23 ] @
koga zanima kako izgleda neka pogleda http://uploading.com/files/2af9d625/Diplomski.zip/
[ stuparic @ 18.01.2011. 23:35 ] @
Sad cu pogledati,pa ti saljem neke sugestije. I ja sam skoro poceo da se bavim WPF-om...
[ stuparic @ 19.01.2011. 00:02 ] @
Fino izgleda, na prvi pogled, nisam se preterano udubljavao.

A sto se tice tvog problema, mozda ti ovo pomogne http://wpf.codeplex.com/Thread/View.aspx?ThreadId=46939
[ crnjin @ 19.01.2011. 01:02 ] @
Da, uspelo je , sortirao sam po ID ... Zanimljiv interfejs ICollectionView , posluzice za jos po nesto ... ali vec mi se spava , sutra :)


Hvala !
[ mmix @ 19.01.2011. 09:24 ] @
Ok, neke primedbe i dobronamerne kritike

MODEL
- za pocetak nemoj koristiti access 2007+, nemaju svi provajdera za to (ja nisam imao) niti je on preporucen za male desktop aplikacije. Bazu kreiraj u SDF formatu (Add New Item | Local Database). Access je i zvanicno razveden od desktop aplikacija

- Fali ti veza izmedju profesora i ispita, mozda je to van opsega tvog diplomskog ali u realnim uslovima tvoj model bi dozvolio npr kreiranje polaganja Matematike 1 kod Cirkovica koji predaje softverske predmete.

- Treba (bar za akademski projekat) da gadjas koser 3NF (treca normalna forma) za model baze, bar po meni. Pored toga sto je to dobra praksa da prepoznas greske i potencijalne probleme u modelu daje ti i opciju da iskucas malo teksta o tome u radu fillera nikad dosta narocito u Srbiji gde se akademski radovi vrednuju po kilazi. Ti si bio dobro poceo sa cepanjem glavne Zakazani tabele na 3NF ali si u nekom trenutku stao. Kad to kazem mislim na sledece:
- prostrije nisu 3NF ako su imena soba jedinstvena, onda imaju dva kandidata za kljuc (ID i ime prostorije) i otvaraju prostor za logicku gresku (dve razlicite sobe koje se zovu isto). Kao sto si radio sa rokom, radi i ovde, ime prostorije je unique iskoristi ga kao kljuc
- isto vazi i za Ispit (ID i Sifra), sifra je ocigledno jedinstvena, iskoristi nju.
- da se razumemo, u realnom zivotu neces biti ekstremista i drzati se 3NF kao pijan plota, niti ces vuci string kljuceve kao FK zbog drugih razloga. U svakom slucaju konsultuj se sa mentorom, dal da uradis skolski ili inzenjerski.

- Iskreno mi se ne svidja kako koristis datasetove . Ok, izabrao si datasetove (ja ne bih za ovaj app, linq2sql je ovde idealan) i to je u redu, ali onda ih koristi kako treba . Najvise bode oci to sto koristis kod da transformises podatke (npr Profesori) i onda mesas typed dataset i POCO model i potpuno bacas u vodu sve benefite koriscenja dataseta , i onda na sve to jos i nabacis jednu netipiziranu data tabelu .

Umesto toga fokusiraj se na jedno. Za pocetak iskoristi transformaciju na nivou SQLa. Nigde ne pise da tvoja tabela u datasetu mora da bude 1-1 sema kao u bazi, narocito ako je u pitanju samo lookup tabela. Dakle izbaci tabelu profesori iz dataset-a
1) Na dataset-u uradi rclick i "Add Table Adapter"
2) Izaberi SQL Query
3) Ubaci sledeci Query: SELECT ID, Ime + ' ' + Prezime AS Profesor, Kancelarija, email FROM Profesori i Next/Finish i imaces novu transformisanu tableu u datasetu i uopste to ne treba Profesor POCO tip ni transformacija
- Ako si uradio 3NF za prostoriju ti vise ni ne treba transformacija
- Vidim isto da koristis POCO klase da bi dodao nova "polja" u model. TO mozes i direktno da uradis u typed datatable kroz parzijalnu klasu. doubleclick tabelu i kad ti otvori sors napravis sledece

Code (csharp):

    public partial class DataSet1 {
        partial class ProstorijaDataTable
        {
            public bool Check { get; set; }
        }
    }
 

i voila, imas novo polje koje nije vezano za bazu a vidljivo je kroz interfejs tabele.


Nemoj koristiti untyped dataset elemente. Nije ni lepo a ni korisno a vec ionako IMAS model tabele za grid.
Kreiraj jedan dataset instance na formi oji ce ti biti centrani drzac za podatke, iz njega posle mozes da bindujes DIREKTNO kroz {Binding ...} na formi i mozes komotno da izbacis tonu kod kojom rucno pravis binding iz code-behind-a


WPF
Nemoj koristiti foreach nad dataset tabelama da rucno bildujes dropdown iteme. Sve datasets tabele su iterativne i mogu se bindovati direktno
Nemas nikakvu validaciju

Toliko za sada, moram da palim Ispravi ovo za pocetak pa cemo dalje.



U svakom slucaju mislim da se tvoj codebehind moze skresati za bar 50%

[ mmix @ 19.01.2011. 09:25 ] @
I btw, aplikacija bi trebalo da ti se zove "Zakazivanje ispita" ne "Prijava ispita"
[ crnjin @ 19.01.2011. 13:31 ] @
Ok , ovo za bazu sto si napisao vec sam planirao da ispravim (veza izmedju profesora i ispita, 3NF ...)
Sto se DataSet-ova tice, koristim ih jer jedino tako zanam da povezem bazu i aplikaciju, iako sam video 50% problema na koji si ukazao.
Moj mentor se ne buni , dao mi je puno slobode , sto je ponekad kontraproduktivno.
linq2sql nisam koristio pa ako ti nije problem stavi neki link o linq2sql , neki primer povezivanja sa bazom ,ja cu do tad probati nesto da izgooglam...

I jos , baza u SDF formatu ? Nju kreiram isto u Access-u ili SQL server (njega nemam)... ??

Izvini ako postavljam glupa pitanja, uzeo sam diplomski u WPF a nisam imao pojma ni sta je to, nismo ga radili ni na vezama,
tako da imam samo znanje sa vezbi C#, WCF(Integracija softverskih tehnologija tako s zvao predmet)
[ mmix @ 19.01.2011. 15:56 ] @
sdf kreiras direktno iz visual studia (rclick na projekat | Add | New Item | Local Database), wizard ce ti odmah i napraviti prazan dataset u koji da bacas tabele koje napravis. Sama baza ce tio biti vidljiva is database explorera.

ne treba ti ni access ni SQL server za sdf (u tome je njegova car ;)), sav runtime za ovu bazu je vec ukljucen u framework. sdf ima neka svoja ogranicenja, ali za tvoje promene (single user storage plus osnovne relacije) je odlican.


Sto se tice linq2sql, nije frka, imas dosta na netu pocev od Scottovog tutoriala (http://weblogs.asp.net/scottgu.../using-linq-to-sql-part-1.aspx), ali ne moras sada sebi da komplikujes, sa datasetovima si radio, nista im ne fali.

Sto se tice WPFa, ne brini, doci cemo i na to :) Sad zasad da sredimo pozadinu. Kad odradis ovo sto treba, okaci ponovo projekat pa da vidimo sta dalje. Ne moras da kacis source u poruci i da koristis download sajtove, slobodno spakuj projekat u zip i zakaci zip za poruku ovde.
[ crnjin @ 20.01.2011. 22:20 ] @
Evo promenio sam bazu (Access sutra cu probati to u SDF da pretocim) ...

Ali nisam zadovoljan, kada tamo direktno u Access-u unosim vrednosti u tabele dopusta mi da bilo koji ispit zakazem kod bilo kog profesora...???
Posto sam u tabelu ispiti dodao i kolonu id_prof to mi je omogucilo da u kodu to lepo uradim i da u comboBoxu sa ispitima budu samo oni koje predaje "doticni" profesor , ali mislim da to nije to.
Takodje sam provalio da mi u tabeli Zakazani ne trebaju i kolona Datum i kolona Vreme , nego to sve mogu da pamtim u jednoj DateTime koloni.

Pored toga pittanje, zasto mi ovaj deo koda(koji je izkomentarisan) sa FileStream-om i StreamReader-om ne radi .
Ideja je bila da iz txt fajlova citam biografiju profesora i da se ona nekako prikazuje ispod njegove slike kad ga izaberem u combobox-u.
Tako se radilo u windowsForms a ovde nesto se buni...

I ... ovo uzimanje vremena iz dva textbox-a mi se bas i ne svidja, ali bilo bi ok, ako bi pored njih imao one strelice kao u kalendaru samo gore/dole i ako bi pored toga napravio neku validaciju textboxova. Ajd validaciju malo sam gledo po netu , verovatno bih znao uraditi ali ove strelice , jesu to popup kontrole ili button-i ili ... nije neki problem ali voleo bih da cujem neki predlog...

Sutra idem do mentora pa cu cuti i njegovo misljenje ...

Do tad pozz :-)
[ mmix @ 20.01.2011. 22:36 ] @
Tehnicki, taj link sa prof_id nije dobar. Realni odnos izmedju profesora i ispita je M2M (many-to-many, u prevodu jedan profesor moze drzati vise ispita i isti ispit moze drzati vise profeosra) sto znaci da ti treba da imas medju tabelu koja ih povezuje.

Sto se tice biografija, sto ne potrpas to u bazu? I slike mozes isto, time resavas problem sa disk I/O i zaturenim fajlovima

Za time entru evo zgodne WPF kontrole za time entry: http://jobijoy.blogspot.com/2007/10/time-picker-user-control.html
[ crnjin @ 21.01.2011. 00:06 ] @
Ok. Ali kako slike da potrpam u bazu , ajd biografije moze kao string ,ali kako slike ?! Kakav je DataType polje u bazi, i kako to da uradim?
[ crnjin @ 21.01.2011. 00:11 ] @
Attachment :) , super , sad cu malo da eksperimentisem...
[ Dusan Kondic @ 21.01.2011. 09:11 ] @
Ja sam se dugo mučio sa upisom/iščitavanjem fotografija zaposlenih u/iz baze
(DataType image) jer mi je to nekad radilo, a nekad nije, iz nepoznatih razloga.
Posle desetak dana sam odustao i fotografije stavio u jedan direktorijum, a u
bazu upisao njihove putanje.
Na taj način sam smanjio i veličinu baze.
Izbor i prikaz fotografije ...
Code:

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.Title = "Izbor fotografije";
            dlg.DefaultExt = ".jpg";
            dlg.Filter = "JPEG (*.jpg)|*.jpg";
            Nullable<bool> result = dlg.ShowDialog();
            if (result == true)
            {
                FotoPutanja = dlg.FileName;
                Stream FileOpenStream;
                Byte[] ByteArray;
                BitmapImage mojaFotografija = new BitmapImage();
                mojaFotografija.BeginInit();
                mojaFotografija.UriSource = new Uri(FotoPutanja);
                FileOpenStream = dlg.OpenFile();
                using (BinaryReader br = new BinaryReader(FileOpenStream))
                {
                    ByteArray = br.ReadBytes(Convert.ToInt32(FileOpenStream.Length));
                }
                mojaFotografija.StreamSource = new System.IO.MemoryStream(ByteArray);
                mojaFotografija.DecodePixelWidth = 100;
                mojaFotografija.EndInit();
                //imgFoto.Source = mojaFotografija;
                ImageSource imgsrc = (ImageSource)CreateResizedImage((ImageSource)mojaFotografija, 90, 130);
                imgFoto.Source = imgsrc;
                //binSlika = BufferFromImage(mojaFotografija);
            }


[Ovu poruku je menjao Shadowed dana 21.01.2011. u 12:01 GMT+1]
[ crnjin @ 22.01.2011. 01:34 ] @
Dusane ovo deluje ok , iskreno nisam jos pokusao da upotrebim ovaj kod ali probacu .
Danas sam bio zaokupljen nekim drugim stvarima, nasao sam nesto zanimljivo na ovom linku
http://www.longhorncorner.com/...2008000036AM/WPFRectangle.aspx

Moglo bi da mi koristi da dinamicki iscrtavam pravugaonike na nekom Canvas-u i tako graficki predstavim vreme kad je neka prostorija zauzeta a kad ne.
Zeleni pravugaonik - slobodna , crveni - zauzeta , 24 pravugaonika za 24 sata , kao neki grafikon ... nesto tako...

Uradio sam sve isto kao na ovom linku ali nece da mi doda pravugaonik na Canvas???
XAML :
<Canvas x:Name="canvas" Grid.Column="1" Grid.Row="0" Height="200" Width="200" Background="Gray"></Canvas>

.cs :

private void DrawRectangle()
{
Rectangle kv = new Rectangle();
SolidColorBrush red = new SolidColorBrush(Colors.Red);
kv.Fill = red;
kv.Height = 150; kv.Height = 150;
canvas.Children.Insert(0, kv);
}
private void calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
DrawRectangle();
}
}
}

Ako neko vidi gde gresim neka javi, kacim ceo projekat kao attach...

Jos nesto probao sam biografiju profesora da stavim u bazu kao text polje, ali ne moze jer je text predugacak moze samo 255 karaktera? Onda da li da popravljam nekako ove izkomentarisane fajl strimove ili da to resim nekako drugacije ... ?
[ crnjin @ 22.01.2011. 01:58 ] @
Morao sam da obrisem neke fajlove iz bin direktorijuma ne bi trebalo da smeta, .exe i neka extenzija na o :)
[ mmix @ 22.01.2011. 10:07 ] @
Jos nisi presao na sdf? u sdf=u imas nvarchar polje u koje mozes da strpas cv profesora.

mani se za sada vizuelnih zezancija, mnogo togo sto ti sad petljas kroz kod moze lepo da se resi raznim bindinzima na samom XAMLu. Zavrsi prvo model.
[ Dusan Kondic @ 22.01.2011. 15:09 ] @
> Zeleni pravugaonik - slobodna , crveni - zauzeta ...
Ovo se rešava pomoću trigger-a u XAML-u promenom npr. boje pozadine
u zavisnosti od vrednosti polja "Zauzeto".
U svakom slučaju poslušaj mmx-a i završi bitnije stvari.
[ crnjin @ 25.01.2011. 23:22 ] @
Evo uradjeno u SDF-u ...

Uradio sam i dve funkcije za proveru

1. za proveru kapaciteta (da li ispit na koji izlazi ? studenata moze da se zakaze u prostorijama sa ? kapaciteta)
2. za proveru preklapanja termina ispita (nekad radi dobro , nekad ne :) , jos nisam ustanovio sta je problem, verovatno moze jednostavnije da se realizuje...)

Slike sam dodao u bazu , uspeo sam da konvertujem byte[] u Image ali sam ne mogu to da bajndujem u XAML-u ...

Napravio sam neki svoj TimePicker, ali ne znam koji je Event se desava kad kliknem na strelicu gore/dole u ScrollBar-u ...


Primedbe, sugestije ??
[ mmix @ 26.01.2011. 20:31 ] @
Samo da ti javim da nisam zaboravio na tebe, sad sam u nekoj guzvi, pogledacu sutra prepodne u malo vise detalja, ali za sada

1. model ti sada vezuje ispit za jednog profesora (tj jedan ispit moze da drzi samo jedan profesor). To mi ne zvuci realno, narocito na vecim katedrama, jel sigurno da si to hteo?
2. I dalje petljas sa POCO klasama Profesor i Prostorija, nisi ispravio to da vuce direktno iz dataseta.
[ crnjin @ 29.01.2011. 23:20 ] @
Jedan ispit moze da drzi samo jedan profesor , bar u nasoj skolici :) , to mi deluje ok ali popricacu sa mentorom o tome ... ako bude trebalo ispravicu, ali ne verujem...

2. POCO klase kako ih zovete, pokusao sam bez njih (bez Profesor klase) i onda sam se izgubio ... ali bukvalno, sad mi ne radi nista od bajdinga sa onim labelama , slikom ... oni podaci o profesoru sa strane , samo comboboxProfesor je ok. I sto vise razmisljam kako to da resim sve mi je nejasnije...dal sam glup ili mi mozak stao , stvarno ne znam ...

Prvo sam uklonio tabelu profesori iz DataSet-a, pa Add new Table Adapter i sql:
SELECT ID, Ime + ' ' + Prezime AS Profesor,Slika, Kabinet , Konsultacije , email, Biografija FROM Profesori onako kako je mmix rekao.

Pa sam pokusao sam da napravim jednu instancu dataset-a u konstruktoru i da iz nje vucem sve podatke
ovako --> DataSet1 ds = new DataSet1(); ali to izgleda kreira praznu instancu tako da kad probam nesto ovako:

comboBoxProfesor.Datacontext = ds.Tables["Profesori"];
comboBoxProfesor.DisplaymemberPath = ds.Tables["Profesori"].Columns["Profesor"].Tostring();
comboBoxProfesor.SelectedvaluePath = ds.Tables["Profesori"].Columns["ID"].Tostring();

ne radi.

pa sam promenio comboBoxProfesor.Datacontext = dtP; (dtP je instanca dataTableProfesori , naravno pre toga je bilo dtP.GetData() )

Jel moze neko da uzme ovaj moj "projekat" (okacicu ga kao attach uz poruku) prepravi ovaj kod da podaci budu bajndovani direktno iz dataset-a , bez tih POCO klasa i attachuje mi to uz odgovor?

Mozda previse trazim , ali verujem da je to nekome ko zna najvise pola sata posla, a meni ... ko zna verovatno dan-dva



[ crnjin @ 29.01.2011. 23:30 ] @
Bez ove POCO klase Profesor bih mozda i mogao da se snadjem, uradio bih te bajndinge labela ,verovatno na neki glup nacin ali bih uradio...
Ali bez klase Prostorije verovatno ne ,nekoliko funkcija mi koristi listu prostorija ...

Pokusao sam da dodam polje u Tabelu Prostorije onako kako je mmix rekao, dupli klik pa dodam

public partial class DataSet1 {
partial class ProstorijaDataTable
{
bool Check { get; set; }
}
}

ali nece da mi prikaze to polje u dataset-u nista se ne promeni...