종로구 가회동 동네예보 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”를 사용하여 디자인하고 솔루션을 빌드하면 컨트롤이 완성

Just another Kyoung Shin Park’s Lectures Sites site