Windows 탐색기에서 다음 파일을 장치의 폴더에 복사합니다.

  1. sqlce.platform.processor.cab

  2. sqlce.dev.platform.processor.cab - 쿼리 분석기 응용 프로그램(선택 사항)

  3. sqlce.repl.platform.processor.cab - 복제 지원(선택 사항)

Featured Video: Use Bing inside a Windows Mobile Application

 


.NET Framework


How Do I: Establish Network Connections with Connection Manager?

(21 Minutes 2 seconds)

How Do I: Convert a .NET Compact Framework DateTime to a Win32 SystemTime Structure?

(9 Minutes 40 seconds)

How Do I: Use Existing COM Objects in .NET Compact Framework Applications?

(33 minutes 14 seconds)

How Do I: Programmatically Determine the Windows Mobile Device Type Using .NET Compact Framework 3.5?

(10 minutes, 31 seconds)


How Do I: Build a .NET Compact Framework 3.5 Application for Windows Mobile 6 Devices?

(10 minutes, 29 seconds)

How Do I: Implement Universal Download Capabilities?

(22 minutes, 4 seconds)

How Do I: Create an E-mail Attachment and Display to a Device for Review?

(20 minutes 48 seconds)

How Do I: Implement a Managed Application Requiring Callbacks from a Native API?

(21 minutes 28 seconds)


How Do I: Create a Desktop Project for Installing CAB Files to a Windows Mobile Device?

(19 minutes 21 seconds)

Data and Services


How Do I: Use Bing inside a Windows Mobile Application?
(28 Minutes 07 seconds)

How Do I: Display Virtual Earth Maps inside a PictureBox Control?
(35 Minutes 28 seconds)

How Do I: Use the MapPoint Web Service on Windows Mobile Devices?
(24 Minutes 40 seconds)

How Do I: Use Custom Extension Methods to Improve the Efficiency of LINQ Queries?
(33 minutes 14 seconds)


How Do I: Work Around LINQ to DataSet Limitations in Visual Basic Device Projects?
(23 minutes, 3 seconds)

How Do I: Efficiently Query a SQL Server Compact Database Using LINQ?
(34 minutes, 33 seconds)

How Do I: Use Windows Communications Foundation to Safely Send Messages to Offline Devices?
(34 minutes, 3 seconds)

How Do I: Maximize Communication Efficiency of SQL Server Compact Edition Data Synchronization?
(26 minutes, 53 seconds)


How Do I: Programmatically Determine Whether a Specific SQL Table Exists?
(15 minutes 40 seconds)

How Do I: Merge Replication for Windows Mobile Device Access? (Part 1)
(12 minutes, 50 seconds)

How Do I: Merge Replication for Windows Mobile Device Access? (Part 2)
(13 minutes, 29 seconds)

How Do I: Improve Data Performance Using Visual Studio 2005?
(17 minutes, 22 seconds)

How Do I: Create Localized Applications on Windows Mobile Devices?
How Do I: Create Localized Applications on Windows Mobile Devices?
(29 minutes, 57 seconds)
How Do I: Use the Virtual Earth Geocode Web Service on Windows Mobile Devices?
How Do I: Use the Virtual Earth Geocode Web Service on Windows Mobile Devices?
(25 minutes, 19 seconds)

Hardware, Performance, and Resource Management


How Do I: Preserve Battery Power When My Application is in the Background?

(11 Minutes 15 seconds)

How Do I: Assure That My Application Code Continues Running When the Device is in Suspended Mode?

(18 minutes 47 seconds)

How Do I: Respond to the Windows Mobile Request to Release Resources?

(29 Minutes 2 seconds)

How Do I: Monitor for an Application to Exit Without Draining the Device Battery?

(35 Minutes 32 seconds)


How Do I: Use the GPS Intermediate Driver to Retrieve Location Information?

(28 Minutes 57 seconds)

How Do I: Use Custom Extension Methods to Improve the Efficiency of LINQ Queries?

(33 minutes 14 seconds)

How Do I: Use the .NET Compact Framework 3.5 Remote Performance Monitor?

(38 minutes, 55 seconds)

How Do I: Detect Managed Memory Leaks Using Remote Performance Monitor?

(16 minutes, 57 seconds)


How Do I: Efficiently Query a SQL Server Compact Database Using LINQ?

(34 minutes, 33 seconds)

How Do I: Use the CLR Profiler to Detect Finalization Problems on My Device?

(30 minutes, 23 seconds)

How Do I: Programmatically Determine the Windows Mobile Device Type Using .NET Compact Framework 3.5?

(10 minutes, 31 seconds)

How Do I: Run One Instance Only of My .NET Compact Framework Application?

(23 minutes, 13 seconds)


How Do I: Maximize Communication Efficiency of SQL Server Compact Edition Data Synchronization?

(26 minutes, 53 seconds)

How Do I: Find the List of Storage Cards Loaded into My Device?

(21 minutes, 46 seconds)

How Do I: Programmatically Monitor for a Specific Time of Day Without Draining a Device Battery?

(39 minutes 53 seconds)

How Do I: Detect and Verify a Network Connection?

(33 minutes, 6 seconds)


How Do I: Detect and Identify a Mobile Device?

(28 minutes 45 seconds)

How Do I: Programmatically Determine If a Device Has a Physical Keyboard Connected?

(16 minutes 22 seconds)

How Do I: Improve Data Performance Using Visual Studio 2005?

(17 minutes, 22 seconds)

How Do I: Devices: Create a superfast starting Managed Windows Mobile application?

(42 minutes, 54 seconds)


How Do I: Use Reflection to Access Private Members in .NET Compact Framework Types?

(43 minutes 08 seconds)

How Do I: Use Windows Mobiles 6.5 Gestures in Managed Code?

(37 minutes 02 seconds)

Multithreaded Programming


How Do I: Use the ThreadPool to Execute Worker Threads?
(15 minutes 21 seconds)

How Do I: Use a Monitor Object for Thread Synchronization?
(13 minutes 18 seconds)

How Do I: Synchronize Multiple Threads?
(18 Minutes 45 seconds)

How Do I: Update User Interface Controls in Multithreaded Applications?
(25 minutes, 33 seconds)


How Do I: Correctly Terminate Multithreaded .NET Compact Framework Applications?
(16 minutes, 47 seconds)

How Do I: Implement a Managed Application Requiring Callbacks from a Native API?
(21 minutes 28 seconds)

Office


How Do I: Update Pocket
Outlook Items Without
Invalid Operation Exceptions?
(21 minutes, 36 seconds)

How Do I: Search the
Pocket Outlook Tasks, Contacts,
and Appointments Folders?
(29 minutes, 37 seconds)

Security and Deployment


How Do I: Use Windows Communications Foundation to Safely Send Messages to Offline Devices?
(34 minutes, 3 seconds)

How Do I: View and Manage the List of Certificates Installed on a Device?
(8 minutes, 49 seconds)

How Do I: Use Visual Studio 2008 Device Security?
(16 minutes, 47 seconds)

How Do I: Ensure My Application Includes Necessary Security Privileges?
(22 minutes 58 seconds)


How Do I: Use Development Test Certificates to Sign an Application?
(15 minutes, 2 seconds)

Testing and Debugging


How Do I: Enable Windows Mobile Device Emulator UDP Support?
(13 Minutes 52 seconds)

How Do I: Successfully Debug Application Code that Establishes a Cellular or Wi-Fi Connection?
(13 Minutes 52 seconds)

How Do I: Attach the Debugger to a .NET Compact Framework Application that is Already Running?
(35 Minutes 32 seconds)

How Do I: Run Smart Device Unit Tests from a Command Prompt?
(10 Minutes 4 seconds)


How Do I: Use The Remote Logging Configuration Tool?
(20 Minutes 29 seconds)

How Do I: Automate the Setup of a Debug and Test Environment That Uses the Cellular Emulator?
(32 minutes, 33 seconds)

