종로구 가회동 동네예보 Rss Feed

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Weather; // RssFeedData.cs
using System.Net;
// HttpWebRequest


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string PubDate;


        public List<RssFeedData> ReadFeed(string url)
        {
            List<RssFeedData> rssFeedItems = new List<RssFeedData>();
            HttpWebRequest rssFeed = (HttpWebRequest)WebRequest.Create(url);
            using (DataSet rssData = new DataSet())
            {
                rssData.ReadXml(rssFeed.GetResponse().GetResponseStream());


                foreach (DataRow row in rssData.Tables[“channel”].Rows)
                {
                    PubDate = Convert.ToString(row[“pubDate”]);
                    System.Diagnostics.Trace.WriteLine(PubDate);
                }


                foreach (DataRow row in rssData.Tables[“data”].Rows)
                {
                    rssFeedItems.Add(new RssFeedData
                    {
                        Hour = Convert.ToInt32(row[“hour”]),
                        Day = Convert.ToInt32(row[“day”]),
                        Temperature = Convert.ToDouble(row[“temp”]),
                        MaximumTemperature = Convert.ToDouble(row[“tmx”]),
                        LowTemperature = Convert.ToDouble(row[“tmn”]),
                        Sky = Convert.ToInt32(row[“sky”]),
                        Pty = Convert.ToInt32(row[“pty”]),
                        WeatherForecast = Convert.ToString(row[“wfKor”]),
                        Pop = Convert.ToInt32(row[“pop”]),
                        Rain = Convert.ToDouble(row[“r12”]),
                        Snow = Convert.ToDouble(row[“s12”]),
                        Wind = Convert.ToDouble(row[“ws”]),
                        WindDirection = Convert.ToString(row[“wdKor”]),
                        Humidity = Convert.ToInt32(row[“reh”])
                    });
                }
            }


            return rssFeedItems;
        }


        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
// 종로구 가회동
            List<RssFeedData> aList = ReadFeed(“http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1111060000“);
            foreach (var item in aList)
                System.Diagnostics.Trace.WriteLine(item);


            label1.Text = PubDate;
            dataGridView1.DataSource = aList;
        }
    }
}

HW4

연습문제 (4)






단원 : C# WinForm


목표 : Collections & FileIO & Controls & Dialog & XML


주요 연습 내용 : RSS Feed, string, Gridview,


준비자료 : zone.csv, 기상청 동네예보 사이트, Resources(아이콘이미지)


 


3652079610.hwp4270977580.cs9327055152.zip
[
연습문제] Ex4 (Due by 12/06 24시까지)


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


기상청 동네예보 사이트 http://www.kma.go.kr/weather/forecast/timeseries.jsp


기상청 RSS 서비스 http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp


 


[연습문제]


1. Form1.cs (메인 폼)에 툴바와 각종 컨트롤을 추가한다. (10%)
사용자 삽입 이미지



메인폼(Form1)


Text: 날씨 동네예보 Rss


Size: 810,410


label1 : 발표시각


label2, label3 : 동네예보, 관심지역


textBox1 : 동네예보지역


comboBox1 : 동네예보 관심지역 리스트


button1 : 동네찾기폼 (Form2)으로 감


button2 : 등록추가폼 (Form3)으로 감


button3 : Image 속성지정. 현재 동네예보지역 RSS Link를 사용하여 기상청 링크로 감


dataGridView1 : 그리드뷰 (현재 동네예보지역의 날씨 RSS 정보)


imageList1 : 이미지 리스트 (날씨아이콘)


2. 비모달형 Form2.cs (동네예보 코드검색)에 각종 컨트롤을 추가한다. (10%)



사용자 삽입 이미지


동네예보 코드검색 (Form2)


-Text 속성은 동네예보 코드검색


-Size 속성은 310,160


label1 : 동이름


textBox1 : 동이름 입력 텍스트박스


button1 : 검색버튼


linkLabel1 : 검색된 동네예보 보기


 


3. 모달형 Form3.cs (동네예보 관심지역 설정)에 각종 컨트롤을 추가한다. (10%)


사용자 삽입 이미지
동네예보 코드검색
(Form2)


-Text 속성은 동네예보 코드검색


-Size 속성은 320,340


label1 : 동이름


textBox1 : 동이름 입력 텍스트박스


listBox1 : 추가된 동이름 리스트


button1 : 리스트박스에 동이름 추가버튼


button2 : “확인버튼


button3 : “취소버튼


 


3. DongCode, RssFeedData, RssManager 클래스를 구현함. (10%)


DongCode


-Code : 1111056000


-Name : 평창동


-ParentCode : 11110


-ParentName : 종로구


-X : 60


-Y : 127


RssFeedData


