Asp.net Formview พร้อม gridview ภายในตัวอย่างการทำงานของ Edit / InsertTemplate

ฉันใช้ FormView เพื่อแก้ไขออบเจ็กต์ทางธุรกิจของฉัน ฉันไม่มีปัญหาในการแก้ไข/แทรกคุณสมบัติเดี่ยว

ออบเจ็กต์ทางธุรกิจบางส่วนมีคุณสมบัติคอลเลกชันที่ฉันต้องการแก้ไข/แทรกในลักษณะเดียวกับที่ฉันทำกับคุณสมบัติเดียว: Text='<%# Bind("SinglePropertyName") %>'

ดังนั้นฉันต้องการรวม gridview ไว้ในเทมเพลตแก้ไข / แทรกและผูก (สองทาง) แหล่งข้อมูลเข้ากับคุณสมบัติคอลเลกชัน: Datasource='<%# Bind("CollectionPropertyName") %>' จากนั้น ฉันต้องการที่จะแก้ไขรายการคุณสมบัติของคอลเลกชันด้วย gridview เอง และรับค่าที่เปลี่ยนแปลงท่ามกลางการเปลี่ยนแปลงของ sigleproperties อื่น ๆ

วิธีนี้ใช้ได้ดีในการแสดงเทมเพลต คอลเลกชันจะแสดงผลใน gridview ปัญหาคือการได้รับการเปลี่ยนแปลง

ฉันพยายามทำเช่นนั้นโดยไม่มีโชค ฉันได้รับข้อยกเว้นต่อไปนี้เมื่อพยายาม Databind the gridview: วิธีการ Databinding เช่น Eval(), XPath() และ Bind() สามารถใช้ได้เฉพาะในบริบทของตัวควบคุม databound เท่านั้น

นอกจากนั้น NewValues ​​ของ FormView สำหรับ CollectionProperty จากเหตุการณ์ ItemUpdating จะส่งคืนค่าว่างเสมอ

ดังนั้นฉันจึงอยากเห็นตัวอย่างการทำงานของสถานการณ์ที่คล้ายกันเพื่อดูว่าฉันสามารถทำได้หรือจำเป็นต้องใช้แนวทางอื่นหรือไม่

ขอบคุณ!


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