Lottorivit.xaml.cs 7.52 KB
Newer Older
M1888's avatar
M1888 committed
1 2
using Lottokone.Model;
using System;
M1888's avatar
M1888 committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
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;

namespace Lottokone
{
    /// <summary>
    /// Interaction logic for Lottorivit.xaml
    /// </summary>
    public partial class Lottorivit : Window
    {
M1888's avatar
M1888 committed
23 24 25 26

        private Button btnSave;
        private Label lblInfo;

M1888's avatar
M1888 committed
27 28 29 30 31 32 33 34
        // Tähän listaan tehdään uusi lista jokaista lottoriviä varten.
        // Siihen listaan sitten lisätään nuo kyseisen rivin TextBoxit, jotta ne saa
        // käytyä myöhemmin järjestyksessä läpi, kun rivit tallentaa.
        private List<List<TextBox>> numerot;

        // Tähän haetaan kannasta tallennetut rivit, joilla täytetään kentät valmiiksi
        private List<Lottorivi> rivit;

M1888's avatar
M1888 committed
35 36 37 38 39 40
        public Lottorivit()
        {
            InitializeComponent();
            NaytaKontrollit();
        }

M1888's avatar
M1888 committed
41 42 43

        // Koodi on valitettavasti vähän spagettia. Minulla oli ongelmia saada tämän ikkunan layout 
        // toimimaan millään tapaa. Päädyin luomaan kaikki kontrollit täällä koodissa ja asettamaan ne gridille. 
M1888's avatar
M1888 committed
44
        private void NaytaKontrollit()
M1888's avatar
M1888 committed
45
        {
M1888's avatar
M1888 committed
46
            numerot = new List<List<TextBox>>();
M1888's avatar
M1888 committed
47 48 49 50 51 52 53 54 55

            // Dynaaminen korkeus tarpeen mukaan
            this.Height = 80 + Properties.Settings.Default.Vakiorivit * 40;

            // Gridiin tarvitan 8 saraketta. 1 labelille ja 7 numeroille.
            for (int i = 0; i < 8; i++)
                grdRivit.ColumnDefinitions.Add(new ColumnDefinition());

            // Tallenna-nappi
M1888's avatar
M1888 committed
56 57 58 59
            btnSave = new Button();
            btnSave.Content = "Tallenna";
            btnSave.Margin = new Thickness(5);
            btnSave.Click += btnSave_Click;
M1888's avatar
M1888 committed
60 61

            // Asetetaan se toiseksi alimmalle riville
M1888's avatar
M1888 committed
62 63
            Grid.SetRow(btnSave, Properties.Settings.Default.Vakiorivit);
            Grid.SetColumnSpan(btnSave, 2);
M1888's avatar
M1888 committed
64
            grdRivit.RowDefinitions.Add(new RowDefinition());
M1888's avatar
M1888 committed
65 66
            grdRivit.Children.Add(btnSave);

M1888's avatar
M1888 committed
67
            // Luodaan label, jonne voidaan laittaa ohjeita ja virheitä.
M1888's avatar
M1888 committed
68 69 70
            lblInfo = new Label();
            lblInfo.Style = Resources["Isompi"] as Style;
            lblInfo.Margin = new Thickness(5);
M1888's avatar
M1888 committed
71 72

            // Se menee alimmalle riville.
M1888's avatar
M1888 committed
73 74
            Grid.SetRow(lblInfo, Properties.Settings.Default.Vakiorivit + 1);
            Grid.SetColumnSpan(lblInfo, 8);
M1888's avatar
M1888 committed
75
            grdRivit.RowDefinitions.Add(new RowDefinition());
M1888's avatar
M1888 committed
76 77
            grdRivit.Children.Add(lblInfo);

M1888's avatar
M1888 committed
78
            // Ladataan kannasta vakiorivit, joilla ikkuna täytetään
M1888's avatar
M1888 committed
79 80 81 82 83 84
            try
            {
                rivit = ViewModel.Riviapuri.Lataa(Properties.Settings.Default.Vakiorivit);
            }
            catch (Exception ex)
            {
M1888's avatar
M1888 committed
85
                lblInfo.Content = $"Virhe ladattaessa rivejä: {ex.Message}";
M1888's avatar
M1888 committed
86 87
            }

M1888's avatar
M1888 committed
88 89

            // Sitten luodaan rivit
M1888's avatar
M1888 committed
90 91
            for (int i = 0; i < Properties.Settings.Default.Vakiorivit; i++)
            {
M1888's avatar
M1888 committed
92
                // Gridiin uusi rivi
M1888's avatar
M1888 committed
93
                grdRivit.RowDefinitions.Add(new RowDefinition());
M1888's avatar
M1888 committed
94 95 96 97 98

                // Otetaan kohta luotavat textboxit omaan listaan talteen
                numerot.Add(new List<TextBox>());

                // rivin numero labeliin, tulee sarakkeeseen 0
M1888's avatar
M1888 committed
99
                Label l = new Label();
M1888's avatar
M1888 committed
100
                l.Content = $"Rivi {i + 1}";
M1888's avatar
M1888 committed
101 102 103
                Grid.SetRow(l, i);
                Grid.SetColumn(l, 0);
                grdRivit.Children.Add(l);
M1888's avatar
M1888 committed
104

M1888's avatar
M1888 committed
105
                // luodaan 7 textboxia
M1888's avatar
M1888 committed
106 107 108 109
                for (int j = 0; j < 7; j++)
                {
                    TextBox tb = new TextBox();
                    tb.Style = Resources["Lottonumero"] as Style;
M1888's avatar
M1888 committed
110 111 112 113
                    tb.Width = 25;
                    tb.Height = 25;
                    tb.Margin = new Thickness(3, 0, 3, 0);
                    tb.VerticalAlignment = VerticalAlignment.Top;
M1888's avatar
M1888 committed
114 115

                    // kun saadaan focus, halutaan valita kaikki
M1888's avatar
M1888 committed
116
                    tb.GotFocus += txbFocus;
M1888's avatar
M1888 committed
117 118

                    // tekstin muuttuessa tehdään validointi
M1888's avatar
M1888 committed
119
                    tb.TextChanged += txbChanged;
M1888's avatar
M1888 committed
120 121

                    // tekstilaatikkoon vanha numero valmiiksi
M1888's avatar
M1888 committed
122
                    tb.Text = rivit[i].Numerot[j].ToString();
M1888's avatar
M1888 committed
123

M1888's avatar
M1888 committed
124
                    Grid.SetRow(tb, i);
M1888's avatar
M1888 committed
125
                    Grid.SetColumn(tb, j + 1);
M1888's avatar
M1888 committed
126
                    grdRivit.Children.Add(tb);
M1888's avatar
M1888 committed
127

M1888's avatar
M1888 committed
128
                    numerot[i].Add(tb);
M1888's avatar
M1888 committed
129 130
                }
            }
M1888's avatar
M1888 committed
131
        }
M1888's avatar
M1888 committed
132

M1888's avatar
M1888 committed
133 134 135
        private void txbFocus(object sender, RoutedEventArgs e)
        {
            TextBox tb = sender as TextBox;
M1888's avatar
M1888 committed
136
            if (tb != null)
M1888's avatar
M1888 committed
137 138 139
            {
                tb.SelectAll();
            }
M1888's avatar
M1888 committed
140 141 142 143
        }