How Do I: Use the CLR Profiler to Detect Finalization Problems on My Device?
(30 minutes, 23 seconds)

How Do I: Test Unit Tests for Devices?
(17 minutes, 38 seconds)


How Do I: Build and Run a Unit Test for a Smart Device Application?
(27 minutes, 6 seconds)

How Do I: Upgrade My Mobile Device Projects from Visual Studio 2005 to Visual Studio 2008?
(27 minutes, 53 seconds)

How Do I: Programmatically Control the Configuration of a Running Device Emulator?
(38 minutes, 54 seconds)

How Do I: Use Visual Studio 2008 Device Security?
(16 minutes, 47 seconds)


How Do I: Programmatically Control Device Emulators and the Device Emulator Manager in Visual Studio 2008?
(41 minutes, 46 seconds)

How Do I: Use the Microsoft Hopper Test Tool to Stress Test My Windows Mobile Application?
(18 minutes, 27 seconds)

How Do I: Use Development Test Certificates to Sign an Application?
(15 minutes, 2 seconds)

How Do I: Launch Smartphone Applications from Visual Studio?
(10 minutes 15 seconds)


How Do I: Automate the Device Emulator Configuration for Windows Mobile?
(20 minutes, 30 seconds)

How Do I: Create a Test Server Using the Local Server Framework in the Windows Mobile 6 SDK?
(42 minutes, 23 seconds)

How Do I: Configure the Device Emulator to Use an Emulated Cellular Connection?
(12 minutes 6 seconds)

How Do I: Debug Native Code in a Managed Windows Mobile Application?
(11 minutes, 41 seconds)

User Interface Programming


How Do I: Display a Background Image on a Form?
(12 Minutes 4 seconds)

How Do I: Associate an Application with the Hardware Buttons on a Windows Mobile Device?
(13 Minutes 3 seconds)

How Do I: Create a Process-based Splash Screen Inside a .NET Compact Framework Application?
(44 Minutes 16 seconds)

How Do I: Create a Form-based Splash Screen Inside My .NET Compact Framework Application?
(19 Minutes 13 seconds)


How Do I: Update User Interface Controls in Multithreaded Applications?
(25 minutes, 33 seconds)

How Do I: Monitor and Manage Display Orientation Changes?
(27 minutes 5 seconds)

How Do I: Hide Standard Device UI Elements in a .NET Compact Framework Application?
(22 minutes, 4 seconds)

How Do I: Know if a Combo Box Drop-Down List is Visible in the .NET Compact Framework?
(12 minutes 59 seconds)

How Do I: Create Localized Applications on Windows Mobile Devices?
(29 minutes 57 seconds)

Web Technologies


How Do I: Create a Visual Studio 2005 ASP.NET AJAX Application to Work with Windows Mobile Devices?
(21 minutes, 29 seconds)

How Do I: Send and Receive Short Message Service (SMS) Messages?
(26 minutes, 45 seconds)

How Do I: Download Script Code On-Demand to My Internet Explorer Mobile AJAX Pages?
(19 minutes, 45 seconds)

How Do I: Make Dynamic JavaScript Object Notation Calls From Internet Explorer Mobile?
(37 minutes 30 seconds)


How Do I: Determine Whether a Windows Mobile Device Supports ASP.NET AJAX?
(27 minutes, 56 seconds)

State and Notification Broker


How Do I: Automatically Start an Application on a System State Change?

(17 Minutes 58 seconds)

How Do I: Add User-Defined States?

(19 Minutes 45 seconds)

How Do I: Limit System Notifications to Only Those Containing Specific Data?

(13 minutes 8 seconds)

How Do I: Auto-Start an Application?

(11 minutes 15 seconds)


How Do I: Schedule an Application to Run at a Specific Time?

(12 minutes 6 seconds)

How Do I: Get an Application to Automatically Start When a Mobile Device Wakes Up?

(21 minutes 35 seconds)

PowerToys


How Do I: Use NETCFCFG to Run My Application Against a Specific Version of the .NET Compact Framework?
(29 minutes 09 seconds)

How Do I: Use the .NET Compact Framework 3.5 Remote Performance Monitor?
(38 minutes, 55 seconds)

How Do I: Detect Managed Memory Leaks Using Remote Performance Monitor?
(16 minutes, 57 seconds)

How Do I: Use the CLR Profiler to Detect Finalization Problems on My Device?
(30 minutes, 23 seconds)


How Do I: View and Control a Windows Mobile 5.0 or Windows Mobile 6 Device from My Desktop?
(15 minutes 4 seconds)

프로그램이나 종류수에 비하면 쨉도 안되지만 그래도;;

괜찮은 무료어플이 하나씩 보입니다 ㅋ

웹사이트

https://marketplace.windowsphone.com/Default.aspx

image

 

아래는 모바일에서 실행된 화면

모바일 접속화면

http://mobile.microsoft.com/windowsmobile/ko-kr/downloads/get-marketplace.mspx?l=ko-kr

접속해서  전용 어플 다운로드 받으셔서  사용하면 됩니다.

image

모바일 응용 프로그램에서 데이터 액세스

John Papa

코드 다운로드 위치: DataPoints2008_01.exe (179 KB)
:Track('ctl00_ContentPlaceHolder1_ctl00|ctl00_ContentPlaceHolder1_ctl01',this);" href="http://msdn.microsoft.com/ko-kr/magazine/cc164176.aspx">Browse the Code Online

목차

모바일 개발
시작하기
자동 바인딩
필드 바인딩
모바일 바인딩 옵션
모바일 응용 프로그램 미세 조정
결론

데이터 액세스는 Windows Mobile® 장치를 위한 Microsoft® .NET Compact Framework를 사용하여 응용 프로그램을 개발하는 데 있어 중요한 측면입니다. 기존 아키텍처를 사용하여 모바일 응용 프로그램과 응용 프로그램 서버 간에 데이터를 보내고 받음으로써 DataSet, 사용자 지정 개체 또는 스칼라 값이 있는 데이터를 전달할 수 있습니다.

DataPoints에 대한 이번 칼럼에서는 Smartphone용 모바일 응용 프로그램을 개발할 때의 데이터 액세스 전략을 위한 최상의 방법을 설명하겠습니다. 인터넷을 통해 데이터를 표시하고 저장할 수 있는 데이터 기반 Smartphone 응용 프로그램을 설계하는 방법을 알아보고 DataSet, 사용자 지정 개체 및 엔터티의 generic List<T>를 사용하여 데이터를 가져오기 위한 메서드를 제공하는 서버 응용 프로그램과 통신하는 방법을 살펴보겠습니다.

모바일 개발

모바일 개발을 위한 필수 도구

모바일 응용 프로그램을 개발하려면 먼저 .NET Compact Framework 및 최신 서비스 팩을 설치해야 합니다. 최신 업데이트는 .NET Compact Framework 2.0 SP2입니다. 진행하기 전에 응용 프로그램을 사용하려는 플랫폼(Windows Mobile 5.0 또는 Windows Mobile 6)과 장치를 결정해야 합니다. 이러한 결정에 따라 설치해야 하는 SDK가 달라집니다.

Windows Mobile 5.0 SDK는 대상 장치가 Smartphone인지 Pocket PC인지 또는 Pocket PC Phone인지에 따라 다른 버전으로 제공됩니다. Windows Mobile 6 SDK도 대상 플랫폼에 따라 다른 버전이 제공되는데, 명명 규칙이 변경되었고 사용하기가 조금 더 어려워졌습니다. 그림 1은 다양한 SDK 버전과 각 버전이 대상으로 할 수 있는 장치를 보여 줍니다. 따라서 대상으로 하는 각 장치 종류에 따라 그에 맞는 SDK를 설치해야 합니다.

 

이 기사에서는 Smartphone용 Windows Mobile 5를 사용하여 설명합니다. 그러나 여기에 등장하는 데이터 액세스 개념은 버전에 관계없이 동일하기 때문에 버전은 핵심 사안이 아닙니다.

