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();
}
}
}
전체 코드이다.
실행 화면이다.