c# - 如何在嵌套 ListView 中编辑数据

标签 c# .net asp.net linq listview

我正在使用 ListView 来显示项目列表,并使用嵌套 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>

代码隐藏:

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 的文本框控件,但它显示为空白文本框(不绑定(bind)现有值以进行编辑)。

最佳答案

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

1) 设置EditIndex
2) 调用数据绑定(bind)()

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

编辑: 好的...我只是用嵌套的 GridView 尝试了这个,我不需要 DataBind() 父级来让子网格进入编辑模式。现在我不得不否决我自己的答案。 :|

关于c# - 如何在嵌套 ListView 中编辑数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/994944/

相关文章:

c# - Xamarin TimeZoneInfo.GetUtcOffset 抛出 NotImplementedException

c# - 正则表达式使用变量用于相同的字符串模式属性 C#

c# - 如何从远程 url 获取有效的文件名和扩展名以保存它。?

TreeViewItem 元素中的 C# 选项卡索引

c# - 在 ASP.NET 5 中访问中间件中的 DbContext

c# - 打印excel文档时设置打印机托盘

c++ - 通过串口发送字符串

c# - 根据单击的按钮将字符串绑定(bind)到文本框

c# - 将时间转换为十进制

c# - 如何从 aspx 引用 cs 中的常量?