C#

WPF Splash

hyun0229 2022. 6. 1. 18:31

메인윈도우

랜덤으로 색을 20칸의 색을 칠한 후 DB에 저장하는 방법을 알아보자

  <Grid>
        <Button Content="Random 색깔표시" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,20,0,0" Width="150" x:Name="btnRandom" Click="btnRandom_Click"/>
        <Button Content="DB에 저장된 색깔표시" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,50,0,0" Width="150" x:Name="btnDB" Click="btnDB_Click"/>
        <Button Content="DB Reset" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,20,20,0" Width="150" x:Name="btnReset" Click="btnReset_Click" />
        <Button Content="종료" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,50,20,0" Width="150" x:Name="btnExit" Click="btnExit_Click" />
        <TextBlock x:Name="lblDate" HorizontalAlignment="Left" TextAlignment="Center" Margin="275,20,0,0" Width="150" VerticalAlignment="Top"/>
        <TextBlock x:Name="lblTime" HorizontalAlignment="Left" TextAlignment="Center" Margin="275,50,0,0" Width="150" VerticalAlignment="Top"/>
        <Grid Margin="20,90,20,20" Background="AntiqueWhite" Height="200" VerticalAlignment="Top">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <!--첫번째 줄-->
            <Border Margin="1" x:Name="bd1" Grid.Row="0" Grid.Column="0"/>
            <Border Margin="1" x:Name="bd2" Grid.Row="0" Grid.Column="1"/>
            <Border Margin="1" x:Name="bd3" Grid.Row="0" Grid.Column="2"/>
            <Border Margin="1" x:Name="bd4" Grid.Row="0" Grid.Column="3"/>
            <Border Margin="1" x:Name="bd5" Grid.Row="0" Grid.Column="4"/>
            <!--두번째 줄-->
            <Border Margin="1" x:Name="bd6" Grid.Row="1" Grid.Column="0"/>
            <Border Margin="1" x:Name="bd7" Grid.Row="1" Grid.Column="1"/>
            <Border Margin="1" x:Name="bd8" Grid.Row="1" Grid.Column="2"/>
            <Border Margin="1" x:Name="bd9" Grid.Row="1" Grid.Column="3"/>
            <Border Margin="1" x:Name="bd10" Grid.Row="1" Grid.Column="4"/>
            <!--세번째 줄-->
            <Border Margin="1" x:Name="bd11" Grid.Row="2" Grid.Column="0"/>
            <Border Margin="1" x:Name="bd12" Grid.Row="2" Grid.Column="1"/>
            <Border Margin="1" x:Name="bd13" Grid.Row="2" Grid.Column="2"/>
            <Border Margin="1" x:Name="bd14" Grid.Row="2" Grid.Column="3"/>
            <Border Margin="1" x:Name="bd15" Grid.Row="2" Grid.Column="4"/>
            <!--네번째 줄-->
            <Border Margin="1" x:Name="bd16" Grid.Row="3" Grid.Column="0"/>
            <Border Margin="1" x:Name="bd17" Grid.Row="3" Grid.Column="1"/>
            <Border Margin="1" x:Name="bd18" Grid.Row="3" Grid.Column="2"/>
            <Border Margin="1" x:Name="bd19" Grid.Row="3" Grid.Column="3"/>
            <Border Margin="1" x:Name="bd20" Grid.Row="3" Grid.Column="4"/>

        </Grid>
        <ListBox Background="AliceBlue" x:Name="lstDB" Margin="20,310,20,20"/>
    </Grid>
</Window>

세로 4 가로 5로 20칸을 만들어 각각에 이름을 추가시키고 위치를 지정하였다.

 public MainWindow()
        {
            InitializeComponent();
            borderList = new List<Border> { bd1, bd2,bd3,bd4,bd5,bd6,bd7,bd8,bd9,bd10,bd11,bd12,bd13,bd14,bd15,bd16,bd17,bd18,bd19,bd20 };
            t.Interval = new TimeSpan(0, 0, 1);
            t.Tick += T_Tick;
        }

