在Edit / InsertTemplate工作示例中使用gridview的Asp.net Formview

时间:2011-10-20 04:56:12

标签: asp.net gridview collections nested formview

我正在使用FormView来编辑我的业务对象。编辑/插入单个属性没有任何问题。

某些业务对象具有我想要编辑/插入的集合属性,其方式与我对单个属性相同:Text='<%# Bind("SinglePropertyName") %>'

所以我想在编辑/插入模板中包含一个gridview,并将Datasource绑定(双向)到集合属性:Datasource='<%# Bind("CollectionPropertyName") %>'。然后,我希望能够使用gridview本身编辑集合propties项目,并在其他sigleproperties的更改中获取更改的值。

这可以很好地显示模板,集合呈现给gridview。问题是要对其进行更改。

我试图这样做没有运气,在尝试数据绑定gridview时遇到以下异常:Eval()XPath()Bind()等数据绑定方法只能在数据绑定控件的上下文中使用。

除此之外,CollectionProperty事件中ItemUpdating的FormView的NewValues始终返回null。

所以我想看一个类似场景的工作示例,看看我是否能够做到这一点,或者我是否需要使用不同的方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

我已经找到了解决方案,它将gridview封装在一个用户控件(ObjectList)中,该控件公开了一个要绑定的Value属性。

<uc:ObjectList ID="ucObjectList" runat="server" Value='<%#Bind("Items") %>' />

<强> ObjectList.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ObjectList.ascx.cs" Inherits="TestBinding.ObjectList" %>

    <asp:GridView runat="server" ID="grdItems" DataSource='<%#Datasource%>' 
    OnRowEditing="grdItems_RowEditing" 
    OnRowCancelingEdit="grdItems_RowCancelingEdit" 
    OnRowUpdating="grdItems_OnRowUpdating">
    <Columns>
    <asp:CommandField ShowEditButton="True"></asp:CommandField>
    </Columns>
    </asp:GridView>

<强> ObjectList.ascx.cs:



    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Web.UI.WebControls;

    namespace TestBinding
    {
        public partial class ObjectList : UserControl
        {
            protected List Datasource
            {
                get
                {
                    if (ViewState["ObjectList"] == null) ViewState["ObjectList"] = new Test();
                    return (List)ViewState["ObjectList"];
                }
                set { ViewState["ObjectList"] = value; }
            }

            [Bindable(true, BindingDirection.TwoWay)]
            public List Value
            {
                get { return Datasource; }

                set { Datasource = value; }
            }

            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void grdItems_RowEditing(object sender, GridViewEditEventArgs e)
            {
                ((GridView)sender).EditIndex = e.NewEditIndex;
                ((GridView)sender).DataSource = Datasource;
                ((GridView)sender).DataBind();
            }

            protected void grdItems_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
            {
                ((GridView)sender).EditIndex = -1;
                ((GridView)sender).DataSource = Datasource;
                ((GridView)sender).DataBind();
            }

            protected void grdItems_OnRowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                Datasource[e.RowIndex].ID = int.Parse(e.NewValues["ID"].ToString());
                Datasource[e.RowIndex].Last = (string)e.NewValues["Last"];
                ((GridView)sender).EditIndex = -1;
                ((GridView)sender).DataSource = Datasource;
                ((GridView)sender).DataBind();
            }
        }
    }

如果你处理类似的事情,我希望这能帮到你。