【问题标题】:ASP.NET EditItemTemplate Binding to TimeSpanASP.NET EditItemTemplate 绑定到 TimeSpan
【发布时间】:2014-01-16 19:15:07
【问题描述】:

我只是在搜索现有问题后无法找到解决方案。

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

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

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

但同时,一个不同的 Text= 表达式指定 TimeSpan 值以在更新时写回数据库;像这样:

<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。

Bind("Time") 有效,但不会为用户提供格式良好的时间。

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

应该是赢家的那个,TimeSpanToString(Bind("Time")),实际上在绑定时抛出了一个错误“编译器错误消息:BC30451:'Bind'未声明。由于它的保护,它可能无法访问等级。”看起来我需要详细说明 Bind 以便我的函数可以看到它,但是如何?谢谢,这真的很接近!

【问题讨论】:

    标签: asp.net data-binding timespan


    【解决方案1】:

    由于you cannot call the Bind "method" from within another public method in your markup(就像您可以使用Eval 一样),您似乎被困在EditItemTemplate 中进行正常的“绑定”:

    <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 中提取用户输入的值

    【讨论】:

    • 这听起来很棒!我今天或明天应该有时间在这个项目上工作,并期待着回报。谢谢!
    • 太棒了,@Sandra。我期待听到它是否对您有用 =)
    • 嘿,@Sandra。看起来您的某些评论没有通过 =) 什么不起作用?
    • 评论字段的评论太长。 @jadarnel23,我将结果发布为对原始问题的编辑。请参见上文 - 剩下的一个方面不起作用。谢谢!
    • @Sandra 太好了!看起来我们正在取得进展。这是一个奇怪的错误。在 Bind 调用之后放置 .ToString() 是否有帮助?像这样:TimeSpanToString(Bind("Time").ToString())
    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多