borederList에 xml에 만들어던 20칸들을 넣어주고 타임인터벌을 1초로 설정한다.

private void T_Tick(object sender, EventArgs e)
        {
            string date = DateTime.Now.ToString("yyyy-MM-dd");
            string time = DateTime.Now.ToString("HH:mm:ss");
            lblDate.Text = date;
            lblTime.Text = time;

            
            byte[] colors = new byte[20];
            for (int i = 0; i < 20; i++)
            {
                colors[i] = (byte)(r.Next(256));
                borderList[i].Background
                  = new SolidColorBrush(
                    Color.FromRgb((byte)0, (byte)0, colors[i]));
            }
            string s = "";
            s += date + " " + time + " ";
            for (int i = 0; i < borderList.Count; i++)
            {
                s += colors[i] + " ";
            }
            lstDB.Items.Add(s);

            //리스트박스의 스크롤
            lstDB.SelectedIndex = index++;
            lstDB.ScrollIntoView(lstDB.SelectedItem);

            //DB에 저장
            string sql = string.Format("INSERT INTO Table VALUES ('{0}', '{1}'", date,time);
            for (int i = 0; i < 20; i++)
            {
                sql += ", " + colors[i];
            }
            sql += ")";
            MessageBox.Show(sql);
            using (SqlConnection conn = new SqlConnection(connStr))
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
        }

위의 코드는 초단위로 렌덤색을 설정하며 DB에 저장하게 된다 

이때 저장되는 형식은 이러하다. 랜덤의로 컬러를 지정하지만 RGB중 B의 값만 조정하여 색을 표시하기때문에 R,G는 0으로 고정되어있다.

  private void btnRandom_Click(object sender, RoutedEventArgs e)
        {
            if (flag == false)
            {
                t.Start();
                btnRandom.Content = "중지";
                flag = true;
            }
            else
            {
                t.Stop();
                btnRandom.Content = "Random색깔표시";
                flag = false;
            }
          
        }

렌덤 저장 버튼으로 누르면 t.Start를 통해 위의 코드를 실행시켜 렌덤 색을 표시하게 하였다.

 private void btnDB_Click(object sender, RoutedEventArgs e)
        {
            lstDB.Items.Clear();

            string sql = "SELECT * FROM Talbe";
            int[] colors=new int[20];
            using(SqlConnection conn = new SqlConnection(connStr))
            using(SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                SqlDataReader reader=comm.ExecuteReader();

                string s = "";
                while (reader.Read())
                {
                    s = "";
                    lblDate.Text = reader["Date"].ToString();
                    s+=lblDate.Text+" ";
                    lblTime.Text = reader["Time"].ToString();
                    s += lblTime.Text + " ";
                    for (int i = 0; i < 20; i++)
                    {
                        colors[i] = int.Parse(reader[i + 3].ToString());
                        s += colors[i] + " ";
                    }
                    lstDB.Items.Add(s);
                    lstDB.SelectedIndex = id++;
                    lstDB.ScrollIntoView(lstDB.SelectedItem);

                    for(int i = 0; i < colors.Length; i++)
                    {
                        borderList[i].Background=new SolidColorBrush(Color.FromRgb(0,0,(byte)colors[i]));
                    }
                    //WPF delay 주기
                    Dispatcher.Invoke((ThreadStart)(() => { }),DispatcherPriority.ApplicationIdle);
                    Thread.Sleep(20); //20ms
                }
            }
        }

위 코드는 DB에 저장되어 있는 코드를 읽는다.

   private void btnReset_Click(object sender, RoutedEventArgs e)
        {
            lstDB.Items.Clear();
            string sql = "DELETE FROM Talbe";
            using (SqlConnection conn = new SqlConnection(connStr))
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
        }

위 코드는 리셋버튼으로 DB의 저장값을 리셋시킨다.

   private void btnExit_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

Exit버튼으로 프로그램을 종료시킨다.

DB에 저장하기위에 위와 같이 설정해준다. 칸의 수의 맞게 p1~p20까지 int로 설정

 

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;
using System.Windows.Threading;
using System.Data.SqlClient;
using System.Threading;

