如何在嵌套Listview中编辑数据

我使用listview显示项目列表和嵌套列表视图,以显示每个项目的function列表。 父级和子级列表视图都需要能够插入,编辑和删除操作。 它适用于父列表视图。 但是当我尝试编辑子项时,编辑按钮不会将其置于编辑模式。 你能告诉我我的代码中缺少什么吗?

   
Description <asp:TextBox ID="txtDescription" runat="server" Text='' TextMode="MultiLine" >
Feature List <asp:ListView ID="lvChild" runat="server" InsertItemPosition="LastItem" DataKeyNames="FeatureID" OnItemCommand="lvChild_ItemCommand" OnItemCanceling="lvChild_ItemCanceling" OnItemDeleting="lvChild_ItemDeleting" OnItemEditing="lvChild_ItemEditing" OnItemInserting="lvChild_ItemInserting" OnItemUpdating="lvChild_ItemUpdating" DataSource='' >
  • <asp:ImageButton ID="btnEdit" runat="server" ImageUrl="/Images/edit_16x16.gif" AlternateText= "Edit" CommandName="Edit" CommandArgument='' Width="12" Height="12" /> <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Delete" CommandName="Delete" CommandArgument='' Width="12" Height="12" />
  • <asp:TextBox ID="txtFeature" Text='' runat="server">
    <asp:ImageButton ID="btnUpdate" runat="server" ImageUrl="/Images/ok_16x16.gif" AlternateText= "Update" CommandName="Update" CommandArgument='' Width="12" Height="12" />
  • <asp:Button ID="btnSave" runat="server" Text="Save" CommandName="Save" CommandArgument='' /> <asp:Button ID="btnDelete" runat="server" Text="Delete" CssClass="Cancel" CommandName="Delete" CommandArgument='' />

    代码背后:

     protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack == false) { BindData(); } } private void BindData() { MyDataContext data = new MyDataContext(); var result = from itm in data.ItemLists where itm.ItemID == iItemID select new { itm.ItemID, itm.Description, FeatureList = itm.Features }; lvParent.DataSource = result; lvParent.DataBind(); } protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) { ListView lvChild = sender as ListView; lvChild.EditIndex = e.NewEditIndex; lvChild.DataBind(); } 

    编辑:

     protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) { ListView lvChild = sender as ListView; lvChild.EditIndex = e.NewEditIndex; lvChild.DataBind(); } 

    如果我在“ItemEditing”事件中使用“lvChild.DataBind()”,如果单击“编辑”,子项的总列表就会消失

     protected void lvChild_ItemEditing(object sender, ListViewEditEventArgs e) { ListView lvChild = sender as ListView; lvChild.EditIndex = e.NewEditIndex; } 

    如果我在ItemEditing事件中删除’lvChild.Databind’,它会在单击“编辑”按钮两次后进入编辑模式。 虽然它显示了EditItemTemplate的文本框控件,但它显示为空白文本框(不绑定要编辑的现有值)。

    这是一个有趣的问题。 几乎可以肯定是一个数据绑定问题。 要进入编辑模式,您必须做两件事:

    1)设置EditIndex
    2)调用DataBind()

    在嵌套中继器的情况下…… Render何时被调用? 我怀疑你必须在PARENT上调用DataBind()才能正确呈现所有内容。 在这种情况下,您可能必须再设置EditIndex,因为您正在重新绑定父级。

    编辑:好的…我只是尝试使用嵌套的GridView,我没有使用DataBind()父网格来让子网格进入编辑模式。 现在我不得不低估自己的答案。 :|

    希望能在某个地方为某人服务。

    以下是我的代码:

    1)我有一个Listview,它在编辑时拥有用户控件。 这个用户cotnrol里面有一个listview

       
    Description
    text... No results found!

    此列表视图的代码c#如下:

     public int EditIndexComposition; protected void ItemEditing(object sender, ListViewEditEventArgs e) { C_LV_MyObjects.EditIndex = e.NewEditIndex; C_LV_MyObjects.DataBind(); } protected void MyObjectEditing(object sender, EventArgs e) { ListViewEditEventArgs MyEvent = (ListViewEditEventArgs)e; if (MyEvent != null) EditIndexComposition= MyEvent.NewEditIndex; C_LV_MyObjects.DataBind(); } protected void DataBoundMyObjects(object sender, ListViewItemEventArgs e) { MyUC uc = (MyUC)e.Item.FindControl("C_UC_MyUserControl"); if (uc!=null) { uc.EditIndex = EditIndexComposition; ListViewDataItem dataItem = (ListViewDataItem)e.Item; MyObject obj= (MyObject)dataItem.DataItem; uc.DataSource=Myservice.GetDatasource(obj.Id); uc.DataBind(); } } 

    我的Usercontrol的代码如下:

       etc...           Edit Mode      

    使用以下代码c#:

     public int EditIndex { get {return C_LV_ObjComposition.EditIndex;} set { C_LV_ObjComposition.EditIndex=value;} } public event EventHandler Editing; protected void ItemEditing(object sender, ListViewEditEventArgs e) { C_LV_ObjComposition.EditIndex = e.NewEditIndex; if (Editing != null) Editing(this, e); } 

    单击innerlistview的edit按钮时,我们存储被单击的索引,并在第一个容器用户控件中触发一个函数。 此函数将存储在索引cliked的全局值中,并触发outter列表的数据绑定。 这样做我们得到onitemdatabound,它将使用正确的值重新创建我们的usercontrol,然后我们可以在usercontrol的数据绑定之前分配编辑行的索引。

    如果您有任何疑问,请随便回答..

    再见!