C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Dictionary配列の情報が取得できない


(過去ログ 92 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■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>

引用返信 編集キー/
■54737 / inTopicNo.2)  Re[1]: Dictionary配列の情報が取得できない
□投稿者/ shu (140回)-(2010/10/31(Sun) 21:26:22)
No54736 (akira さん) に返信

DayRenderイベント発生時とSelectionChangedイベント発生時で
それぞれOrderFlagは新しくインスタンスが作られイベントが終わったら参照不可になります。
セッション変数とかに保存しておくなどしないと情報の引き継ぎは出来ないです。
引用返信 編集キー/
■54739 / inTopicNo.3)  Re[2]: Dictionary配列の情報が取得できない
□投稿者/ akira (12回)-(2010/10/31(Sun) 21:40:15)
No54737 (shu さん) に返信
> ■No54736 (akira さん) に返信
>
> DayRenderイベント発生時とSelectionChangedイベント発生時で
> それぞれOrderFlagは新しくインスタンスが作られイベントが終わったら参照不可になります。
> セッション変数とかに保存しておくなどしないと情報の引き継ぎは出来ないです。

shuさん、早急なお返事ありがとうございます。
カレンダのDayRenderイベントとSelectionChangedイベントを利用して、今回の様な
Dictionary配列のOrderFlag配列の使用法は無理なのですか。
(弁当注文日か?弁当未注文日か?の判別方法にやっとの思いで「Dictionary配列」という
機能を見付けたのですが、利用出来ないのですか。残念です。)
セッション変数を利用した弁当注文日か?弁当未注文日か?の判別方法を考えてみます。
(セッション変数を利用して目的の機能を実現するにはどうするのだろう??)
アドバイスありがとうございました。セッション変数の機能を調べてみます。
引用返信 編集キー/
■54785 / inTopicNo.4)  Re[3]: Dictionary配列の情報が取得できない
□投稿者/ akira (13回)-(2010/11/02(Tue) 09:00:44)
No54737 (shu さん) に返信
> ■No54736 (akira さん) に返信
> 
> DayRenderイベント発生時とSelectionChangedイベント発生時で
> それぞれOrderFlagは新しくインスタンスが作られイベントが終わったら参照不可になります。
> セッション変数とかに保存しておくなどしないと情報の引き継ぎは出来ないです。

shuさん、アドバイスありがとうございました。
セッション変数を利用することで、カレンダの弁当注文済み日付をクリックすると弁当注文
のキャンセルが出来る様になりました。
ありがとうございました。

目的通り動く様になったコードを添付しました。

<%@ 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">
    
    ' カレンダのそれぞれの日付セルをレンダリングするタイミングで実行
    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)))
                'Sessionへの情報記述
                Session(e.Day.Date.ToString("yyyy/MM/dd")) = objDr.GetValue(0)
            Loop
        End Using
        
        '(Debug情報表示)全てのSession情報を表示
        Label1.Text = "" 'LabelのText情報の消去
        For Each key As String In Session.Contents
            Label1.Text &= key & ": " & Session(key).ToString & "<br />"
        Next
    End Sub

    ' カレンダの日付セルの選択が変更されたタイミングで実行
    Protected Sub cal_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        If Not Session(cal.SelectedDate.ToString("yyyy/MM/dd")) Is Nothing Then
            '弁当注文済み日の場合は、注文削除処理を実行
            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 = Session(cal.SelectedDate.ToString("yyyy/MM/dd"))

                'クエリの実行(DELETEクエリの場合は結果セットを返さないExecuteNonQuery)
                objDb.Open()
                objCom.ExecuteNonQuery()
            End Using
            '対象Sessioの削除(弁当注文済み日の解除)
            Session.Remove(cal.SelectedDate.ToString("yyyy/MM/dd"))
        Else
            '弁当未注文日の場合は注文処理を実行
            '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/11/02<br />
        <br />
        <asp:Calendar ID="cal" runat="server" OnDayRender="cal_DayRender" OnSelectionChanged="cal_SelectionChanged"></asp:Calendar>
        <br />
        全てのSession情報の表示<br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <br />
    </div>
    </form>
</body>
</html>

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -