我为这条长篇帖子道歉。
我对这段代码无效的原因感到非常惊讶。
请看一下。
关于标记,
<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的函数,其代码如下:
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
我们所做的只是将训练日期与当前日期进行比较。
如果当前日期在培训日期的24小时(或2天)内,则已注册课程的用户无法取消该课程。
如果当前日期超过培训日期前2天,用户可以取消。
为了测试,我在我的帐户上安排了2次培训。
一个培训日期是2013年6月22日
另一个培训日期是2013年6月29日。
当我运行上面的查询时,我分别得到1天和8天。
这是正确的,因为今天的日期是2013年6月21日,也就是在2013年6月22日的第一个培训日期还剩8天之前还剩一天 在2013年6月29日第二次培训之前。
这意味着在我的应用上(请参见截图),我希望看到一个按钮被禁用而另一个按钮被启用。 ![在此处输入图像说明] [1] 从截图中可以看出,这种情况并没有发生。无论培训日期是什么,两者都要启用或禁用。
当我尝试使用response.write(DaysCount)调试DaysCount时,它会显示 11 。
不确定这是怎么回事。自从我为此奋斗至少已经过去了3天。
DB是sql server 2005.但是生产数据库是2008年。
提前感谢您的协助。
答案 0 :(得分:2)
我不确定这里发生了什么,但是尝试调试它我只会从数据库查询返回d.trainingDates
而不是DateDiff
,然后执行此操作来验证它:
If dr1.Read() Then
Dim trngDate As Date = dr1("trainingDates")
Response.Write(trngDate.ToString)
If (trngDate - DateTime.Now).TotalDays >= 2 Then
Return True
Else
Return False
End If
End If
修改强>
但是 - 为什么不只是比较RowDataBound事件中的日期。
无需执行其他查询,您要比较的日期是您要绑定的行
像这样(未经测试的)代码:
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim dateValue As Date = Date.Parse(Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Dates")))
Dim btn As Button = DirectCast(e.Row.FindControl("cancelBtn"), Button)
btn.Enabled = (dateValue - DateTime.Now).TotalDays >= 2
End If
End Sub
答案 1 :(得分:1)
我知道你接受了@Matt Wilko的答案,但只是为了回答你所面临的具体问题: -
问题是您的查询会返回该用户的所有tblTraining
条记录。 where子句中没有条件来确定哪个tblTraining
记录是当前活动记录。
Response.Write(DaysCount)
没有产生11,而是产生1和1,这是6/22/2013和6/21/2013之间的差异。你有两行,所以每个数字必须是一个不同的行,两行似乎都有相同的日期差异。
您可能需要声明Private Function getDateDifference(courseId as Integer) As Boolean
或类似内容,以便您可以将courseId
传递给函数并在SQL语句中使用它来标识您想要的特定培训计划。可能你的SQL语句看起来像
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 and " & _
"t.courseId = @courseId", myConnection)
cmd1.Parameters.AddWithValue("@courseId", courseId)
至于你可以获得courseId
的地方,你可以使用@Matt Wilko使用的方法。但话说回来,他的方法完全避免了这个问题。