Asp.net Formview с сеткой внутри рабочего примера Edit / InsertTemplate - PullRequest
0 голосов
/ 20 октября 2011

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

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

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

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

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

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

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

Спасибо!

1 Ответ

1 голос
/ 22 октября 2011

Я уже нашел решение этой проблемы, и оно заключалось в инкапсуляции 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();
            }
        }
    }

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

...