.NET Compact Framework 2.0 SP2와 적절한 Windows Mobile SDK를 설치한 후에 ActiveSync(Windows® XP용) 또는 Windows Mobile Device Center(Windows Vista®용)도 설치해야 합니다. 이는 모바일 장치 에뮬레이터가 네트워크나 인터넷으로 통신하는 데 필요합니다.

또한 대상으로 하는 장치와 비슷한 에뮬레이터도 다운로드하여 설치해야 합니다. 이 칼럼에서는 320x240 가로 화면을 사용하기로 했습니다. 대상 장치의 화면 크기가 제각각 다른 경우 적절한 모든 에뮬레이터를 사용하여 각 대상 장치에 대해 응용 프로그램을 테스트해야 합니다.

Windows Vista 또는 Windows Mobile 6 SDK를 사용 중인 경우 Device Emulator 2.0을 설치해야 합니다. 준비할 필수 구성 요소가 많기 때문에 다운로드 파일과 MSDN Magazine 웹 사이트(msdn.microsoft.com/msdnmag/issues/08/01/datapoints)에 링크 목록을 넣어 두었습니다.

시작하기

응용 프로그램이 에뮬레이터에서는 잘 작동하지만 장치에서는 작동하지 않는 상황을 방지하기 위해 에뮬레이터와 장치 모두에서 테스트를 수행하는 것이 좋습니다. 필자가 사용하는 방법은 모바일 응용 프로그램을 개발하는 전 과정에 걸쳐 에뮬레이터를 사용하고 특정 검사점마다 응용 프로그램을 실제 모바일 장치에 배포하는 것입니다.

디버깅하기 전에 Visual Studio®의 도구 메뉴에서 장치 에뮬레이터를 실행하십시오. 원하는 에뮬레이터를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다. 그러면 에뮬레이터에서 Smartphone 부팅이 시작됩니다. Smartphone이 에뮬레이터에서 실행되면 다시 장치 관리자에서 해당 항목을 마우스 오른쪽 단추로 클릭하고 크레들에 놓기를 선택합니다. 크레들에 놓으면 에뮬레이터가 네트워크와 통신할 수 있게 됩니다. 마지막으로 Visual Studio의 장치 도구 모음에 있는 드롭다운 목록에서 에뮬레이터를 선택합니다(그림 2 참조).

그림 2 대상 에뮬레이터 선택

샘플 응용 프로그램은 데이터를 가져오기 위해 IIS 웹 서버의 웹 서비스와 통신합니다. 웹 서비스는 DataSet와 같은 ADO.NET 개체와 사용자 지정 엔터티를 모두 전달할 수 있으므로 모바일 응용 프로그램에서 잘 작동합니다. 먼저 웹 서비스 프로젝트를 만들고 CustomerWebService라는 WebService를 추가합니다. 3개의 메서드를 WebService에 추가하고 각각에 WebMethod 특성을 추가합니다.

코드 복사

[WebMethod]
public Customer GetCustomer(string customerID) {
  ...
}

[WebMethod]
public DataSet GetCustomerDataSet(string customerID) {
  ...
}

[WebMethod]
public List<Customer> FindCustomerList() {
  ...
}

GetCustomer 메서드는 사용자 지정 엔티티 형태로 단일 고객 레코드를 검색합니다. GetCustomerDataSet 메서드도 단일 고객 레코드를 가져오지만 이 메서드는 이 고객을 DataSet에 반환합니다. FindCustomerList 메서드는 고객 목록을 가져와 List<Customer>를 반환하므로 고객 엔터티 및 제네릭을 이용합니다. 이 웹 서비스의 전체 코드는 다운로드 가능한 코드에 포함되어 있습니다.

웹 서비스가 만들어지면 Windows Mobile 5.0 Smartphone 응용 프로그램을 솔루션에 추가합니다. Windows Mobile 5.0과 Windows Mobile 6 SDK를 모두 설치한 경우 이 대화 상자에서 대상 응용 프로그램을 선택할 수 있습니다. 이 프로젝트에서는 Windows Mobile 5.0 Smartphone 장치 응용 프로그램을 만듭니다.

Smartphone 응용 프로그램은 드롭다운 목록에 고객 목록을 표시하는 시작 폼을 갖게 됩니다. 사용자는 고객 중 한 명을 선택한 후 다른 페이지에서 해당 고객에 대한 자세한 내용을 볼 수 있습니다. 고객 목록은 웹 서비스의 FindCustomerList 웹 메서드에서 검색되며, 이를 통해 List<Customer>를 폼으로 가져옵니다. 그러면 목록을 드롭다운 목록에 수동 또는 자동으로 바인딩할 수 있습니다. 곧 두 가지 방법 모두 살펴보겠습니다.

자동 바인딩

CustomerPicker 폼은 사용자가 보는 첫 화면입니다. 이 폼에 드롭다운 목록을 추가하고 이름을 ddlCustomer로 지정합니다. 자동 바인딩을 사용하여 FindCustomerList 웹 메서드에서 받을 List<Customer>에 드롭다운 목록을 바인딩하려고 합니다. 프로젝트에 새 데이터 원본을 추가하고 드롭다운 목록을 바인딩하려는 엔터티 유형을 선택합니다. 웹 서비스를 참조하기 때문에 응용 프로그램은 WebMethods가 어떤 엔터티 유형을 반환할지 알고 있습니다. 따라서 엄격한 형식의 엔터티로 드롭다운 목록에 손쉽게 바인딩할 수 있습니다.

데이터 원본 창으로 이동하여 새 데이터 원본 추가를 클릭하면 마법사가 나타납니다. 개체 유형 추가를 선택하고 다음을 클릭한 후 제공된 목록에서 Customer 엔터티를 찾습니다(그림 3 참조). 새 데이터 원본을 추가할 때 목록에 엔터티가 표시되지 않을 경우 먼저 웹 서비스 프로젝트를 성공적으로 컴파일했는지 확인한 다음 다시 돌아와 데이터 원본을 다시 추가해 보십시오. 웹 서비스에 의해 노출된 엔터티는 DLL을 컴파일하기 전에는 목록에 나타나지 않습니다.

0) this.src=small; if (current.indexOf(small) > 0)this.src=large;" alt="" src="http://msdn.microsoft.com/ko-kr/magazine/cc135982.fig03.gif">

그림 3 사용자 지정 데이터 원본 만들기 (더 크게 보려면 이미지를 클릭하십시오.)

데이터 원본이 추가된 후 데이터 원본 창에서 새 Customer 데이터 원본(그림 4 참조)을 드롭다운 목록으로 끌어 놓습니다. 그러면 customerBindingSource라는 폼에 BindingSource 컨트롤이 자동으로 만들어지며 이 컨트롤은 Customer 엔터티에서 컨트롤로 양뱡향 바인딩을 처리합니다.

그림 4 Customer 데이터 원본 사용

에뮬레이터에서 응용 프로그램을 테스트하기 전에 자동 바인딩을 설정하기 위한 단계가 두 가지 더 있습니다. 다음 단계는 드롭다운 목록의 DisplayMember 및 ValueMember 속성을 설정하는 것입니다. DisplayMember 속성을 CompanyName으로, ValueMember 속성을 CustomerID로 설정합니다. 데이터 원본이 엄격한 형식이기 때문에 이러한 값은 드롭다운 목록 컨트롤의 속성 창에 있는 드롭다운 목록에 있습니다.

마지막 단계는 데이터를 가져올 위치를 BindingSource 컨트롤에 알려주는 것입니다. 이 단계는 간단해서 다음과 같이 웹 서비스 프록시 클래스의 인스턴스를 만들고, 적절한 메서드를 호출하고, 반환되는 List<Customer>를 BindingSource 컨트롤의 DataSource 속성으로 설정하기만 하면 됩니다.

