データを保存し表示した電話番号に電話する

2011年10月28日(金)
PROJECT KySS

サーバーからperonalInfo.xmlを読み込み、その内容を表示する

新しいWebClientのインスタンスmyWebClient2オブジェクトを生成します。WebClientクラスは、データの送受信用のメソッドを提供するクラスです。
String またはUriとして指定したリソースをダウンロードする、DownloadStringAsyncメソッドで、サーバー上のpersonalInfo.xmlをダウンロードします。引数に現在の時間、分、秒を指定して、最新のXMLデータをダウンロードします。
AddHandlerステートメントで、非同期のリソース ダウンロード操作の完了時に発生する、DwonloadStringCompletedイベントに、イベントハンドラを追加します。ダウンロードでエラーが発生した場合はメッセージを表示します。それ以外は、XElement.Parseメソッドでダウンロードした結果(resultArgs2.Result)を読み込みます。
personalInfoクラス型の新しいリストであるmyPersonalInfoオブジェクトを作成します。Descendants メソッドで、子孫要素である全ての <情報> 要素のコレクションに対して、各要素を変数 result に格納しながら、personalInfo クラスの「氏名」、「電話」プロパティに、<氏名>、<電話>要素の内容テキストを指定し、AddメソッドでmyPersonalInfoオブジェクトに追加していきます。2ページ目に配置したListBox(dataListBox)のItemsSourceにmyPersonalInfoオブジェクトを指定します。保存した「氏名」と「電話」の一覧が表示されます。
  Private Sub DownloadXmlData()
    Dim myWebClient2 As New WebClient
    AddHandler myWebClient2.DownloadStringCompleted, Sub(resultSender2 As Object, resultArgs2 As DownloadStringCompletedEventArgs)
              If resultArgs2.Error Is Nothing = False Then
                MessageBox.Show("XMLファイルが見つかりません")
                Exit Sub
              Else
                Dim myDoc As XElement = XElement.Parse(resultArgs2.Result)
                Dim myPersonalInfo As New List(Of personalInfo)
                For Each result In From c In myDoc.Descendants("情報") Select c
                  With myPersonalInfo
                    .Add(New personalInfo With {.氏名 = result.Element("氏名").Value,
                                                .電話 = result.Element("電話").Value})
                  End With
                Next
                  dataListBox.ItemsSource = myPersonalInfo
                End If
              End Sub
 
            myWebClient2.DownloadStringAsync(New Uri(String.Format("サーバーのURI/Telephone_NET/SaveData/personalInfo.xml?myTime={0}", DateTime.Now.ToLongTimeString), UriKind.Absolute))
  End Sub

「氏名」、「電話」の一覧から、任意の項目を選択した時の処理

新しいPhoneCallTaskのインスタンス、phoneTaskオブジェクトを生成します。
DirectCastでdataListBoxより選択された項目を、personalInfoクラスにキャストして「電話」プロパティの値を取得して、変数telNumberに格納します。 
phoneTaskオブジェクトのDisplayNameプロパティに、telNumberに格納されている電話番号を指定します。  DisplayNameプロパティは、Phoneアプリケーションが起動した時に表示される名前(ここでは電話番号)を指定できます。
また、 PhoneNumberプロパティにも、変数telNumberに格納されている電話番号を指定します。 
Showメソッドでタスクを実行します。
  Private Sub dataListBox_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles dataListBox.SelectionChanged
    Dim phoneTask As New PhoneCallTask
    Dim telNumber As String = DirectCast(dataListBox.SelectedItem, personalInfo).電話
    With phoneTask
      .DisplayName = telNumber & "に電話します。"
      .PhoneNumber = telNumber
      .Show()
    End With
  End Sub

ASP.NETページの作成(Telephone_NET)

VS2010のメニューから、「ファイル(F)/新規作成(N)/Webサイト(W)」と選択し、表示される画面から「ASP.NET Webサイト」を選択します。「webの場所(L)」に今回は「フォルダー名\Telephone_NET」と指定し[OK]ボタンをクリックします。

ソリューションエクスプローラー内にSaveDataというフォルダーを作成し、個人情報>というルート要素だけのpersonalInfo.xmlを作成しておきます。

ソリューションエクスプローラー内のDefault.aspxを展開して表示される、Default.aspx.vbにリスト3のコードを記述します。
※このコードをサーバーに配置した際の、アクセス権の設定やIISの設定は各自が行ってください。

ロジックコードを記述する

リスト3 (Default.aspx.vb)

Option Strict On
Imports System.IO
Partial Class _Default
  Inherits System.Web.UI.Page

ページが読み込まれた時の処理

サーバー上の物理パスを指定します。
StreamReaderクラスでPOSTされたデータ(Request.InputStream)を取得します。StreamReaderクラスは、特定のエンコーディングのバイトストリームを読み込むTextReader を実装するクラスです。
取得したデータの内容をReadToEndメソッドで読み取り、変数readStrに格納しておきます。
フォルダー名とファイル名(personalInfo.xml)を指定して、読み取ったデータをStreamWriterクラスのWriteメソッドで書き込みます。StreamWriterクラスは、文字を特定のエンコーディングでストリームに書き込むための TextWriterを実装するクラスです。
personalInfo.xmlにWindows Phoneから送信されたXMLデータが保存されます。
  Private Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim filePath As String = Server.MapPath("./")
    Dim reader As New StreamReader(Me.Request.InputStream(), System.Text.Encoding.UTF8)
    Dim readStr As String = reader.ReadToEnd
    Dim writer As StreamWriter = New StreamWriter(filePath & "SaveData/" & "personalInfo.xml", False, System.Text.Encoding.UTF8)
    writer.Write(readStr)
    reader.Close()
    writer.Close()
    Response.Flush()
  End Sub
End Class
  • 「データを保存し表示した電話番号に電話する」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています