0

对于可能是新手的问题,请提前道歉。(asp.net 新手,VB 编码,最佳控件零知识)。请尊重我对 AJAX 控件或使用 MVC 并尝试最小化 javascript 不感兴趣。就技术而言,我需要做的事情非常简单。

我正在开发一种允许用户编辑数据库数据的表单。我选择使用 FormView,这样我就可以像传统的 vba 应用程序一样对其进行格式化。如果我允许 VWD 自动格式化控件,我可以将数据源设置为我的数据库表,并且数据库中的值会成功显示。我也可以使用此表单编辑数据库中的所有内容。

然而,老板讨厌输入日期。

我无法找到具有数据源功能的日期选择器控件,该控件的工作方式类似于在 formview 中自动构建的文本框(绑定到数据源功能)。所以,我假设不存在。我需要一些保证,我认为我需要做的是正确的方法。

而不是通过前端自动的东西使用 FormView 控件的数据源,我应该改为

  • 放置这些数据选择器控件之一,这些控件只是将日历与表单视图中所有日期字段的文本框结合起来(不尊重那些构建它们的人,只是不敢相信它们没有更丰富的功能,这似乎非常需要给出数字可用的日期选择器)
  • 在 Page_Load 中声明我的数据源并加载所有控件(如果它们具有使用 FindControl 的现有数据)
  • 使用 Data_Bound 块利用 FindControl 从每个控件中检索选定的值,并为 Update 构建动态 SQL 字符串
  • 使用块后面的代码之一声明和更新我的数据库,可能在 DataBound 中

我在正确的轨道上吗?我没有经验可以对我的假设充满信心。拜托,如果有更简单的方法,我会接受,但我必须让它“漂亮”。欢迎提出任何形式的控制建议。

---进一步了解我的问题这里有一些代码证明我实际上已经尝试解决这个问题......在我的 FormView 代码块中,我有:

<asp:FormView ID="FormView1" runat="server" DataKeyNames="MASTERID_Action" 
    DataSourceID="srcAction">
<EditItemTemplate>
MASTERID_Action:
<asp:Label ID="MASTERID_ActionLabel1" runat="server" 
Text='<%# Eval("MASTERID_Action") %>' />
<br />
Action_Description:
<asp:TextBox ID="Action_DescriptionTextBox" runat="server" 
Text='<%# Bind("Action_Description") %>' />
<br />
Action_Target:
<asp:TextBox ID="Action_TargetTextBox" runat="server" 
Text='<%# Bind("Action_Target") %>' />
<br />
Action_Captured:
<asp:TextBox ID="Action_CapturedTextBox" runat="server" 
Text='<%# Bind("Action_Captured") %>' />
<br />
Action_Declined:
<asp:TextBox ID="Action_DeclinedTextBox" runat="server" 
Text='<%# Bind("Action_Declined") %>' />
<br />
Action_AgreedDate:
<ewc:CalendarPopup ID="CalendarPopup1" runat="server" Culture="en-AU" 
PostedDate="" SelectedDate='<%# Bind("Action_AgreedDate") %>' 
SelectedValue="01/14/2013 08:47:54" UpperBoundDate="12/31/9999 23:59:59" 
VisibleDate="01/14/2013 08:47:54" />
<br />
         ...
</EditItemTemplate>

我的数据库将此 Action_AgreedDate 保存为可为空。当我查看 ItemTemplate(在浏览器中)时,日期显示为 0.000(因为它是一个文本字段并绑定到 Action_AgreedDate,没有发生错误),当我单击编辑转到 EditItemTemplate 时,我收到此错误:从类型转换键入“日期”的 DBNull' 无效。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidCastException:从“DBNull”类型到“Date”类型的转换无效。

源错误:

第 95 行:
第 96 行:Action_AgreedDate:第 97 行:' 第 99 行:SelectedValue="01/14/2013 08:47:54" UpperBoundDate="12/31/9999 23:59:59"

我可以很容易地将其翻译为“控件找到了一个空字段并且不知道如何处理它”;问题是,我不知道该怎么办。我已经检查了该字段的属性(CalendarPOP 字段以查看是否有处理空值的设置,但对我来说没有什么明显的。我目前正在尝试在线查找有关控件的更多文档。(我已经联系了 eWorld 和希望他们能够回应。)

我还应该补充一点,如果我请求一条已经有 Action_AgreedDate 的记录,我不会收到任何错误,因为数据库中存在一个值供控件显示。

4

2 回答 2

0

我认为最好的方法是使用jQueryjQuery UI,它们有一个日期选择器,可以附加到 FormView 中的常规 ASP.NET 文本框。因此,如果您的 FormView 代码看起来像这样,例如:

 <asp:FormView ID="FormView1" runat="server" DataKeyNames="id" DataSourceID="SqlDataSource1">
        <EditItemTemplate>
            id:
            <asp:Label ID="idLabel1" runat="server" Text='<%# Eval("solution_id") %>' />
            <br />
            date_modified:
            <asp:TextBox ID="date_modifiedTextBox" runat="server" Text='<%# Bind("date_modified") %>' />
            <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update" />
            <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" />
        </EditItemTemplate>
        <ItemTemplate>
            id:
            <asp:Label ID="idLabel" runat="server" Text='<%# Eval("solution_id") %>' />
            <br />
            date_modified:
            <asp:Label ID="date_modifiedLabel" runat="server" Text='<%# Bind("date_modified") %>' />
        </ItemTemplate>
    </asp:FormView>

您可以使用 jQuery UI 运行类似的东西来获取 date_modified 文本框上的日期选择器:

$('[id$=date_modifiedTextBox]').datepicker()

$('[id$=date_modifiedTextBox]')部分是使用 jQuery 选择 ASP.NET 控件所必需的,如果它只是一个普通元素,您可以使用$('.className')$('#id')类似的东西。希望这可以帮助。

于 2013-01-12T09:15:14.840 回答
0

问题解决了。

我在 4GuysFromRolla.com 上看到一篇关于 RJS POP 日历的文章 (http://preview.tinyurl.com/cerm9xv),它勾选了所有方框。成功实现了,因为日历和指定的文本框是分开的,所以不用绑定!它工作得很好。4GuysFromRolla 又一次救了我的培根……

于 2013-01-14T01:03:59.310 回答