        public void btnSave_Click(object sender, RoutedEventArgs e)
        {
M1888's avatar
M1888 committed
144
            // Parsitaan nuo TextBoxit Rivi-oloiksi ja tallennetaan ne lopuksi
M1888's avatar
M1888 committed
145
            List<Rivi> rivit = new List<Rivi>();
M1888's avatar
M1888 committed
146
            foreach (List<TextBox> rivi in numerot)
M1888's avatar
M1888 committed
147 148
            {
                short[] tmp = new short[7];
M1888's avatar
M1888 committed
149 150
                // tarvitaan myös indeksi, joten foreach ei käy tähän looppiin
                for (int i = 0; i < 7; i++)
M1888's avatar
M1888 committed
151
                {
M1888's avatar
M1888 committed
152
                    if (short.TryParse(rivi[i].Text, out short s))
M1888's avatar
M1888 committed
153 154
                    {
                        // tehdään vielä validaatio ennen tallennusta
M1888's avatar
M1888 committed
155
                        if (s < 1 || s > 40)
M1888's avatar
M1888 committed
156 157
                        {
                            lblInfo.Content = "Käytä vain numeroita 1-40";
M1888's avatar
M1888 committed
158
                            // ei tallennetakkaan, jos ei ole validia syötettä...
M1888's avatar
M1888 committed
159 160 161 162 163 164 165
                            return;
                        }
                        tmp[i] = s;
                    }
                    else
                    {
                        lblInfo.Content = "Käytä vain numeroita 1-40";
M1888's avatar
M1888 committed
166
                        // ei tallennetakkaan, jos ei ole validia syötettä...
M1888's avatar
M1888 committed
167 168 169 170 171
                        return;
                    }
                }
                rivit.Add(new Rivi(tmp));
            }
M1888's avatar
M1888 committed
172

M1888's avatar
M1888 committed
173
            // Jos saatiin parsittua kaikki rivit, tallennetaan, ja suljetaan ikkuna.
M1888's avatar
M1888 committed
174 175 176 177 178 179 180
            try
            {
                ViewModel.Riviapuri.Tallenna(rivit);
                this.Close();
            }
            catch (Exception ex)
            {
M1888's avatar
M1888 committed
181
                // Virheen sattuessa ikkuna jääkin auki, ja virhe tulee alalaitaan.
M1888's avatar
M1888 committed
182 183
                lblInfo.Content = $"Virhe tallennettaessa rivejä: {ex.Message}";
            }
M1888's avatar
M1888 committed
184 185 186 187
        }

        public void txbChanged(object sender, TextChangedEventArgs e)
        {
M1888's avatar
M1888 committed
188
            // Validoidaan, että laatikoissa on vain lukuja 1-40.
M1888's avatar
M1888 committed
189
            TextBox tb = sender as TextBox;
M1888's avatar
M1888 committed
190
            if (tb != null)
M1888's avatar
M1888 committed
191
            {
M1888's avatar
M1888 committed
192 193
                bool ok = true;
                if (int.TryParse(tb.Text, out int result))
M1888's avatar
M1888 committed
194
                {
M1888's avatar
M1888 committed
195
                    if (result < 1)
M1888's avatar
M1888 committed
196
                    {
M1888's avatar
M1888 committed
197
                        ok = false;
M1888's avatar
M1888 committed
198 199 200
                    }
                    else if (result > 40)
                    {
M1888's avatar
M1888 committed
201
                        ok = false;
M1888's avatar
M1888 committed
202 203 204 205
                    }
                }
                else
                {
M1888's avatar
M1888 committed
206 207 208 209 210 211 212 213 214 215 216
                    ok = false;
                }
                if (ok)
                {
                    lblInfo.Content = "";
                    btnSave.IsEnabled = true;
                }
                else
                {
                    lblInfo.Content = "Syötä vain numeroita 1-40";
                    btnSave.IsEnabled = false;
M1888's avatar
M1888 committed
217 218 219 220 221
                }
            }
        }
    }
}