코드 복사

private void CustomerPicker_Load(object sender, EventArgs e)
{
    using (RemoteService.CustomerWebService svc = 
                        new RemoteService.CustomerWebService())
        customerBindingSource.DataSource = svc.FindCustomerList();
}

이 시점에서 응용 프로그램을 실행하고 드롭다운 목록에 고객 목록이 표시되는지 테스트할 수 있습니다. 이때에는 Visual Studio에서 대상 장치를 설정했는지, ActiveSync® 또는 Windows Mobile Device Center를 실행 중인지, 그리고 에뮬레이트하는 장치가 크레들에 놓여 있는지(장치 에뮬레이터 관리자 사용) 확인하십시오.

필드 바인딩

CustomerPicker 폼을 만들고 테스트한 후에 CustomerDetail이라는 다른 폼을 만듭니다. 이 폼은 선택된 고객을 표시합니다. 데이터 원본 설정을 변경하여 Customer 데이터 원본을 폼으로 끌어올 때 세부 사항 컨트롤이 만들어지도록 한 다음 데이터 원본 창에 표시되는 속성을 사용자 지정합니다. 그런 후에 컨트롤을 CustomerDetail 폼으로 끌어 놓습니다. 그림 5는 사용자 지정 후의 데이터 원본을 보여 줍니다.

그림 5 사용자 지정된 데이터 원본

이제 웹 서비스의 GetCustomer 웹 메서드에서 선택한 Customer 레코드를 가져와야 합니다. 이전 폼에서 선택한 CustomerID를 사용하고 GetCustomer 웹 메서드를 호출합니다. 그러면 반환된 Customer 엔터티가 CustomerDetail 폼에 있는 customerBindingSource 컨트롤의 데이터 원본으로 설정됩니다. 이제 에뮬레이터에서 응용 프로그램을 다시 테스트하면 그림 6의 화면이 표시됩니다.

그림 6 에뮬레이터에서 실행 중인 응용 프로그램

모바일 바인딩 옵션

모바일 장치 응용 프로그램에서 BindingSource 컨트롤을 사용하여 자동 바인딩을 구현하기는 매우 쉽습니다. BindingNavigator 컨트롤이 없다는 점을 제외하면 Windows Forms 응용 프로그램에서 BindingSource 컨트롤이 작동하는 방식과 비슷하게 작동합니다. 모바일 응용 프로그램에는 BindingNavigator 컨트롤이 없기 때문에 레코드 사이를 탐색하는 기능이 필요한 경우 이를 위한 코드를 직접 작성해야 합니다. 이러한 종류의 기능은 일반적으로 많은 항목이 있는 목록을 검색할 때 사용되기 때문에 필자는 그다지 사용하지 않는 편입니다. 모바일 장치에서는 대개 대역폭이 제한적이므로 이 기능은 모바일 응용 프로그램의 성능에 영향을 미칠 수 있습니다. 따라서 대역폭을 아낄 수 있다는 측면에서 보면 BindingNavigator의 부재가 나쁜 것은 아닙니다.

BindingSource는 엔터티에서 수동으로 값을 가져와 폼에 있는 컨트롤에 채워 넣는 골치 아픈 문제를 해결해 줍니다. 또한 BindingSource는 레코드를 저장할 때 폼의 컨트롤에서 값을 검색하여 다시 엔터티로 끌어오는 번거로움도 없애 줍니다. BindingSource의 단점은 데이터 로드 속도가 데이터를 수동으로 로드할 때보다 약간 느려질 수 있다는 것입니다.

그래도 테스트에서 성능 차이가 크게 나타나지만 않는다면 BindingSource 컨트롤을 사용하는 것이 좋습니다. 필자의 경험으로는 대부분 충분할 정도의 성능이 나왔습니다. BindingSource 컨트롤을 사용할 때 제공되는 자동 바인딩은 동일한 데이터 집합을 여러 컨트롤에 바인딩해야 하는 경우에도 매우 유용합니다.

수동 바인딩으로 변경하는 방법은 간단합니다. BindingSource 컨트롤을 제거하고 폼에서 컨트롤의 데이터 원본 설정을 지우고 엔터티에서 해당 컨트롤로 각 값을 수동으로 로드하는 약간의 코드를 작성하기만 하면 됩니다.

코드 복사

using (RemoteService.CustomerWebService svc = 
  new RemoteService.CustomerWebService()) {
    RemoteService.Customer customer = svc.GetCustomer(_customerID);
    companyNameTextBox.Text = customer.CompanyName;
    customerIDLabel1.Text = customer.CustomerID;
    ...
  }

수동 방식을 사용하는 경우에는 사용자가 데이터를 저장하려고 할 때 컨트롤에서 데이터를 어떻게 추출할지도 고려해야 합니다. 컨트롤에서 값을 구하여 엔터티로 끌어오는 절차는 간단하지만 이는 사용자가 정보를 저장하도록 허용할 경우 여러분이 처리해야 하는 추가 단계입니다. 수동 바인딩에서 일반적으로 사용되는 방법은 컨트롤에서 엔터티로 데이터를 끌어와야 할 때 즉시 액세스할 수 있도록 Customer 엔터티를 CustomerDetail 폼의 개인 필드로 저장하는 것입니다.

모바일 응용 프로그램 미세 조정

대역폭이 제한될 수 있고 모바일 장치의 프로세서는 데스크톱 컴퓨터보다 느리므로 응용 프로그램에 필요한 최소한의 데이터만 전달하는 것이 중요합니다. 샘플 응용 프로그램에서 필자는 Customer 엔터티 목록을 검색했지만 각 엔터티의 속성 중 두 개만 사용했습니다. 모든 고객에 대한 모든 데이터를 가져와야 했기 때문에 이 작업만으로도 CustomerPicker 화면에 사용되는 대역폭이 많이 소모되었습니다.

보다 효율적인 방법은 각 고객에 대한 CustomerID와 CompanyName만 검색하는 메서드를 만드는 것입니다. 데스크톱 응용 프로그램에서는 이와 같은 성능 문제가 눈에 띄지 않을 수 있으므로 모바일 응용 프로그램을 조정할 때에는 이러한 고려 사항을 유념해야 합니다.

결론

모바일 개발에 착수하기에 앞서 적절히 준비하는 것이 중요합니다. 올바른 에뮬레이터 관리자 버전, 적절한 에뮬레이터, 올바른 SDK, 그리고 필요한 ActiveSync 또는 Windows Mobile Device Center 버전을 갖추고 있는지 확인해야 합니다. Windows Vista에서 응용 프로그램을 실행할 때 Windows Mobile Device Center 6.1과 Device Emulator Manager 2를 설치하기 전까지는 에뮬레이터에서 웹 서비스와 통신하지 못합니다. 이 두 가지는 Windows Mobile 5.0을 대상으로 하는 경우라도 Windows Vista에서 실행할 때 반드시 설치해야 하는 중요한 소프트웨어 업데이트입니다.

ActiveSync에서 에뮬레이터를 확인하려고 시도할 때 오류가 발생하는 경우 ActiveSync가 DMA를 통해 통신하도록 설정되었는지 확인하십시오. 웹 서비스에 액세스를 시도할 때 오류가 발생하는 경우에는 웹 서비스가 localhost가 아닌 서버의 이름을 사용하는지 확인하십시오. localhost는 PC에서는 잘 작동하지만 에뮬레이터는 localhost를 중재할 때 localhost가 컴퓨터의 웹 서버를 의미한다는 사실을 알지 못합니다. 또 한가지 유용한 팁은 로컬 PC와 통신할 수 있도록 에뮬레이트하는 장치를 연결하고 크레들에 올려 놓아야 한다는 것입니다.

실제 모바일 장치에 응용 프로그램을 배포하는 방법에 대한 정보가 필요한 경우 필자의 2006년 12월 Data Points 칼럼, "Smartphone에서의 RSS 피드"(msdn.microsoft.com/msdnmag/issues/06/12/DataPoints)를 참조하십시오

