Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在嵌套的Listview中编辑数据_C#_.net_Asp.net_Linq_Listview - Fatal编程技术网

C# 如何在嵌套的Listview中编辑数据

C# 如何在嵌套的Listview中编辑数据,c#,.net,asp.net,linq,listview,C#,.net,Asp.net,Linq,Listview,我使用listview显示项目列表,使用嵌套的listview显示每个项目的功能列表。父列表视图和子列表视图都需要能够执行插入、编辑和删除操作。它适用于父listview。但是,当我试图编辑子项时,“编辑”按钮不会使其进入编辑模式。你能告诉我我的代码缺少什么吗 <asp:ListView ID="lvParent" runat="server" OnItemDataBound="lvParent_ItemDataBound"

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

<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>
编辑:

如果在“ItemEditing”事件中使用“lvChild.DataBind()”,则单击“edit”时,子项的总列表将消失

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

                lvChild.EditIndex = e.NewEditIndex;              


            }

如果我在ItemEditing事件中去掉了“lvChild.Databind”,它会在单击“编辑”按钮两次后进入编辑模式。虽然它显示EditItemTemplate的textbox控件,但它显示为一个空白的textbox(不将现有值绑定到编辑)。

这是一个有趣的问题。几乎可以肯定,这是一个数据绑定问题。要进入编辑模式,必须执行两项操作:

1) 设置编辑索引
2) 调用数据绑定()

但是在嵌套中继器的情况下。。。什么时候调用渲染?我怀疑您必须对父级调用DataBind(),才能正确呈现所有内容。在这种情况下,您可能需要再次设置EditIndex,因为您正在重新绑定父级

编辑:
好啊我只是在嵌套的GridView中尝试了这一点,我不必对父对象进行DataBind()操作,就可以让子网格进入编辑模式。现在我不得不否决我自己的答案|

希望它能为某个人、某个地方服务

下面是我的代码,让它工作:

1) 我有一个Listview,它在编辑时包含一个用户控件。此用户cotnrol的内部有一个listview

<asp:ListView runat=server ID=C_LV_MyObjects DataKeyNames="Id" 
    OnItemDataBound=DataBoundMyObjects OnItemEditing=ItemEditing
     >
<LayoutTemplate>
            <table runat=server id="itemPlaceholderContainer">
                <tr>
                    <th>
                        Description
                    </th>
                </tr>
                <tr runat="server" id="itemPlaceholder">
                </tr>
            </table>
        </LayoutTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    text...
                </td>
                <td>
                    <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
                </td>
                <td>
                    <asp:LinkButton runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton>
                </td>
         </ItemTemplate>
         <EditItemTemplate>
            <tr>
                <td colspan=3>
                   <MyTag:MyUC ID=C_UC_MyUserControl runat=server 
                                OnEditing=MyObjectEditing
                                 />
                </td>
            </tr>
        </EditItemTemplate>
        <EmptyDataTemplate>
            No results found!
        </EmptyDataTemplate>
    </asp:ListView>
我的Usercontrol的代码如下:

<asp:PlaceHolder runat="server" ID="C_PH_ObjComposition">
    <asp:ListView runat="server" ID="C_LV_AppaltatoreComposizione" DataSource="<% # DataSource %>"
        DataKeyNames="Id" OnItemEditing="ItemEditing">

           etc...

 <ItemTemplate>
            <tr>
                <td>
                    <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
                </td>
            </tr>
        </ItemTemplate>
        <EditItemTemplate>
            <tr>
                <td>
                    Edit Mode
                </td>
             </tr>
        </EditItemTemplate>
    </asp:ListView>
</asp:PlaceHolder>
当单击innerlistview的edit按钮时,我们存储所单击的索引,并在第一个容器用户控件中触发一个函数。这个函数将把索引裁剪并触发outter列表的数据绑定存储在一个全局值中。这样我们就得到了onitemdatabound,这将使用适当的值重新创建usercontrol,然后我们可以在usercontrol的数据绑定之前分配编辑行的索引

如果您有任何问题,请随时回答

再见

<asp:ListView runat=server ID=C_LV_MyObjects DataKeyNames="Id" 
    OnItemDataBound=DataBoundMyObjects OnItemEditing=ItemEditing
     >
<LayoutTemplate>
            <table runat=server id="itemPlaceholderContainer">
                <tr>
                    <th>
                        Description
                    </th>
                </tr>
                <tr runat="server" id="itemPlaceholder">
                </tr>
            </table>
        </LayoutTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    text...
                </td>
                <td>
                    <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
                </td>
                <td>
                    <asp:LinkButton runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton>
                </td>
         </ItemTemplate>
         <EditItemTemplate>
            <tr>
                <td colspan=3>
                   <MyTag:MyUC ID=C_UC_MyUserControl runat=server 
                                OnEditing=MyObjectEditing
                                 />
                </td>
            </tr>
        </EditItemTemplate>
        <EmptyDataTemplate>
            No results found!
        </EmptyDataTemplate>
    </asp:ListView>
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();

            }
        }
<asp:PlaceHolder runat="server" ID="C_PH_ObjComposition">
    <asp:ListView runat="server" ID="C_LV_AppaltatoreComposizione" DataSource="<% # DataSource %>"
        DataKeyNames="Id" OnItemEditing="ItemEditing">

           etc...

 <ItemTemplate>
            <tr>
                <td>
                    <asp:LinkButton runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
                </td>
            </tr>
        </ItemTemplate>
        <EditItemTemplate>
            <tr>
                <td>
                    Edit Mode
                </td>
             </tr>
        </EditItemTemplate>
    </asp:ListView>
</asp:PlaceHolder>
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);

        }