Asp.net Formview с сеткой внутри рабочего примера Edit/InsertTemplate

Я использую FormView для редактирования своих бизнес-объектов. У меня нет проблем с редактированием/вставкой отдельных свойств.

Некоторые из бизнес-объектов имеют свойства коллекции, которые я хотел бы изменить/вставить так же, как я делаю это для отдельных свойств: Text='<%# Bind("SinglePropertyName") %>'.

Поэтому я хотел бы включить представление сетки внутри шаблонов редактирования/вставки и привязать (двустороннее) его источник данных к свойству коллекции: Datasource='<%# Bind("CollectionPropertyName") %>'. Затем я хотел бы иметь возможность редактировать элементы свойств коллекции с помощью самого gridview и получать измененные значения среди изменений других свойств sigleproperties.

Это отлично работает, чтобы показать шаблон, коллекция отображается в виде сетки. Проблема в том, чтобы получить изменения на нем.

Я пытался сделать это безуспешно, я получаю следующее исключение при попытке привязать данные к сетке: методы привязки данных, такие как Eval(), XPath() и Bind(), можно использовать только в контексте элемента управления с привязкой к данным.

Кроме того, NewValues ​​FormView для CollectionProperty из события ItemUpdating всегда возвращает значение null.

Поэтому я хотел бы увидеть рабочий пример аналогичного сценария, чтобы увидеть, смогу ли я это сделать или мне нужно использовать другой подход.

Спасибо!


person machocr    schedule 20.10.2011    source источник


Ответы (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();
            }
        }
    }

Я надеюсь, что это поможет вам, если вы имеете дело с чем-то подобным.

person machocr    schedule 22.10.2011