http://msdn.microsoft.com/ko-kr/magazine/cc163511.aspx

Data Points

Smartphone에서의 RSS 피드

John Papa

코드 다운로드 위치: DataPoints2006_12.exe (172 KB)
:Track('ctl00_ContentPlaceHolder1_ctl00|ctl00_ContentPlaceHolder1_ctl01',this);" href="http://msdn.microsoft.com/ko-kr/magazine/cc164533.aspx">Browse the Code Online

목차

모바일 기능 개발 준비 작업
뉴스 읽기 응용 프로그램
비동기 피드 요청
DataSet 로드
피드 목록 로드
익명 대리자를 사용한 정렬
WebBrowser 컨트롤을 사용하여 표시
Smartphone에 배포
결론

모바일 응용 프로그램은 다른 응용 프로그램과 거의 비슷합니다. 데이터를 사용하고, 연결을 통해 데이터를 전달하며, 데이터 관리가 필요합니다. 모바일 응용 프로그램이 정교해지면서 이를 개발하기 위한 도구 역시 정교해지고 있습니다. 사실 Microsoft® .NET Compact Framework 2.0으로 데이터 중심 모바일 응용 프로그램을 개발할 때 사용하는 기술은 Windows® Forms 응용 프로그램 개발에 사용되는 기술과 동일한 부분이 많습니다. 개발자는 .NET Compact Framework를 통해 ADO.NET 및 기타 익숙한 라이브러리를 사용하여 모바일 장치의 데이터를 관리할 수 있습니다.

그러나 Smartphone용 응용 프로그램을 개발할 때는 작은 화면 크기를 감안하는 등 새로운 수준의 디자인을 고려해야 합니다. 이러한 응용 프로그램은 데이터 송수신 기능 덕분에 웹 서버와 통신하는 응용 프로그램을 호스팅하는 경우가 많으므로 기본 제공되는 인터넷 연결도 응용 프로그램 디자인에 영향을 줍니다.

이번 달에는 RSS 피드를 읽고 이를 ADO.NET DataSet으로 로드하는 Windows Mobile® 5.0 응용 프로그램을 작성하는 방법을 설명하겠습니다. 먼저 URL에서 RSS 피드를 비동기적으로 요청하는 방법을 설명한 다음 RSS 피드를 읽는 방법, 그리고 이를 DataSet으로 로드하는 방법을 살펴보겠습니다. 다음으로 DataSet의 계층 구조를 탐색하여 각 피드 항목을 포함하는 적절한 데이터를 찾는 방법을 알아보고 익명 대리자를 사용하여 데이터를 정렬하는 방법, ADO.NET을 사용하여 RSS 데이터에 필드가 있는지 확인하는 방법, 그리고 WebBrowser 컨트롤을 사용하여 URL을 탐색하거나 HTML을 표시하는 방법을 설명합니다. 마지막으로 CAB 프로젝트를 사용하여 응용 프로그램을 모바일 장치로 배포하는 방법을 알아보는 것으로 이번 달 칼럼을 마치겠습니다. 이 샘플 응용 프로그램의 전체 소스 코드는 MSDN®Magazine 웹 사이트에서 제공됩니다.

모바일 기능 개발 준비 작업

.NET Compact Framework 2.0과 Visual Studio® 2005를 사용하여 모바일 응용 프로그램을 개발하는 작업은 ASP.NET 또는 Windows Forms 응용 프로그램을 개발하는 작업과 많은 부분 유사합니다. 그러나 코드 작성을 시작하기 전에 몇 가지 준비해야 할 것이 있습니다. Visual Studio 2005는 물론 다음과 같은 항목이 설치되어 있어야 합니다. 필요한 경우 Microsoft 웹 사이트에서 다운로드하십시오.

개발 과정에서 실제 Smartphone 장치 대신 에뮬레이터를 사용할 계획이라도 ActiveSync® 최신 버전을 설치해야 합니다. ActiveSync®는 응용 프로그램을 에뮬레이터에 배포하는 작업, 에뮬레이터를 인터넷에 연결하는 작업 등에 사용됩니다. Windows Mobile SDK 5.0 for Smartphone은 Visual Studio 2005에 Smartphone 개발 전용의 몇 가지 프로젝트 유형을 추가합니다(Pocket PC 개발용 SDK도 있음). 마지막으로, 대상 장치와 가장 비슷한 에뮬레이터를 설치해야 합니다. 필자의 응용 프로그램은 320×240 가로 화면을 가진 Smartphone 장치를 대상으로 합니다.

에뮬레이터에 대해 한마디 덧붙이자면, 사용 중인 모바일 장치가 있는 경우에는 전적으로 에뮬레이터에 의존하기보다는 해당 장치에서 응용 프로그램을 테스트하는 것이 더 좋습니다. 에뮬레이터는 훌륭한 도구이지만 최선의 테스트 방법은 실제 장치에서 응용 프로그램을 실행하는 것입니다. 필자는 모바일 응용 프로그램을 개발할 때 에뮬레이터를 사용하지만 특정 검사점마다 실제 장치에 응용 프로그램을 배포하여 두 환경 모두에서 아무 문제 없이 실행되는지 확인합니다.

코드를 실행하기 전에 Visual Studio의 도구 메뉴에서 장치 에뮬레이터 관리자를 시작해야 합니다. 그러면 사용 가능한 에뮬레이터 목록이 표시됩니다. 320×240 (Landscape) Windows Mobile 5.0 Smartphone Emulator를 선택합니다. 이 옵션을 다운로드하지 않은 경우 다른 Windows Mobile 5.0 Smartphone 에뮬레이터를 대신 사용할 수 있습니다. 이 칼럼의 코드는 320×240 가로 화면을 기준으로 작성되었지만 다른 해상도에 맞게 손쉽게 수정할 수 있습니다.

선택한 에뮬레이터를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다. 그러면 에뮬레이터에서 Smartphone 부팅이 시작됩니다. Smartphone이 에뮬레이터에서 실행되면 다시 장치 관리자에서 해당 항목을 마우스 오른쪽 단추로 클릭하고 크레들에 놓기를 선택합니다. 에뮬레이터의 Smartphone을 크레들에 놓으면 Smartphone이 ActiveSync와 통신하여 네트워크에 연결하고 이를 통해 인터넷에 액세스하여 RSS 피드를 받을 수 있습니다. 마지막으로 Visual Studio의 장치 도구 모음에 있는 드롭다운 목록에서 320×240 에뮬레이터를 선택합니다. 이렇게 하면 Visual Studio에서 디버그 및 배포 시에 사용할 에뮬레이터 이미지가 지정됩니다.

뉴스 읽기 응용 프로그램

코드를 살펴보기 전에 응용 프로그램이 어떤 작업을 수행하는지 전체적으로 살펴보겠습니다. 응용 프로그램이 실행되면 각 해당 웹 사이트에 비동기적으로 RSS 피드를 요청하고 ListView 컨트롤을 로드합니다. ListView 컨트롤은 각 피드의 제목 및 각 피드가 반환하는 항목의 수를 제공합니다(그림 1 참조).

그림 1 RSS 피드 목록

그림 2 피드 항목 목록

그림 3 항목 설명

피드를 선택한 다음 Smartphone 중앙에 있는 Enter 소프트 키를 클릭하거나 Menu | Select를 선택하면 선택한 피드의 항목 목록이 다른 양식의 목록 보기에 최신 항목이 가장 위에 오도록 정렬되어 표시됩니다. RSS 피드에 항목의 게시 날짜(RSS 스키마의 선택적인 요소)가 포함되어 있는 경우 목록 보기의 두 번째 열에 표시됩니다(그림 2 참조). 게시 날짜가 없으면 두 번째 열은 생략되고 항목의 제목만 표시됩니다.