-Hour, Day, Temperature, MaximumTemperature, LowTemperature, Sky, Pty, WeatherForecast, Pop, Wind, WindDirection, Humidity, Rain, Snow // 시각, 날짜, 기온, 최대기온, 최저기온, 하늘상태코드, 강수상태코드, 날씨, 강수확률, 풍속, 풍향, 습도, 12시간 예상강수량, 12시간 예상적설량


public override string ToString() // csv format 출력


public virtual object[] ToDataRow() // Day, Hour, WeatherForecast, Pop, Rain, Temperature, Wind, WindDirection, Humidityobject[]로 묶어서 반환


 


RssManager


-static string PubDate 속성 : 발표 시각


-static string Category 속성 : 서울특별시 종로구 평창동


-static string Link 속성 : 기상청 사이트 바로가기 링크


http://www.kma.go.kr/weather/forecast/timeseries.jsp?searchType=INTEREST&dongCode=1111056000


public static List<RssFeedData> ReadFeed(string url)


 


4. Form1.cs에 각종 이벤트 핸들러를 추가한다. DongCode, RssManager를 사용함. (20%)


– public List<DoneCode> zoneList = new List<DongCode>();


– public List<RssFeedData> rssFeedList = null;


 


그리고 메소드는 다음을 포함한다.


– private void Form1_Load(object sender, EventArgs e) { … } // LoadZoneData, LoadImageList, ReadRss


– private void button1_Click(object sender, EventArgs e) { … } // Form2.Show()


– private void button2_Click(object sender, EventArgs e) { … } // Form3.ShowDialog()


– private void button3_Click(object sender, EventArgs e) { … } // InternetExplorer호출


private void ReadRss(string rss) // RssManager.ReadFeed를 이용하여 rss를 읽어들여 파싱해서 데이터를 로딩하고 dataGridView1, textBox1, label1를 update


– private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { …} // item을 선택했을 시 해당 동네예보 사이트 정보로 ReadRss()


 


5. 비모달형 대화상자 (Modeless Dialog)Form2.cs에 각종 이벤트 핸들러를 추가한다. (10%)


– private void button1_Click(object sender, EventArgs e) { … } // 메인폼(Form1)zoneList에서 LINQ를 이용하여 textBox1.Text와 같은 것이 있는지 검색하여, DongCode를 찾았으면 linkLabel1.Text에 출력


– private void linkLabel1_LinkClicked(object sender, EventArgs e) { … } // 찾은 동코드를 이용하여 메인폼(Form1)ReadRss를 다시하고 데이터를 업데이트함


 


6. 모달형 대화상자 (Modal Dialog)Form3.cs에 각종 이벤트 핸들러를 추가한다. (10%)


– private void Form3_Load(object sender, EventArgs e) { … } // 호출되면 Form1comboBox1.Items를 이용하여 Form3listBox1.Items에 데이터 추가함


– private void button1_Click(object sender, EventArgs e) { … } // 메인폼(Form1)zoneList에서 LINQ를 이용하여 textBox1.Text와 같은 것이 있는지 검색하여, DongCode를 찾았으면 listBox1에 데이터 추가함


– private void listBox1_DoubleClick(object sender, EventArgs e) { … } // listBox1에 아이템을 선택하여 더블클릭하면 해당 아이템을 삭제함


 


7. 본인이 원하는 기능을 더 추가하고, 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)


결과예시:


 

LINQ 사용하여 검색하기

1. WeatherInfo 리스트에서 LINQ 사용하여 검색하기

public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange(double min, double max)
{
            IList<WeatherInfo> tList = (from w in wList where (w.AverageTemperature >= min && w.AverageTemperature <= max) orderby w select w).ToList();
            return tList;
}


2. WeatherInfo 리스트에서 FindAll과 delegate 사용하여 검색하기

public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange2(double min, double max)
{
            IList<WeatherInfo> tList = wList.FindAll(delegate(WeatherInfo w)
            { return (w.AverageTemperature >= min && w.AverageTemperature <= max); });
            return tList;
}

Import

        // 디렉토리 안에 있는 모든 파일을 읽는다
        public static void Import(string Path, string ext, ref List<WeatherInfo> tList)
        {
            //if (File.Exists(Path))
            if (Directory.Exists(Path))
            {
                Console.WriteLine(Path);
                string[] files = Directory.GetFiles(Path, ext);
                foreach (var file in files)
                    Import(file, ref tList);
            }
        }

       // 개별 파일을 읽는다
        public static void Import(string filename, ref List<WeatherInfo> vList)
        {
               // 파일이 존재하면 읽는다.
        }

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”를 사용하여 디자인하고 솔루션을 빌드하면 컨트롤이 완성