■54736 / inTopicNo.1) |
Dictionary配列の情報が取得できない |
□投稿者/ akira (11回)-(2010/10/31(Sun) 21:11:02)
|
分類:[ASP.NET (VB)]
弁当注文のWebアプリを作成しているのすが、カレンダのクリックした日付をkeyにした
Dictionary配列の情報が取得出来なくて困っております。解決のヒントを頂ければ助かり
ます。よろしくお願いします。
カレンダの日付をクリックすると弁当注文が行え、既に弁当注文をしてある日付をクリック
すると注文キャンセルが行える様にしたいです。弁当注文済みの日か?注文がまだの日か?
を判別する為にDictionary配列のOrderFlag配列を利用しようと考えました。
ところが、以下のプログラムでは、弁当注文済みの日付をクリックしても、注文がまだの日を
クリックしても「弁当注文がない日」と判断され弁当が注文されてしまいます。原因を調べて
みるとDictionary配列のOrderFlag配列の情報が正しく取得出来ていないと考えました。
↓このIf判断行が正しく機能していない?
If OrderFlag.ContainsKey(cal.SelectedDate.ToString("yyyy/MM/dd")) Then
Dictionary配列に関する情報は↓のページ情報を参考にしました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/429dictionary/dictionary.html
カレンダのクリックした日付情報をOrderFlag配列のkey情報に反映させるにはどの様にすれば
良いのでしょうか?アドバイス頂けると助かります。よろしくお願いします。
環境:VWD2008、VB、MS-Access2003
<%@ Page Title="" Language="VB" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
'弁当注文状態フラッグ(Dictionary配列利用)
Dim OrderFlag As New Dictionary(Of String, Integer)
' カレンダのそれぞれの日付セルをレンダリングするタイミングで実行
Protected Sub cal_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs)
'AccessDBにOleDbで接続
Using objDb As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\AccessDB.mdb")
'弁当注文情報の取得
Dim objCom As New OleDbCommand("SELECT * FROM [弁当注文テーブル] WHERE [名前] = @syainNam AND [昼食日付] = @CalDate", objDb)
objCom.Parameters.Add("@namae", OleDbType.VarChar, 50)
objCom.Parameters("@namae").Value = "山田 太郎"
objCom.Parameters.Add("@CalDate", OleDbType.VarChar, 10)
objCom.Parameters("@CalDate").Value = e.Day.Date.ToString("yyyy/MM/dd")
objDb.Open()
Dim objDr As OleDbDataReader = objCom.ExecuteReader()
'各日の注文した昼食弁当情報を日付セル(e.Call)配下のコントロールとして追加
Do While objDr.Read()
e.Cell.Controls.Add(New LiteralControl("<br />" & objDr.GetString(3)))
OrderFlag(e.Day.Date.ToString("yyyy/MM/dd")) = objDr.GetValue(0)
'(Debug情報表示)Dictionary配列OrderFlagの内容表示
lblOrderFlagDisp.Text = "" 'lblOrderFlagDisp.Textの内容を消去
For Each key As String In OrderFlag.Keys
lblOrderFlagDisp.Text &= String.Format("{0} : {1}", key, OrderFlag(key)) & "<br />"
Next
Loop
End Using
End Sub
' カレンダの日付セルの選択が変更されたタイミングで実行
Protected Sub cal_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
If OrderFlag.ContainsKey(cal.SelectedDate.ToString("yyyy/MM/dd")) Then
'弁当注文済み日の場合は、注文削除処理を実行
'Debub情報表示
Label1.Text = "注文済み日です。"
'Debub情報表示
Label2.Text = cal.SelectedDate.ToString("yyyy/MM/dd")
'弁当注文データの削除処理
Using objDb As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\AccessDB.mdb")
Dim objCom As New OleDbCommand("DELETE FROM [弁当注文テーブル] WHERE [弁当注文ID] = ?", objDb)
objCom.Parameters.Add("@OrderID", OleDbType.Integer, 10)
objCom.Parameters("@OrderID").Value = OrderFlag(cal.SelectedDate.ToString("yyyy/MM/dd"))
'クエリの実行(DELETEクエリの場合は結果セットを返さないExecuteNonQuery)
objDb.Open()
objCom.ExecuteNonQuery()
End Using
Else
'弁当未注文日の場合は注文処理を実行
'Debub情報表示
Label1.Text = "未注文の日です。"
'AccessDBにOleDbで接続
Using objDb As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\AccessDB.mdb")
'弁当注文情報をDBに挿入
Dim objCom As New OleDbCommand("INSERT INTO [弁当注文テーブル] ([名前], [昼食日付], [弁当名]) VALUES (?, ?, ?)", objDb)
objCom.Parameters.Add("@namae", OleDbType.VarChar, 50)
objCom.Parameters("@namae").Value = "山田 太郎"
objCom.Parameters.Add("@CalDate", OleDbType.VarChar, 10)
objCom.Parameters("@CalDate").Value = cal.SelectedDate.ToString("yyyy/MM/dd")
objCom.Parameters.Add("@bentou", OleDbType.VarChar, 50)
objCom.Parameters("@bentou").Value = "日替弁当"
'クエリの実行(INSERTクエリの場合は結果セットを返さないExecuteNonQuery)
objDb.Open()
objCom.ExecuteNonQuery()
End Using
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
カレンダ日付クリックでオーダキャンセル 22/10/30<br />
<br />
<asp:Calendar ID="cal" runat="server" OnDayRender="cal_DayRender" OnSelectionChanged="cal_SelectionChanged"></asp:Calendar>
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
<br />
OrderFlagの内容表示<br />
<asp:Label ID="lblOrderFlagDisp" runat="server"></asp:Label>
<br />
</div>
</form>
</body>
</html>
|
|