在搜索现有问题后,我一直无法找到解决方案。
基本上,我有一个启用编辑的详细信息视图。它绑定到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,以便我的功能可以看到它,但是如何?谢谢,这真的很近!!
答案 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);
}
中提取用户输入的值