2012-04-16 53 views
1

我有一个使用了Ajax日期日历Web表单。这工作正常。我的问题是,当我提交我的表单时,我收到以下消息。System.ArgumentException:字符串值不能转换为日期

'String value can not be converted to a date' .AgendaDate = New SmartDate(txtAgendaDate.Text) 

这里是保存日历和关联的文本框中我的网页形式...

<td> 
    <asp:TextBox ID="txtAgendaDate" runat="server" ForeColor="Black" ></asp:TextBox> 
</td> 
<td> 
    <asp:ImageButton runat="Server" ID="ImageButton1" ImageUrl="~/images/calendarpic.png" 
       AlternateText="Click here to display calendar" /> 

    <cc1:calendarextender ID="CalendarExtender1" runat="server" 
        TargetControlID="txtAgendaDate" PopupButtonID="ImageButton1" > 
    </cc1:calendarextender> 
</td> 

我有一个Web窗体上的关联属性的类。除了ajax日历的文本字段以外,其余字段处理数据并将数据提交到数据库。

这里是我的简化版为类和txtAgendaDate代码的代码......

#Region " Agenda Variables " 

'Declare Variables and data types and set default values 
Private mAgendaID As Integer = 0 
Private mOrganiser As String = "" 
Private mMeeting As String = "" 
Private mAgendaDate As SmartDate = New SmartDate() 

#End Region 

#Region " Constructors " 

Public Sub New() 
End Sub 

Public Sub New(ByVal reader As SafeDataReader) 
    ' Public Sub New(ByVal reader As SQLDataReader) 

    'Combine variables & property types 
    With reader 
     mAgendaID = .GetInt32("AgendaID") 
     mOrganiser = .GetString("Organiser") 
     mMeeting = .GetString("Meeting") 
     mAgendaDate = .GetSmartDate("AgendaDate") 
    End With 
End Sub 

#End Region 

#Region "Properties" 

'Define form field properies so that they can be used when adding the data to the database on the add button is pressed. 
Public Property AgendaID() As Integer 
    Get 
     Return mAgendaID 
    End Get 
    Set(ByVal Value As Integer) 
     mAgendaID = Value 
    End Set 
End Property 

Public Property Organiser() As String 
    Get 
     Return mOrganiser 
    End Get 
    Set(ByVal value As String) 
     mOrganiser = value 
    End Set 
End Property 

Public Property Meeting() As String 
    Get 
     Return mMeeting 
    End Get 
    Set(ByVal value As String) 
     mMeeting = value 
    End Set 
End Property 

Public Property AgendaDate() As SmartDate 
    Get 
     Return mAgendaDate 
    End Get 
    Set(ByVal Value As SmartDate) 
     mAgendaDate = Value 
    End Set 
End Property 

#End Region 


End Class 

这里是我的命令看起来所连接到数据库,并在存储过程中,也有参数。

Public Class Agenda_TempDAL 

Public Shared Function AddAgenda_Temp(ByVal Agenda_Temp As Agenda_Temp) As Integer 

    'Declare i as integer as 0 
    Dim iAgendaID As Integer = 0 

    'Database conn, this is linked to the web config file .AppSettings 
    Using dbconnection As New SqlConnection(ConfigurationManager.AppSettings("dbconnection")) 
     dbconnection.Open() 

     'Command to state the stored procedure and the name of the stored procedure 
     Using dbcommand As SqlCommand = dbconnection.CreateCommand 
      With dbcommand 
       .CommandType = CommandType.StoredProcedure 
       .CommandText = "Stored_Proc_Name" 

       'Create parameter for AgendaID and output 
       Dim oParam As New SqlParameter 
       oParam.ParameterName = "@AgendaID" 
       oParam.Direction = ParameterDirection.Output 
       oParam.SqlDbType = SqlDbType.Int 

       'Create parameters for the remaining fields 
       .Parameters.Add(oParam) 
       .Parameters.AddWithValue("@Organiser", Agenda_Temp.Organiser) 
       .Parameters.AddWithValue("@Meeting", Agenda_Temp.Meeting) 
       .Parameters.AddWithValue("@AgendaDate", Agenda_Temp.AgendaDate.DBValue) 

       'Simply execute the query 
       dbcommand.ExecuteNonQuery() 

      End With 
     End Using 
    End Using 

    'Need to return the agendaID as an integer. 
    Return iAgendaID 