항목을 선택하면 다른 화면에 해당 항목에 대한 설명이 표시됩니다. 항목의 설명 요소에 있는 내용은 WebBrowser 컨트롤에 표시됩니다(그림 3 참조).

항목 설명은 RSS 피드에서 설명 요소를 읽으므로 하이퍼링크나 이미지를 포함할 수도 있습니다. URL이 포함된 경우 URL을 클릭하면 해당 주소로 이동할 수 있습니다. 항목 설명 화면에서 소프트 키로 Select 메뉴 항목을 클릭하면 화면이 전환되고 선택한 항목의 URL로 이동하며 해당 게시물 전체를 볼 수 있도록 WebBrowser 컨트롤에 내용이 로드됩니다. 사용자는 언제든지 Back 소프트 키를 클릭하여 이전 화면으로 돌아갈 수 있습니다. Feed Item List 화면에서 Left 소프트 키를 사용하여 메뉴에서 Done을 선택하면 응용 프로그램을 종료할 수 있습니다.

이 응용 프로그램은 이러한 종류의 응용 프로그램에 필요한 기본적인 기능을 보여 줍니다. 응용 프로그램을 더욱 정교하게 만들려면 진행률 표시줄, 아이콘, 피드 목록 관리 기능과 같은 추가 기능을 포함할 수 있습니다. 코드를 다운로드하여 자신만의 기능을 추가해 보십시오.

비동기 피드 요청

지금까지 응용 프로그램의 동작 방식은 살펴보았습니다. 이제부터는 코드를 세부적으로 분석해 보겠습니다. 응용 프로그램이 로드되면 먼저 BeginScanFeeds 메서드를 호출하여 등록된 URL을 반복하여 각 URL에 대한 피드를 요청하는 방식으로 RSS 피드 3개를 요청합니다. 코드를 간단히 하기 위해 여기에서는 이러한 URL을 List<string>에 하드코딩했습니다.

코드 복사

   List<string> urlList = new List<string>();
   urlList.Add(
     "http://msdn.microsoft.com/msdnmag/rss/        rss.aspx?Sub=Data+Points");
   urlList.Add("http://blogs.msdn.com/MainFeed.aspx");
   urlList.Add("http://blogs.technet.com/MainFeed.aspx");

   ClearList();
   foreach (string url in urlList) BeginScanFeeds(url);
 

BeginScanFeeds 메서드는 지정한 URL에 대한 HttpWebRequest 클래스 인스턴스를 생성합니다. 그러면 HttpWebRequest의 BeginGetResponse 메서드를 통해 지정된 URL에 대한 요청이 비동기적으로 생성됩니다. 이 메서드는 비동기 콜백 대리자(이 경우 EndScanFeeds 메서드) 및 요청을 받습니다.

코드 복사

   public void BeginScanFeeds(string url)
   {
       HttpWebRequest request = 
          (HttpWebRequest)WebRequest.Create(url);
       IAsyncResult asyncResult = request.BeginGetResponse(
           new AsyncCallback(EndScanFeeds), request);
   }
   

각 요청이 전송되며 응답이 반환되면 EndScanFeeds 메서드가 호출됩니다. EndScanFeeds 메서드는 IAsyncResult 형식의 단일 인수를 가지며 피드를 검색하는 데 이 인수를 사용할 수 있습니다. 그림 4는 StreamReader 개체를 사용하여 결과 HttpWebResponse 개체에서 feedData라는 문자열로 응답을 보내는 이 메서드 코드의 일부를 보여 줍니다. feedData 문자열은 RSS 피드의 XML을 포함하며 LoadFeedList 메서드로 전달됩니다. 이 메서드는 피드 데이터를 ListView 컨트롤에 로드합니다. 피드 읽기가 비동기적으로 수행되고 LoadFeedList 메서드는 ListView 컨트롤에 액세스하므로 이 메서드는 Control.Invoke 메서드를 사용하여 호출해야 합니다.

Figure 4 피드 읽기

코드 복사

public void EndScanFeeds(IAsyncResult result)
{
    string feedData;
    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
    using(HttpWebResponse response = 
        (HttpWebResponse)request.EndGetResponse(result))
    using(StreamReader streamReader = 
        new StreamReader(response.GetResponseStream()))
    {
        feedData = streamReader.ReadToEnd();
    }

    Invoke(new LoadFeedListDelegate(LoadFeedList), feedData);
}

DataSet 로드

피드를 가져온 다음에는 해당 피드의 내용을 구문 분석해야 합니다. XML 문자열을 읽는 방법에는 여러 가지가 있지만 여기에서는 다음 코드를 사용하여 DataSet으로 데이터를 로드하는 방법을 사용했습니다.

코드 복사

   DataSet ds = new DataSet();
   XmlTextReader xmlRdr = 
      new XmlTextReader(new StringReader(rssXmlData));
   ds.ReadXml(xmlRdr);

이 방법을 선택한 이유는 열의 존재 여부를 확인하고 RSS 피드의 계층 구조를 탐색하는 기능을 사용할 수 있기 때문입니다.

피드 내용을 StringReader 개체로 로드한 다음 이 개체를 사용하여 XmlTextReader를 만듭니다. 그런 다음 피드의 내용을 DataSet으로 로드하는 DataSet의 ReadXml 메서드로 XmlTextReader를 읽습니다. RSS 스키마의 계층 구조에는 RSS, 채널, 항목의 세 가지 주 요소가 있습니다. 일부 스키마의 경우 이미지 요소와 같은 추가 요소를 포함하기도 합니다.

RSS 요소는 하나 이상의 채널 요소를 포함하는 RSS 피드의 루트입니다. 채널 요소는 피드를 나타내며, 제목, 링크, 설명, 항목 등 피드를 설명하는 일련의 자식 요소를 포함할 수 있습니다. 항목 요소는 채널 요소의 필수 자식 요소입니다(이 항목은 주 항목 요소와는 별개임). 항목 요소는 피드의 각 항목을 나타냅니다. 예를 들어 MSDN Blog에서 채널은 MSDN Blog를, 항목은 게시물을 나타냅니다.

RSS 피드가 DataSet으로 로드될 때 주 요소(RSS, 채널, 항목)는 테이블로 로드됩니다. 계층 구조의 각 수준은 DataTable이 되며 DataTable의 기능을 사용하여 이러한 수준을 읽고 탐색할 수 있습니다. 각 주 요소를 설명하는 간단한 자식 요소는 해당 DataTable에 열로 로드됩니다. 예를 들어 채널 DataTable에는 항목, 설명, 링크 요소(이 세 가지 요소는 모두 필수임)에 대한 DataColumn이 포함됩니다.

마지막으로 DataTable 채널과 채널에 0개 이상의 항목이 어떻게 포함되는지를 나타내는 DataTable 항목 간에 DataRelation이 생성됩니다. 필자는 이 관계를 활용하여 사용자가 특정 피드를 선택할 때 응용 프로그램에서 특정 채널의 항목을 찾을 수 있도록 했습니다.

피드 목록 로드

피드가 DataSet으로 로드된 다음에는 채널 테이블을 찾아 채널의 제목과 각 채널에 포함된 항목의 수를 확인했습니다. 이 정보를 배열에 저장하고 피드를 수신할 때 이를 목록 보기로 로드합니다(그림 5 참조).

Figure 5 피드 목록 로드

코드 복사

foreach (DataRow channelRow in ds.Tables["channel"].Rows)
{
    string title = channelRow["title"].ToString();
    int itemCount = int.Parse(channelRow.GetChildRows(
        "channel_item").Length.ToString());

    string[] displayInfo = new string[2];
    displayInfo[0] = title;
    displayInfo[1] = itemCount.ToString();
    
    ListViewItem item = new ListViewItem(displayInfo); 
    item.Tag = channelRow;
    lvFeed.Items.Add(item); 
}

채널의 제목은 DataRow 열에서 값을 읽는 표준 ADO.NET 구문으로 액세스합니다. 각 채널의 총 항목 수를 얻기 위해 DataRow의 GetChildRows 메서드를 사용하여 현재 채널 행의 항목에 대한 DataRow 개체 배열을 반환하도록 했습니다. GetChildRows 메서드는 DataRelation의 이름을 받습니다. DataRelation은 기본적으로 DataTable 채널 이름과 DataTable 항목 이름을 밑줄로 연결한 형식입니다. ListViewItem의 태그에 채널의 DataRow에 대한 참조를 저장한 것을 볼 수 있습니다. 이렇게 하면 사용자가 특정 피드를 선택할 때 피드의 정보를 쉽게 가져올 수 있습니다.

익명 대리자를 사용한 정렬

사용자가 피드를 선택하면 DataRow가 FeedItemList 폼으로 전달되며 이 폼은 항목의 목록을 ListView 컨트롤에 로드합니다. 항목의 제목과 함께 게시 날짜(제공되는 경우)도 로드합니다. pubDate 요소는 RSS 2.0 스키마에서 필수 요소가 아니므로 먼저 항목 DataTable에 열이 있는지 여부를 확인합니다. 피드의 항목을 나타내는 DataRow 개체 배열이 있으므로 이를 사용하여 DataRow의 DataTable 개체를 찾은 다음 DataTable.Columns.Contains 메서드를 사용하여 pubDate 열이 있는지 여부를 확인할 수 있습니다. 복잡하게 보이지만 다음과 같이 코드는 매우 간단합니다.

코드 복사

bool containsPubDate = (itemRows[0].Table.Columns.Contains("pubDate"));

pubDate의 존재 여부를 확인한 다음에는 목록 보기에서 항목을 어떻게 정렬 및 표시할지 결정할 수 있습니다. pubDate가 있으면 항목을 날짜별 내림차순으로 정렬하며 pubDate가 없으면 항목을 제목별로 정렬하고 목록 보기에서 게시 날짜 열을 숨깁니다.

pubDate가 있으면 다음 코드가 실행됩니다.

코드 복사

colNewsItemName.Width = 170;
colPubDate.Width = 140;

Array.Sort(itemRows, delegate(DataRow row1, DataRow row2)
{
    DateTime pubDate1 = ParseDateTime(row1["pubDate"].ToString());
    DateTime pubDate2 = ParseDateTime(row2["pubDate"].ToString());
    return pubDate2.CompareTo(pubDate1);
});

이 코드는 항목의 제목과 게시 날짜가 모두 표시하도록 열의 너비를 설정합니다. 그런 다음 Array.Sort 메서드를 사용하여 DataRow 개체 배열을 정렬합니다. 날짜를 정렬하려면 먼저 날짜를 유효한 DateTime으로 변환해야 합니다. 변환한 다음 사용자 지정 비교 대리자를 사용하여 DataRow 배열을 정렬합니다.

사용자 지정 비교 대리자는 간편하고 뛰어난 정렬 루틴 코딩 방법입니다. 정렬을 처리하는 명시적인 루틴을 만들 수도 있지만 코드 줄 수를 최소화하는 데는 사용자 지정 비교 대리자가 좋은 선택입니다. 배열의 각 요소 비교에 대해 날짜 비교가 실행됩니다. 이 예에서는 두 DataRow 개체를 받아 pubDate 열의 값을 계산하여 비교하는 익명 대리자를 만듭니다.

pubDate 열이 없으면 목록 보기에서 두 번째 열을 숨기고 첫 번째 열을 화면 너비에 맞게 확장합니다. 그런 다음 DataRow 배열을 항목 제목별 오름차순으로 정렬합니다. 이번에는 문자열 값을 비교한다는 점을 제외하면 사용된 기법은 동일합니다.

코드 복사

colNewsItemName.Width = 310;
colPubDate.Width = 0;

Array.Sort(itemRows, delegate(DataRow row1, DataRow row2)
{
    return row1["title"].ToString().CompareTo(row2["title"].ToString());
});

비교자 기능을 재사용할 필요가 없는 경우 무명 메서드는 코드의 양을 줄일 수 있는 유용한 방법입니다.

DataRow 배열을 정렬한 다음에는 그림 6과 같이 항목을 반복하면서 제목과 pubDate(있는 경우)를 가져옵니다. pubDate가 있으면 적절히 서식을 지정하고 제목과 pubDate를 문자열 배열로 로드한 다음 이를 사용하여 목록 보기를 로드합니다. 이 시점에서 목록은 그림 2와 같이 표시됩니다.

Figure 6 항목 목록 로드

코드 복사

foreach (DataRow itemRow in itemRows)
{
    string title = itemRow["title"].ToString();
    string[] displayInfo = new string[2];
    displayInfo[0] = title;
    if (containsPubDate)
    {
        string pubDateString = 
            itemRow.Table.Columns.Contains("pubDate") ? 
                itemRow["pubDate"].ToString() : string.Empty;
        DateTime pubDate = ParseDateTime(pubDateString);
        displayInfo[1] = pubDate.ToString("MM/dd/yyyy HH:mm");
    }

    ListViewItem item = new ListViewItem(displayInfo);
    item.Tag = itemRow;
    lvFeed.Items.Add(item);
}

WebBrowser 컨트롤을 사용하여 표시

사용자가 항목을 선택하면 선택한 ListViewItem을 검사하고 해당 Tag 속성에서 선택한 항목의 DataRow를 가져옵니다. 선택한 항목을 포함하는 DataRow는 선택한 항목의 설명을 표시하는 ItemSummary 폼의 생성자로 전달됩니다. 필자는 설명을 표시하는 데 레이블 컨트롤을 사용하지 않았는데 이것은 RSS 피드의 항목 설명에 포함된 HTML이 있는 경우가 많기 때문입니다. 따라서 WebBrowser 컨트롤을 사용하여 설명을 표시했습니다.

그림 3은 WebBrowser 컨트롤에서 항목 설명의 요약을 보여 줍니다. 요약 설명에 하이퍼링크 및 기타 HTML 요소가 포함된 것을 볼 수 있습니다. HTML을 렌더링하기 위해 필자는 다음과 같이 WebBrowser 컨트롤의 DocumentText 속성을 항목의 설명으로, 폼의 Text 속성을 항목의 제목으로 설정했습니다.

코드 복사

this.Text = itemRow["title"].ToString();
webSummary.DocumentText = itemRow["description"].ToString();

이 응용 프로그램에서 WebBrowser 컨트롤은 두 가지 목적으로 사용됩니다. ItemSummary 폼에서는 이 컨트롤을 사용하여 HTML을 포함하거나 포함하지 않은 항목의 설명을 표시하며 항목의 DataRow에 지정된 링크로 이동하는 Item 폼에서도 이 컨트롤을 사용합니다. 다음은 WebBrowser 컨트롤을 사용하는 좀 더 일반적인 방법입니다.

코드 복사

this.Text = itemRow["title"].ToString();
webItem.Navigate(new Uri(itemRow["link"].ToString()));

여기에서 Item 폼의 제목을 항목의 제목으로 설정하고 WebBrowser 컨트롤에서 Navigate 메서드를 사용하여 항목의 URL로 이동합니다. 링크의 위치를 찾은 다음에는 페이지가 WebBrowser 컨트롤에 로드됩니다.

Smartphone에 배포

응용 프로그램을 빌드한 다음에는 실제 Smartphone 장치에 배포해야 합니다. 이 시점에서 필자는 Smartphone으로 배포하는 과정을 전체적으로 테스트하기 위해 보통 에뮬레이터 창과 장치 에뮬레이터 관리자를 종료합니다.

