HW3

연습문제 (3)

단원 : C# WinForm

목표 : C# Form, Controls, GUI, Dialog

주요 연습 내용 : collections, class, Form, 속성, FileIO 연습

준비자료 : CurrencyExchange.cs

  7047551813.cs

연습문제 Ex3 (Due by 11/10 24시까지)

-cyber 강의실 (cyber.dku.edu)source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex3.zip으로 묶어서 낼 것. 보고서 (30%)

[연습문제]

1. Form1에 각종 컨트롤을 추가한다. (10%)

– groupBox1(환전방법) & radioButton1 & radioButton2 & radioButton3
– groupBox2
– textBox1 & textBox2
– comboBox1 & comboBox2 (한국/미국/일본…)
– label1 & label2 (KRW…)
– label3 (=) & label4 (환율고시 최근업데이트 시각)
– listView1 (View 속성을 Details로 하고, Columns에 통화명, 매매기준율, 살 때, 팔 때 추가)

사용자 삽입 이미지


2. CurrencyExchange.cs
클래스와 CurrencyExchangeConverter.cs 클래스를 가지고CurrencyConverter.dll을 생성한다. (20%)

참조: http://dis.dankook.ac.kr/lectures/hci12/entry/C-Point-Point3D-Class-Assembly
경고: Reference에서 System.Windows.Forms를 추가해야 함
새프로젝트 -> Class Library 선택해서 CurrencyConverter로 생성

사용자 삽입 이미지

CurrencyExchangeConverter 클래스

멤버 필드

+static Dictionary<string, CurrencyExchange> currencies; // 환율 데이터

+static DateTime lastUpdated; // 최근 업데이트 시각

+static string filename; // 환율 데이터를 저장하는 파일명 (lastUpdated를 이용하여 파일명 생성, : 2012-11-01_17-55-10.txt)

속성

+public static DateTime LastUpdated { get; }

=> lastUpdated 반환 (label4에서 사용)

메소드

+static CurrencyExchangeConverter()

=> currencies 생성, DownloadTodayCurrencyExchangeRates, WriteFile

+static void DownloadTodayCurrencyExchangeRates()

=> 네이버 환율 사이트에서 데이터를 받아서 currencies에 저장

+static void WriteFile()

=> currencies 데이터를 파일로 저장 (이미 파일이 존재할 시 저장 안함)

+public static Dictionary<string, CurrencyExchange> GetCurrencyExchangeList()

=> currencies 데이터를 반환

+ICollection<string> GetCurrencyExchangeKeys()

=> currencies에서 Keys를 반환 (comboBox1&2에서 사용)

+public static ICollection<CurrencyExchange> GetCurrencyExchangeValues()

=> currencies에서 Values를 반환 (listView1에서 사용)

+public static string GetCurrencySign(string hname)

=> currencies 데이터에서 hname (: 미국)을 가지고 해당 sign (: USD)

반환 (label1&2에서 사용)

+public static double Exchange(string fromCurrency, string toCurrency, ExchangeMethod

method, double value)

=> currencies 데이터에서 환전방법(기준/살 때/팔 때)에 따라서 환율을

받아와서 환전을 계산 (공식: value * (fromRate/toRate) )

 

3. CurrencyConverter.dll을 이용하여 Form1에서 환율계산기를 작성한다. (20%)

경고: Reference에서 CurrencyConverter.dll를 추가해야 함
사용자 삽입 이미지

– Form1_Load

=> 초기화 상태를 만들어 준다.

=> comboBox1&2CurrencyExchangeConverter.GetCurrencyExchangeKeys() 사용

=> listView1CurrencyExchangeConverter.GetCurrencyExchangeValues() 사용 (listViewItem 추가 시 한국은 빼준다.)

=> label4CurrencyExchangeConverter.LastUpdated 사용
사용자 삽입 이미지 

– radioButton_CheckChanged

=> radioButton1/2/3Checked하면 ExchangeMethod.Standard/Buy/Sell로 선택

– comboBox1_SelectedIndexChanged & comboBox2_SelectedIndexChanged

=> comboxBox1/2에서 유럽연합선택하면 label1/2EUR로 바꿔줌

=> CurrencyExchangeConverter.GetCurrencySign(…) 사용 (, 일본은 “JPY 100”로 바꿔줌)

– textBox1_KeyPress & textBox2_KeyPress

=> 실제 textBox1 또는 textBox2에 넣은 value 값으로 환율변환을 계산하여 상대방 쪽에 보여줌

=> CurrencyExchangeConverter.Exchange(…) 사용 (, 일본은 100엔 기준임)사용자 삽입 이미지

 

4. 일반 TextBox 대신 숫자만 입력받을 수 있는 사용자 정의 컨트롤 (NumberTextBox)를 사용하거나, 본인이 원하는 기능을 더 추가한다. (10%)

참조: http://dis.dankook.ac.kr/lectures/hci12/entry/Number-Only-Textbox
          http://dis.dankook.ac.kr/lectures/hci12/entry/Custom-Control
경고
: Reference에서 NumberTextBoxLib.dll를 추가해야 함 & 도구상자 (Toolbox)에서 오른쪽마우스버튼을 누르고 팝업메뉴에서 아이템선택 (Choose Items)을 한 후 Browse해서 직접 NumberTextBoxLib.dll을 선택하면 NumberTextBox라는 컨트롤이 생성 됨

– numberTextBox1 & numberTextBox2

사용자 삽입 이미지

 

 