End Function 
End Class 

这里是按钮背后的代码网页。这是导致基于属性/字段的错误的页面。问题就出在这条线......

.AgendaDate = New SmartDate(txtAgendaDate.Text) 

该按钮的整个代码是在这里...

Protected Sub btnAddAgendaTemplate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddAgendaTemplate.Click 

    'This works alongside the Class named Agenda_Temp which has the properties and DB connection assigned to it for each web form field. 
    Dim oAgenda_Temp As New Agenda_Temp 

    'Within the object Agenda_Temp Class use the properties defined. 
    'They are required to be defined in the Agenda_Temp/ app code so we can use them within here. 

    With oAgenda_Temp 
     .Organiser = txtOrganiser.Text 
     .Meeting = txtMeeting.Text 
     .AgendaDate = New SmartDate(txtAgendaDate.Text) 


     'Within the object Agenda_Temp class use the defined DAL which includes all the DC connect and stored procedures. 
     oAgenda_Temp.AgendaID = Agenda_TempDAL.AddAgenda_Temp(oAgenda_Temp) 
    End With 

End Sub 
End Class 

据我所知,它告诉我,该字符串值不能转换为日期但我不知道锄头解决这个问题,因为我是.net 2010的新手?

任何帮助非常感谢。

+0

http://msdn.microsoft.com/en-us/library/cc165448.aspx – JonH 2012-04-16 14:49:18

+2

哪里SmartDate'的'接收字符串的构造?你已经展示了很多代码,为什么你忽略了相关的部分? – 2012-04-16 14:56:32

回答

0

将字符串到日期newing之前: 从MSDN:

string date = "01/08/2008"; 
DateTime dt = Convert.ToDateTime(date); 

你的将成为

DateTime dt = Convert.ToDateTime(txtAgendaDate.Text) 

然后将日期传递到您的SmartDate构造:

oAgenda_Temp.AgendaDate = new SmartDate(dt) 

最终结果:

With oAgenda_Temp 
     .Organiser = txtOrganiser.Text 
     .Meeting = txtMeeting.Text 
     .AgendaDate = New SmartDate(Convert.ToDateTime(txtAgendaDate.Text)) 


     'Within the object Agenda_Temp class use the defined DAL which includes all the DC connect and stored procedures. 
     oAgenda_Temp.AgendaID = Agenda_TempDAL.AddAgenda_Temp(oAgenda_Temp) 
    End With 
+0

同样在这里:你怎么知道SmartDate的构造函数需要DateTime作为参数?那么它甚至不会编译。编辑:也许'选择严格'是_off_什么总是一个坏主意。 – 2012-04-16 15:10:53

+0

@ JonH。此转换处理了一个款待并接受选定日期并将其填充到数据库中。许多感谢所有。 – Betty 2012-04-16 15:21:25

+0

@Betty没问题 - 只是将答案标记为已接受,所以我们可以将此问题关闭。 – JonH 2012-04-16 15:22:06

0

正如其他人指出的那样,您需要将输入值转换为DateTime。我不知道SmartDate()函数在做什么,但错误消息清楚地表明该值无法转换为日期。

其次,我想补充一些验证,以确保输入是有效的提交页面之前。使用RequiredFieldValidatorCompareValidatorRegularExpressionValidator

<asp:TextBox ID="txtDate" runat="server" ... /> 
<asp:RequiredFieldValidator ID="reqDate" runat="server" ErrorMessage="Required" Display="Dynamic" ControlToValidate="txtDate"></asp:RequiredFieldValidator> 
<asp:RegularExpressionValidator ID="regDate" runat="server" ControlToValidate="txtDate" ErrorMessage="Please enter a valid date in the format (mm/dd/yyyy)" ValidationExpression="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"></asp:RegularExpressionValidator>