長いスレッドを前もってお詫び申し上げます。
このコードが正しく機能しない理由について、私は非常に驚いています。
ご覧ください。
マークアップでは、
<asp:TemplateField HeaderText="Action">
<ItemTemplate>
<asp:Button ID="cancelBtn" style="width:105px;padding:5px;margin:5px;" runat="server" CommandName="delete" OnDataBinding="btnDelete_DataBinding" OnClientClick='return confirm("Are you sure you want to delete this entry?");' Text="Cancel Training" />
</ItemTemplate>
</asp:TemplateField>
getDateDifference()
次に、以下のコードで As Booleanという関数があります。
Private Function getDateDifference() As Boolean
Dim username = Session("Username")
Dim myConnectionString As [String] = ConfigurationManager.ConnectionStrings("DBConnectionString").ConnectionString
Dim myConnection As New SqlConnection(myConnectionString)
myConnection.Open()
Dim cmd1 As New SqlCommand("select DateDiff(dd,GetDate(),d.trainingDates) as DaysCount " & _
"from tblTrainings t Inner Join tblCourses c on t.courseId = c.courseId " & _
"Inner Join tblLocations l on t.locationId = l.LocationId " & _
"Inner Join tblTrainingDates d on t.dateid=d.dateid " & _
"Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId " & _
"Inner Join tblInstructors i on ic.instructorId = i.instructorId " & _
"Inner Join tblLogin lg on t.username = lg.username where lg.username = @username", myConnection)
cmd1.Parameters.AddWithValue("@username", username)
Dim dr1 As SqlDataReader = cmd1.ExecuteReader()
If dr1.Read() Then
Dim DaysCount As Integer = dr1("DaysCount")
Response.Write(DaysCount)
If DaysCount >= 2 Then
Return True
Else
Return False
End If
End If
Return False
End Function
関数は以下で呼び出されます。
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim btn As Button = DirectCast(e.Row.FindControl("cancelBtn"), Button)
btn.Enabled = Not getDateDifference()
End If
End Sub
私たちがやろうとしているのは、trainingdates を現在の日付と比較することだけです。
現在の日付がトレーニング日から 24 時間 (または 2 日) 以内の場合、既にクラスにサインアップしているユーザーはそのクラスをキャンセルできません。
現在の日付がトレーニング日の 2 日以上前の場合、ユーザーはキャンセルできます。
テストするために、アカウントで 2 つのトレーニングがスケジュールされています。
1 つのトレーニング日は 2013 年 6 月 22 日です。
もう 1 つのトレーニング日は 2013 年 6 月 29 日です。
上記のクエリを実行すると、それぞれ 1 日と 8 日になります。
今日の日付は 2013 年 6 月 21 日であるため、これは正しいです。つまり、2013 年 6 月 22 日の最初のトレーニング日まであと 1 日、2013 年 6 月 29 日の 2 番目のトレーニング日まであと 8 日あります。
これは、私のアプリ (スクリーンショットを参照してください) で、1 つのボタンが無効になり、もう 1 つのボタンが有効になることを期待していることを意味します。![ここに画像の説明を入力][1] スクリーンショットからわかるように、これは起こっていません。トレーニングの日付に関係なく、両方が有効または無効になっています。
response.write (DaysCount) で DaysCount をデバッグしようとすると、11と表示されます。
これがどのように起こっているのかわかりません。これに苦労してから少なくとも3日が経ちました。
DBはSQL Server 2005です。ただし、本番データベースは2008です。
よろしくお願いいたします。