2009-07-30 76 views
1

数据绑定可以说我有一个对象困惑在ASP.NET

class Person { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

而该对象从工厂中检索(即不能使用的SqlDataSource或类似的东西)

Person person = PersonFactory.GetPerson(); 

我怎样才能双向DataBind的两个属性到Web表单上的文本框?我看着FormView,但这似乎不符合我的需要,因为我没有迭代对象的集合。当我尝试使用它时,我似乎无法获取FormUpdated事件中Person对象中的发布值。而我绑定这样

标记

<asp:Textbox Text=<%# Bind("Name") %> /> 

代码背后

FormView1.DataSource = new List() { person }; 
FormView1.DataBind(); 

我觉得我失去了一些东西真的很明显。我应该使用FormView吗?它似乎不适合简​​单的数据绑定,但方法必须位于某种类型的容器中 - 是否有更合适的对象?

+0

我正在使用更新面板,如果有任何区别 – Bob 2009-07-30 18:25:49

回答

1

您需要处理更新到您的FormView - asp.net数据绑定控件中的更新不是自动的。我还会考虑使用ObjectDataSource - 将所有绑定保留在标记中可以使事情更容易找到。当您使用ObjectDataSource时,它会自动将您的单个对象包装在IEnumerable中,因此绑定到返回Person的方法是可以接受的。如果您不想写出表单yoruself,也可以考虑使用DetailsView。在你的情况,你可以做以下

<asp:FormView runat="server" DataSourceID="MyPersonDataSource"> ... </asp:FormView> 
<asp:ObjectDataSource runat="server" ID="MyPersonDataSource" 
    TypeName="PersonFactory" DataObjectTypeName="Person" 
    SelectMethod="GetPerson" UpdateMethod="UpdatePerson" /> 

,并促进这一点,你需要在你的PersonFactory类的UpdateMethod(人)的方法。这样做可以消除您与代码隐藏的绑定,并且可以让您的个人对象更新持久保存到数据存储中,而无需您自己处理更新事件。

1

尝试在TextBox控件上调用DataBind方法。

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    MyTextBox1.DataBind(); 
    MyTextBox2.DataBind(); 
} 

我从来没有尝试过做双向之前正是这样的结合,但使用绑定(“属性”)语法,它应该以这种方式工作,据我所知。

如果调用DataBind方法不起作用,那么FormView是您最好的选择。

+0

文本框需要在容器中才能使用绑定。我现在使用FormView,但我似乎无法得到我的发布值来反映在我的对象 – Bob 2009-07-30 17:53:05

+0

我想它必须在一个容器中。你如何检查回发值?现在我想了解更多信息,我认为您必须使用某种数据源,因为这也是它会传回这些更改的原因。 – 2009-07-30 18:19:29

-1
DataBinder.Eval(Container.DataItem, "Name") 

这应该做的伎俩,但我认为你需要一些自己的事件处理做2路结合。