我正在使用FormView
来编辑我的业务对象。编辑/插入单个属性没有任何问题。
某些业务对象具有我想要编辑/插入的集合属性,其方式与我对单个属性相同:Text='<%# Bind("SinglePropertyName") %>'
。
所以我想在编辑/插入模板中包含一个gridview,并将Datasource绑定(双向)到集合属性:Datasource='<%# Bind("CollectionPropertyName") %>'
。然后,我希望能够使用gridview本身编辑集合propties项目,并在其他sigleproperties的更改中获取更改的值。
这可以很好地显示模板,集合呈现给gridview。问题是要对其进行更改。
我试图这样做没有运气,在尝试数据绑定gridview时遇到以下异常:Eval()
,XPath()
和Bind()
等数据绑定方法只能在数据绑定控件的上下文中使用。
除此之外,CollectionProperty
事件中ItemUpdating
的FormView的NewValues始终返回null。
所以我想看一个类似场景的工作示例,看看我是否能够做到这一点,或者我是否需要使用不同的方法。
谢谢!
答案 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();
}
}
}
如果你处理类似的事情,我希望这能帮到你。