Custom Control

사용자 정의 컨트롤
-기존 컨트롤을 상속받아 사용자 정의 새로운 컨트롤을 작성
-UserControl을 상속받아 합성 컨트롤을 작성

1. 파일 메뉴->새로 만들기->프로젝트
Visual C# 프로젝트 목록에서 “Windows Forms 컨트롤 라이브러리” 선택하고 이름을 “NumberTextBoxLib”을 입력
사용자 삽입 이미지2. 솔루션 탐색기에서 UserControl1.cs를 NumberTextBox.cs로 변경

NumberTextBox.cs 코드에서 상속을 UserControl에서 TextBox로 변경
public partial class NumberTextBox: TextBox
NumberTextBox.Designer.cs에 InitializeComponent()에서 AutoScaleMode 속성은 삭제
NumberTextBox.cs 코드에서 OnKeyPress(…) 메소드를 재정의
솔루션을 빌드하면 컨트롤이 완성
사용자 삽입 이미지———————————————————————————————————-
사용자 정의 컨트롤 사용
1.솔루션 탐색기의 “참조”에 “NumberTextBoxLib.dll”를 “참조추가”
“도구상자”에서 오른쪽 마우스 “항목선택”을 한 후 “찾아보기” 버튼에서 “NumberTextBoxLib.dll” 다시 로딩한 후, “NumberTextBox” 에 체크가 됬는지 확인

사용자 삽입 이미지

사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

2. 폼에 “NumberTextBox”를 사용하여 디자인하고 솔루션을 빌드하면 컨트롤이 완성

네이버 오늘의 환율 시세 출력에서 last_update 추가 (C#)

// 네이버 오늘의 환율 시세 출력 (C#)
public void DownloadTodayCurrencyExchangeRates()
{
WebClient client = new WebClient();
client.Headers.Add(“Referer”, “http://blog.naver.com/usback“);
Stream xmlDataStream = client.OpenRead(
http://www.naver.com/include/timesquare/widget/exchange.xml“);
XmlReader reader = XmlReader.Create(xmlDataStream);
reader.MoveToContent();

// last_update
reader.ReadToFollowing(“last_update”);
string lastUpdate = reader.ReadElementContentAsString(“last_update”,
reader.NamespaceURI);
int year = int.Parse(lastUpdate.Substring(0, 4));
int month = int.Parse(lastUpdate.Substring(4, 2));
int day = int.Parse(lastUpdate.Substring(6, 2));
int hour = int.Parse(lastUpdate.Substring(8, 2));
int minute = int.Parse(lastUpdate.Substring(10, 2));
int second = int.Parse(lastUpdate.Substring(12, 2));
lastUpdated = new DateTime(year, month, day, hour, minute, second);

while (reader.ReadToFollowing(“currency”))
{
reader.ReadToFollowing(“hname”);
string hname = reader.ReadElementContentAsString(“hname”,
reader.NamespaceURI);
reader.ReadToFollowing(“standard”);
double standard = reader.ReadElementContentAsDouble(“standard”,
reader.NamespaceURI);
reader.ReadToFollowing(“buy”);
double buy = reader.ReadElementContentAsDouble(“buy”,
reader.NamespaceURI);
reader.ReadToFollowing(“sell”);
double sell = reader.ReadElementContentAsDouble(“sell”,
reader.NamespaceURI);
reader.ReadToFollowing(“sign”);
string sign = reader.ReadElementContentAsString(“sign”,
reader.NamespaceURI);
Console.WriteLine(“{0}\t{1}\t{2}\t{3}\t{4}”, hname, standard, buy, sell, sign);
}
}

Number Only Textbox

// number only textbox using TryParse
private void textBox1_KeyPress(object
sender, KeyPressEventArgs e)
{
    int value = 0;
    e.Handled = !int.TryParse(e.KeyChar.ToString(), out value);
}

// number only textbox using Regex.IsMatch
private void
textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), “\\d+”))
        e.Handled = true;
}

// NumberTextBoxLib custom control (inherited from TextBox)
public
partial class NumberTextBox : TextBox
{
        public NumberTextBox()
        {
            InitializeComponent();
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            int value = 0;
            e.Handled = !int.TryParse(e.KeyChar.ToString(), out value);
   
    }
}

1305433735.zip

C# Windows Forms Controls

Label, Button 사용예
http://dis.dankook.ac.kr/lectures/hci09/entry/Controls
 
Buttons
http://dis.dankook.ac.kr/lectures/hci09/entry/Buttons

GroupBox
http://dis.dankook.ac.kr/lectures/hci09/entry/GroupBox

TextBox
http://dis.dankook.ac.kr/lectures/hci09/entry/TextBox

LinkedLabel
http://dis.dankook.ac.kr/lectures/hci09/entry/Linked-Label

ListBox
http://dis.dankook.ac.kr/lectures/hci09/entry/ListBox

Poll
http://dis.dankook.ac.kr/lectures/hci09/entry/Poll

PictureBox
http://dis.dankook.ac.kr/lectures/hci09/entry/Picture-Timer

TabControl
http://dis.dankook.ac.kr/lectures/hci09/entry/Tab-Control

TreeControl
http://dis.dankook.ac.kr/lectures/hci09/entry/Tree-Control

ListView
http://dis.dankook.ac.kr/lectures/hci09/entry/ListView

Textbox (Number Only)
http://dis.dankook.ac.kr/lectures/hci09/entry/Number-Only-Textbox