ASP.NET EditItemTemplate绑定到TimeSpan

时间:2014-01-16 19:15:07

标签: asp.net data-binding timespan

在搜索现有问题后,我一直无法找到解决方案。

基本上,我有一个启用编辑的详细信息视图。它绑定到LINQDataSource。其中一个字段是SQL时间,它作为TimeSpan进入ASP.NET。我想要双向绑定。我已经有了在String和TimeSpan之间进行转换的函数。

但这是我的难题。我觉得在编辑开始时我需要一个Text =表达式来填充文本框,

<EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# TimeSpanToString(Eval("Time")) %>'></asp:TextBox>
</EditItemTemplate>

但同时,使用不同的Text =表达式来指定TimeSpan值以在Update上写回数据库;像这样的东西:

<EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Time", StringToTimespan(TextBox1.Text) %>'></asp:TextBox>
</EditItemTemplate>

正如您所看到的,我首先不确定在Eval和Bind表达式中使用的语法,但希望我已成功解释了我的问题。只能有一个Text =表达式,所以显然需要在这里做一些完全不同的事情,以便在数据绑定和更新期间进行两次转换。

谢谢! 桑德拉

从@ jadarnel23尝试解决方案:

对于ItemTemplate,TimeSpanToTimeString(Eval(“Time”))完美运行。并且ItemUpdating功能也可以完美地工作 - 用户可以输入例如下午1:30,它被接受了。

剩下的唯一问题是EditTemplate。

绑定(“时间”)有效,但不会向用户显示格式良好的时间。

TimeSpanToString(Eval(“Time”))不起作用,正如您所说,因为它不会在ItemUpdating中创建NewValues条目。

应该是胜利者,TimeSpanToString(Bind(“Time”)),实际上会在绑定时抛出错误“编译器错误消息:BC30451:'Bind'未声明。由于其保护,它可能无法访问水平。”看起来我需要详细说明Bind,以便我的功能可以看到它,但是如何?谢谢,这真的很近!!

1 个答案:

答案 0 :(得分:2)

you cannot call the Bind "method" from within another public method in your markup以来(就像你可以使用Eval一样),看起来你在EditItemTemplate:{/ p>中遇到了正常的“绑定”

<EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" 
        Text='<%# Bind("Time") %>'>
    </asp:TextBox>
</EditItemTemplate>

注意:您需要执行Bind,因为这会使其稍后显示在您的ItemUpdating事件中,以将其保存到数据库

然后在DetailsView数据绑定后立即更新它以显示目的(确保它也处于编辑模式):

protected void yourDetailsView_DataBound(object sender, EventArgs e)
{
    if (yourDetailsView.CurrentMode == DetailsViewMode.Edit)
    {
        TextBox timeTextBox = (TextBox)yourDetailsView.FindControl("TextBox1");
        timeTextBox.Text = TimeSpanToString(timeTextBox.Text);
    }
}

然后,您可以处理the ItemUpdating event,并在将其保存到数据库之前操纵“时间”的值:

protected void yourDetailsView_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
    String newTime = e.NewValues["Time"].ToString();
    e.NewValues["Time"] = StringToTimespan(newTime);
}

请注意,您可以从DetailsViewUpdateEventArgs.NewValues collection

中提取用户输入的值