namespace _038_Splash
{
    
    public partial class MainWindow : Window
    {
        string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\konyang\source\repos\VP01\038_Splash\Colors.mdf;Integrated Security=True";
        List<Border> borderList;
        DispatcherTimer t = new DispatcherTimer();
        Random r=new Random();

        
        public MainWindow()
        {
            InitializeComponent();
            borderList = new List<Border> { bd1, bd2,bd3,bd4,bd5,bd6,bd7,bd8,bd9,bd10,bd11,bd12,bd13,bd14,bd15,bd16,bd17,bd18,bd19,bd20 };
            t.Interval = new TimeSpan(0, 0, 1);
            t.Tick += T_Tick;
        }
        int index=0;
        private void T_Tick(object sender, EventArgs e)
        {
            string date = DateTime.Now.ToString("yyyy-MM-dd");
            string time = DateTime.Now.ToString("HH:mm:ss");
            lblDate.Text = date;
            lblTime.Text = time;

            
            byte[] colors = new byte[20];
            for (int i = 0; i < 20; i++)
            {
                colors[i] = (byte)(r.Next(256));
                borderList[i].Background
                  = new SolidColorBrush(
                    Color.FromRgb((byte)0, (byte)0, colors[i]));
            }
            string s = "";
            s += date + " " + time + " ";
            for (int i = 0; i < borderList.Count; i++)
            {
                s += colors[i] + " ";
            }
            lstDB.Items.Add(s);

            //리스트박스의 스크롤
            lstDB.SelectedIndex = index++;
            lstDB.ScrollIntoView(lstDB.SelectedItem);

            //DB에 저장
            string sql = string.Format("INSERT INTO Table VALUES ('{0}', '{1}'", date,time);
            for (int i = 0; i < 20; i++)
            {
                sql += ", " + colors[i];
            }
            sql += ")";
            MessageBox.Show(sql);
            using (SqlConnection conn = new SqlConnection(connStr))
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
        }
        bool flag =false;
        private void btnRandom_Click(object sender, RoutedEventArgs e)
        {
            if (flag == false)
            {
                t.Start();
                btnRandom.Content = "중지";
                flag = true;
            }
            else
            {
                t.Stop();
                btnRandom.Content = "Random색깔표시";
                flag = false;
            }
          
        }
        int id=0;
        private void btnDB_Click(object sender, RoutedEventArgs e)
        {
            lstDB.Items.Clear();

            string sql = "SELECT * FROM Talbe";
            int[] colors=new int[20];
            using(SqlConnection conn = new SqlConnection(connStr))
            using(SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                SqlDataReader reader=comm.ExecuteReader();

                string s = "";
                while (reader.Read())
                {
                    s = "";
                    lblDate.Text = reader["Date"].ToString();
                    s+=lblDate.Text+" ";
                    lblTime.Text = reader["Time"].ToString();
                    s += lblTime.Text + " ";
                    for (int i = 0; i < 20; i++)
                    {
                        colors[i] = int.Parse(reader[i + 3].ToString());
                        s += colors[i] + " ";
                    }
                    lstDB.Items.Add(s);
                    lstDB.SelectedIndex = id++;
                    lstDB.ScrollIntoView(lstDB.SelectedItem);

                    for(int i = 0; i < colors.Length; i++)
                    {
                        borderList[i].Background=new SolidColorBrush(Color.FromRgb(0,0,(byte)colors[i]));
                    }
                    //WPF delay 주기
                    Dispatcher.Invoke((ThreadStart)(() => { }),DispatcherPriority.ApplicationIdle);
                    Thread.Sleep(20); //20ms
                }
            }
        }

        private void btnReset_Click(object sender, RoutedEventArgs e)
        {
            lstDB.Items.Clear();
            string sql = "DELETE FROM Talbe";
            using (SqlConnection conn = new SqlConnection(connStr))
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
        }

        private void btnExit_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

전체 코드이다.

실행화면

실행 화면이다.