views:

1262

answers:

2

I am using listview to display a list of items and a nested listview to show list of features to each item. Both parent and child listview need to able Insert,Edit and delete operation. It works fine for parent listview. But when I try to edit an child item, The edit button does not take it into Edit mode. Can you please suggest me what I am missing in my code?

<asp:ListView ID="lvParent" runat="server"                 
                OnItemDataBound="lvParent_ItemDataBound" 
                onitemcanceling="lvParent_ItemCanceling" onitemcommand="lvParent_ItemCommand" 
                DataKeyNames="ItemID" onitemdeleting="lvParent_ItemDeleting" 
                oniteminserting="lvParent_ItemInserting"  >
                <LayoutTemplate>                                        
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
                    <div align="right">
                        <asp:Button ID="btnInsert" runat="server" Text="ADD Item" onclick="btnInsert_Click"/>
                    </div>
                </LayoutTemplate>
                <ItemTemplate>
                    <table runat="server" cellpadding="0" cellspacing="0" border="0"  width="100%">
                     <tr>
                         <td>
                             <div id="dvDetail">
                                    <span >Description</span>

                                    <asp:TextBox ID="txtDescription" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Description") %>' TextMode="MultiLine" ></asp:TextBox>

                                </div>                                
                                <div id="dvFeature" >
                                    <span>Feature List</span>                                                                  
                                    <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='<%# DataBinder.Eval(Container.DataItem, "FeatureList") %>' >
                                        <LayoutTemplate>
                                            <ul >
                                                <asp:PlaceHolder runat="server" ID="itemPlaceHolder" ></asp:PlaceHolder>                                                                                                                               
                                            </ul>   
                                        </LayoutTemplate>
                                        <ItemTemplate>
                                            <li>
                                                <span class="dvList"><%# DataBinder.Eval(Container.DataItem, "FeatureTitle")%></span>                                                

                                                <div class="dvButton" >
                                                    <asp:ImageButton ID="btnEdit" runat="server" ImageUrl="/Images/edit_16x16.gif" AlternateText= "Edit" CommandName="Edit" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" />
                                                    <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Delete" CommandName="Delete" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" />

                                                </div>

                                            </li>

                                        </ItemTemplate>
                                        <EditItemTemplate>
                                            <li>
                                                <asp:TextBox ID="txtFeature"  Text='<%# DataBinder.Eval(Container.DataItem, "FeatureTitle")%>' runat="server"></asp:TextBox>

                                                <div class="dvButton">
                                                    <asp:ImageButton ID="btnUpdate" runat="server" ImageUrl="/Images/ok_16x16.gif" AlternateText= "Update" CommandName="Update" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FeatureID") %>' Width="12" Height="12" />
                                                    <asp:ImageButton ID="btnCancel" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Cancel" CommandName="Cancel" Width="12" Height="12" CausesValidation="false" />

                                                </div>

                                            </li>
                                        </EditItemTemplate>
                                        <InsertItemTemplate>                                            
                                                <asp:TextBox ID="txtFeature" runat="server"></asp:TextBox>

                                                <div class="dvButton">
                                                    <asp:ImageButton ID="btnInsert" runat="server" ImageUrl="/Images/ok_16x16.gif" AlternateText= "Insert" CommandName="Insert" Width="12" Height="12" />
                                                    <asp:ImageButton ID="btnCancel" runat="server" ImageUrl="/Images/delete_16x16.gif" AlternateText= "Cancel" CommandName="Cancel" Width="12" Height="12" CausesValidation="false" />

                                                </div>

                                        </InsertItemTemplate>
                                    </asp:ListView>
                                </div>                                
                         </td>

                     </tr>
                     <tr>
                         <td align="right">
                             <div id="dvButton" >
                                    <asp:Button ID="btnSave" runat="server"  Text="Save" 
                                        CommandName="Save"  
                                        CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemID")  %>' />
                                    <asp:Button ID="btnDelete" runat="server" Text="Delete"  CssClass="Cancel" 
                                        CommandName="Delete" 
                                        CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ItemID")  %>' />
                                </div>
                         </td>

                     </tr>                 
                    </table>                   
                </ItemTemplate>                   

            </asp:ListView>

Code Behind:

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

        }

Edit:

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

                lvChild.EditIndex = e.NewEditIndex;

                lvChild.DataBind();

            }

If I use "lvChild.DataBind()" in 'ItemEditing' event, the total list of child items goes away if I click 'edit'

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

                lvChild.EditIndex = e.NewEditIndex;              


            }

if I get rid of 'lvChild.Databind' in ItemEditing event, it goes to Edit mode after clicking the 'edit' button twice . And though it shows textbox control of EditItemTemplate, it appears as a blank textbox (does not bind existing value to edit).

A: 

Hi, I'm having the exactly the same problem... has anyone got any solution yet...?

KZV
A: 

This is an interesting problem. Almost certainly a databinding issue. In order to enter edit mode you must do two things:

1) Set the EditIndex
2) Call DataBind()

In the case of nested repeaters though... when does Render get called? I suspect you will have to call DataBind() on the PARENT in order to render everything correctly. That being the case you may have to then set the EditIndex AGAIN, since you are rebinding the parent.

EDIT: OK... I just tried this with a nested GridView and I did NOT have to DataBind() the parent to get the sub grid to enter edit mode. Now I have to downvote my own answer. :|

Bryan