asp.net
  • gridview
  • collections
  • nested
  • formview
  • 2011-10-20 15 views 0 likes 
    0

    我正在使用FormView來編輯我的業務對象。我沒有任何問題編輯/插入單個屬性。在Edit/InsertTemplate工作示例中使用gridview的Asp.net Formview

    某些業務對象具有集合屬性,我想以與單個屬性相同的方式編輯/插入集合屬性:Text='<%# Bind("SinglePropertyName") %>'

    所以我想在編輯/插入模板中包含一個gridview,並將它的Datasource綁定到集合屬性Datasource='<%# Bind("CollectionPropertyName") %>'。然後,我希望能夠使用gridview自己編輯收集特性項目,並在其他sigleproperties的更改中獲取已更改的值。

    這工作正常,顯示模板,集合呈現給gridview。問題是要獲取它的變化。

    我已經試過,沒有運氣的話,我想數據綁定GridView控件當出現以下情況例外:數據綁定方法如​​,XPath()Bind()只能在數據綁定控件的上下文中使用。

    除此之外,來自ItemUpdating事件的CollectionProperty的FormView的NewValues總是返回null。

    所以我想看一個類似場景的工作示例,看看我是否能夠做到這一點,或者如果我需要使用不同的方法。

    謝謝!

    +0

    感謝格式AVD – machocr

    回答

    1

    我已經找到了解決方案,它是將gridview封裝在一個暴露了要綁定的Value屬性的用戶控件(ObjectList)中。

    <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(); 
          } 
         } 
        } 
    
    

    我希望這幫助你,如果你處理類似的東西。

    相關問題