응용 프로그램 배포에서 몇 가지 알아야 할 사항이 있습니다. 먼저 Smartphone Device CAB 프로젝트를 만들고 이를 현재 솔루션에 추가해야 합니다. 또한 .NET Compact Framework 2.0을 사용하여 작성한 응용 프로그램을 실행하려면 모바일 장치에 .NET Compact Framework 2.0이 설치되어 있어야 합니다. 이 두 가지 단계를 처리한 다음에는 CAB 파일을 모바일 장치에 복사하고 응용 프로그램을 직접 설치할 수 있습니다.

필자는 MSDN200611로 명명된 CAB 프로젝트를 만들고 콘텐츠 파일과 기본 출력을 추가했습니다. 콘텐츠 파일은 필자가 Smartphone 장치 응용 프로그램에서 사용한 아이콘 파일을 가져옵니다. 기본 출력에 대한 바로 가기를 만들고 CAB 파일 프로젝트에 Start Menu 폴더를 추가한 다음 Start Menu 폴더에 바로 가기를 끌어서 놓습니다. 이렇게 하면 Smartphone의 Start Menu에 있는 응용 프로그램 목록에 해당 응용 프로그램이 추가됩니다. 또한 바로 가기 이름을 좀 더 친숙하고 짧은 이름으로 변경했습니다.

결론

.NET Compact Framework 2.0으로 데이터 중심 모바일 응용 프로그램을 개발할 때 사용하는 기술은 Windows Forms 응용 프로그램 개발에 사용하는 기술과 많은 부분 동일합니다. 이번 달에는 ADO.NET을 사용하여 RSS 피드를 로드하고 피드 및 해당 항목을 탐색하며 RSS 정보의 존재 여부를 확인하는 방법에 대해 알아보았습니다. 무명 메서드 및 비동기 호출도 개발에 도움이 되었지만 이 응용 프로그램의 핵심은 여전히 RSS 피드, DataSet, DataRow 개체 배열 또는 항목 설명에 대한 WebBrowser 컨트롤에 렌더링되는 HTML 중 어떤 것이든지 데이터 자체입니다

.NET Compact Framework 3.5 재배포 가능 패키지

Microsoft® .NET Compact Framework 3.5 재배포 가능 패키지에는 .NET Compact Framework 1.0, 2.0 및 3.5 응용 프로그램을 테스트하는 데 필요한 모든 기능이 포함되어 있습니다.

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=e3821449-3c6b-42f1-9fd9-0041345b3385

위에 경로의 프로그램을 설치하고 나면

아래의 경로에 모바일용 닷넷프레임워크 인스톨 파일이 들어있습니다.

C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE

 

image

SQL Server Compact Edition 사용 했을때 오류 해결방법 및 SQLServerCompact 3.5 설치

*비주얼스튜디오 2008와 SQLServerCompact 3.5로 개발했으며 옴니아에서 테스트 하였습니다.

 

오류화면

위의 오류는 와 SQLServerCompact 3.5 사용했는데 스마트폰에 System.Data.SqlServerCe 파일이 참조가 안되 있어서 나는 오류입니다.

 

해결방법

 

실제로 빌드 했을 때 System.Data.SqlServerCe.dll 이 파일도 함께 복사를 하셔야 합니다.

로컬복사 False 를 True로 주시면 빌드 될 때 참조한dll도 같이 복사됩니다.

 

요렇게 했는데도 아래와 같이 오류가 난다면..스마트폰에 SQLServerCompact 3.5가 설치 안되어져 있는겁니다.

 

 

설치파일경로

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i
안의 파일설치

기본적으로 Core만 설치해도 돌아가는걸로 알고 있습니다.

sqlce.dev.KO.ppc.wce5.armv4i.CAB 깔면 스마트폰에서 SQLServerCompact 3.5 데이터 쿼리조회도 가능합니다.

 

제 핸드폰은 옴니아라서 ppc 만 설치해줬습니다

-sqlce.dev.KO.ppc.wce5.armv4i.CAB

-sqlce.ppc.wce5.armv4i.CAB

-sqlce.repl.ppc.wce5.armv4i.CAB

 

 

윈폼이나 asp.net 에서는 간단하게 dataview 등을 이용하면 간단( sort 이용)하게 정렬되는데

모바일에서는 DataView는 사용 되긴 되는데 정렬이 안된다 (나만그런가???)

그래서 허접하게 BindingSource 컨트롤을 사용해서 정렬했습니다.

 

        /// <summary>
        /// 무작위로 들어간 숫자를 정렬해줌
        /// </summary>
        /// <param name="_s"></param>
        /// <returns></returns>
        public static string[] SortedNumbers( string[] s){
           string[] ReloadNumbers = new string[8];

           
            DataTable dt = new DataTable("TempNumbers");
            dt.Columns.Add("NN", typeof(int));
            for (int i = 1; i < s.Length-1;i++)
            {
                DataRow row = dt.NewRow();
                row["NN"] = s[i];
                dt.Rows.Add(row);
            }
            BindingSource bs = new BindingSource();
            bs.DataSource = dt;
            
            bs.Sort = "NN asc ";

            IEnumerator ie = bs.GetEnumerator() as IEnumerator;

            ReloadNumbers[0] = s[0];
            int row_cnt = 1;
            while(ie.MoveNext()){

                DataRowView dv = ie.Current as DataRowView;
                string ss=  dv["NN"].ToString();
                ReloadNumbers[row_cnt] = ss;
                row_cnt++;
            }
            ReloadNumbers[7] = s[7];

            return ReloadNumbers;
        }

스마트 장치 개발

스마트 장치 개발 작업 절차

업데이트: 2007년 11월

Visual Studio에서는 Pocket PC, Smartphone 등의 Windows CE 및 Windows Mobile 기반 스마트 장치에서 실행되는 소프트웨어를 개발할 수 있도록 통합된 지원을 제공합니다. Visual C# 또는 Visual Basic을 사용하여 .NET Compact Framework에서 실행되는 관리되는 응용 프로그램을 작성하거나 Visual C++를 사용하여 네이티브 응용 프로그램을 작성할 수 있습니다. 어떤 언어를 선택하든지 데스크톱 응용 프로그램을 개발할 때와 같은 코드 편집기, 디자이너 및 디버거 인터페이스를 사용합니다. 선택한 언어에 사용할 수 있는 스마트 장치 프로젝트 템플릿 중 하나를 선택한 다음 코딩을 시작하기만 하면 됩니다.

또한 Visual Studio에서는 에뮬레이터를 제공하므로 실제 장치가 없어도 개발 컴퓨터에서 코드를 실행하고 디버그할 수 있습니다.

장치 연결(스마트 장치 작업 절차)

가상 PC 세션, DMA, Bluetooth, ActiveSync 없음, 문제 해결 등

Visual Basic 및 Visual C#(스마트 장치 작업 절차)

프로젝트 만들기, 소스 공유, 플랫폼 변경, 코드 조각, 기본 대상 변경 등

Visual C++(스마트 장치 작업 절차)

C++ 장치 프로젝트 만들기, eMbedded Visual C++ 마이그레이션, SQL Server Compact 3.5 추가, 다중 플랫폼 솔루션 개발, MFC ActiveX 호스트 만들기 등

디버깅(스마트 장치 작업 절차)

프로세스에 연결, 혼합 솔루션 디버깅, 장치 레지스트리 변경 등

데이터(스마트 장치 작업 절차)

데이터베이스 만들기 및 관리, 프로젝트에 데이터 소스 추가, 쿼리 작성, 마스터-세부 관계 처리, 결과 집합 또는 데이터 집합 생성 등

패키징(스마트 장치 작업 절차)

CAB 프로젝트 만들기, 바로 가기 만들기, 장치 레지스트리 편집 등

보안(스마트 장치 개발 작업 절차)

인증서 가져오기, 보안 모델 쿼리, 파일 서명, 제공 장치 등

테스트 도구(스마트 장치 작업 절차)

단위 테스트 만들기, 테스트 디버깅 등

 

출처 : http://msdn.microsoft.com/ko-kr/library/ms184401.aspx

+ Recent posts