2011-10-20 27 views
0

私はFormViewを使用してビジネスオブジェクトを編集しています。私は単一のプロパティを編集/挿入するのに問題はありません。Asp.net編集/ InsertTemplateの作業例の中のgridviewを持つFormview

ビジネスオブジェクトの中には、単一プロパティの場合と同じ方法で編集/挿入したいコレクションプロパティがあります。Text='<%# Bind("SinglePropertyName") %>'

私は編集/挿入テンプレートの内部にgridviewを含め、データソースをコレクションプロパティ:Datasource='<%# Bind("CollectionPropertyName") %>'にバインド(双方向)したいと思います。それから私は、グリッドビュー自体でコレクションのproptiesアイテムを編集し、他のsiglepropertiesの変更の間で変更された値を得ることができるようにしたいと思います。

これはテンプレートを表示するために正常に動作し、コレクションはgridviewにレンダリングされます。問題はそれに変更を加えることです。 GridViewのをデータバインドしようとしたとき、私は運にそうしようとしました

は、私は次の例外を取得:このよう​​、XPath()、そしてBind()などのデータバインディングメソッドは、唯一のデータバインドされたコントロールのコンテキストで使用することができます。

さらに、ItemUpdatingイベントのCollectionPropertyのFormViewのNewValuesは常にnullを返します。

私はこれを行うことができるかどうか、あるいは別のアプローチを使用する必要があるかどうかを確認するために、同様のシナリオの実例を見たいと思います。

ありがとうございます!

+0

フォーマットAVD – machocr

答えて

1

私はすでにこれに対する解決策を見つけました。そして、バインドするValueプロパティを公開するユーザーコントロール(ObjectList)にgridviewをカプセル化しました。

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

私はあなたがそのようなものを扱う場合は、このヘルプを願っています。

関連する問題