如何在ListView中绑定复杂数据以进行控制(类User包含类UserType的实例)

时间:2011-08-11 19:25:48

标签: asp.net listview

我有2个值类

public class UserType
{
    public int ID;
    public string TypeName;
}
public class User
{
    public int ID;
    public string UserName;
    public UserType Type;
}

1处理阶级

public class Users
{
    public User[] GetUsers()
    {
            //Retrive and re turn User array
    }
    public int Update(User user, User old_user)
    {
            //Update user
    }
}

1个ListView和1个ObjectDataSource

<asp:ListView ID="lsvUser" runat="server" DataKeyNames="ID" DataSourceID="odsUser" 
    ItemPlaceholderID="plhItem" onitemupdating="lsvUser_ItemUpdating">
<LayoutTemplate>
    <ul><asp:PlaceHolder ID="plhItem" runat="server"></asp:PlaceHolder></ul>
</LayoutTemplate>
<ItemTemplate>
    <li>
        <asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
        <asp:Label ID="lblUserName" runat="server" Text='<%# Eval("UserName") %>'></asp:Label>
        <asp:Label ID="lblTypeName" runat="server" Text='<%# Eval("Type.TypeName") %>'></asp:Label>
        <asp:LinkButton ID="btEdit" runat="server" CssClass="button" CommandName="Edit" Text="Edit"></asp:LinkButton>
    </li>
</ItemTemplate>
<EditItemTemplate>
    <li class="editRow">
        <asp:Textbox ID="txbUserName" runat="server" Text='<%# Bind("UserName") %>'></asp:Textbox >
        <asp:Textbox ID="txbTypeName" runat="server" Text='<%# Bind("Type.TypeName") %>'></asp:Textbox >
    </li>
</EditItemTemplate>
</asp:ListView>
<asp:ObjectDataSource ID="odsUser" runat="server" TypeName="BLL.Users" DataObjectTypeName="BLL.User" SelectMethod="GetUsers" UpdateMethod="Update" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="old_{0}"></asp:ObjectDataSource>

当数据加载到ItemTemplate中时,ListView会解释Type.TypeName并正确绑定, 但是在更新记录时,我无法从旧值中检索old_user.Type。因此old_user.Name和old_user.ID具有值,但old_user.Type为null。

帮帮我。我已经搜索了大约2天,但找不到解决方案。我可以为这样的新用户绑定数据:

protected void lsvUser_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
    e.NewValues.Add("Type", new BLL.UserType() { TypeName = Convert.ToString(((TextBox)lsvUser.EditItem.FindControl("txbTypeName")).Text) });
}

但我不知道如何检索旧值(如何检索lblTypeName的值)。 帮我。如果在ItemUpdating事件中有一个不需要额外代码的解决方案,请教我。

谢谢。

1 个答案:

答案 0 :(得分:0)

将Type.TypeName添加为DataKey,如下所示:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="Type.TypeName">

在ItemUpdating事件处理程序中,检索键值如下:

string typeName = (string)e.Keys["Type.TypeName"];

我不肯定“Type.TypeName会起作用,但是它的某些变化应该有效,无论是Type.TypeName还是TypeName。