【问题标题】:Nested Listview, Buttons inside event handler not working嵌套的Listview,事件处理程序内的按钮不起作用
【发布时间】:2017-03-08 16:33:32
【问题描述】:

我已经在网上到处寻找类似的情况,但不能,请帮助我,这件事让我发疯了。

好的,我要做的是在其中嵌套 ListView 和按钮,例如,后面的代码看不到在嵌套列表视图中单击的按钮。我有许多需要留下的列表视图组。如果我做 1 个 listview 父级(按钮可以看到并且可以工作)。当父 -> 子 -> 子(此处按钮无法看到)时,这就是问题发生的地方。

所有数据都是正确的,listview 分组都可以使用它只是那个该死的按钮。

一些 ASP 代码提前为缩进道歉。

<asp:ListView ID="lvSOLGrpDelAdd" runat="server" ItemPlaceholderID="plcSOLGrpAdd">
<LayoutTemplate>
    <table class="tblDespPackSOL">
        <tr class="tblDespPackSOLH">
        <td>O/N/L</td>       
        <td>Qty</td>
        <td>Code</td>
        <td>Description 1</td>
        <td>Description 2</td>
        <td>Unit Cost</td>
        <td>Total</td>
        <td>Qty Desp</td>
        <td>Allocate</td>
    </tr>

    <asp:PlaceHolder ID="plcSOLGrpAdd" runat="server" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr class="tblDespPackSOLAdd">
   <td colspan="9"><%# Eval("Name") %>, <%# Eval("A1")%>, <%# Eval("A2")%>, <%# Eval("TownCity")%>, <%# Eval("CountyState")%>,<%# Eval("Country")%>, <%# Eval("PostCodeZip")%></td>
</tr>

<asp:ListView runat="server" ID="lvSOLGrpDelMeth" OnItemDataBound="lvSOLGrpDelMeth_RowDataBound">
<ItemTemplate>

<tr class="tblDespPackSOLDelMeth">
    <td colspan="9">DELIVERY METHOD -->> <%# Eval("DescDelivMethod") %></td>
</tr>
<asp:ListView runat="server" ID="lvSOL" DataKeyNames="SalesOrderLine" OnItemDataBound="lvSOL_RowDataBound">
<ItemTemplate>
    <tr id="trSOL" runat="server" class="tblDespPackSOLNorm">
        <td>
            <asp:HiddenField ID="hdnSOL" runat="server" Value='<%# Eval("SalesOrderLine") %>' />
<%# Eval("SalesOrderLine") %></td>
<td><%# Eval("Qty") %></td>
<td><%# Eval("Code") %></td>
<td><%# Eval("Desc1") %></td>
<td><%# Eval("Desc2") %></td>
<td><%# Eval("Symbol") %><%# Eval("CombUnitPrice") %></td>
<td><%# Eval("Symbol")%><%# Eval("Total") %></td>
<td><asp:DropDownList ID="lstQtyAvail" runat="server" CssClass="FTxtLst" AutoPostBack="true" Width="40px" /></td>
<td>
<asp:Button ID="btnAllocateLine" runat="server" CssClass="FBtn" Text="Allocate" CommandName="Click" CommandArgument='<%# Eval("SalesOrderLine") %>' OnClick="btnAllocateLine_Click" /></td>
</tr>
</ItemTemplate>
</asp:ListView>

</ItemTemplate>
</asp:ListView>

</ItemTemplate>
</asp:ListView>

这是后面的一些vb代码

Protected Sub btnAllocateLine_Click(sender As Object, e As EventArgs)
   MsgBox("If this pops up its tells me it works and it is not at all")
   'If I try Handles btnAllocateLine.Click its tells me I need With Events
End Sub

Protected Sub Packing_Load(sender As Object, e As EventArgs) Handles Me.Load
    FuncUsers_Get()
    hdnIDSO.Value = tblUsers.IDOrder
    hdnIDUser.Value = tblUsers.ID

    lvSOLGrpDelAdd.DataSource = tblDespatchA.DespatchPackSOLGrpDelAdd_Get(IDSO:=hdnIDSO.Value)
    lvSOLGrpDelAdd.DataBind()

End Sub

Protected Sub lvSOLGrpDelAdd_RowDataBound(sender As Object, e As ListViewItemEventArgs) Handles lvSOLGrpDelAdd.ItemDataBound
    Dim lvSOLGrpDelMeth As ListView = DirectCast(e.Item.FindControl("lvSOLGrpDelMeth"), ListView)
    lvSOLGrpDelMeth.DataSource = tblDespatchA.DespatchPackSOLGrpDelMeth_Get(IDSO:=hdnIDSO.Value, IDGrpDelAdd:=DataBinder.Eval(e.Item.DataItem, "IDGrpDelAdd"))
    lvSOLGrpDelMeth.DataBind()
End Sub


Protected Sub lvSOLGrpDelMeth_RowDataBound(sender As Object, e As ListViewItemEventArgs)
    Dim lvSOL As ListView = DirectCast(e.Item.FindControl("lvSOL"), ListView)
    lvSOL.DataSource = tblDespatchA.DespatchPackSOL_Get(IDSO:=hdnIDSO.Value, IDGrpDelAdd:=DataBinder.Eval(e.Item.DataItem, "IDGrpDelAdd").ToString, IDGrpDelMeth:=DataBinder.Eval(e.Item.DataItem, "IDGrpDelMeth").ToString)
    lvSOL.DataBind()
End Sub

【问题讨论】:

    标签: asp.net vb.net listview button nested


    【解决方案1】:

    尝试在您的 lvSOL_RowDataBound 事件处理程序中使用 AddHandler 连接事件:

    Protected Sub lvSOL_RowDataBound(sender As Object, e As ListViewItemEventArgs)
    
        Dim btnAllocateLine As Button = CType(e.Item.FindControl("btnAllocateLine"), Button)
    
        AddHandler btnAllocateLine.Click, AddressOf btnAllocateLine_Click
    
    End Sub
    

    【讨论】:

    • 首先感谢您抽出宝贵时间回复。我尝试了你所说的,但它仍然不能双向工作,无论我使用 OnClick="btnAllocateLine_Click" 调用按钮还是尝试将其添加到 Handles btnAllocateLine.Click (这会变成红色,说明事件)。它必须与它呈现它的顺序有关。任何帮助将不胜感激。
    【解决方案2】:

    看在上帝的份上。我自己修好了。对于任何有类似问题的人,答案是鼓声!回发问题。

    我的加载代码绑定数据,但是每次单击任何按钮都会导致回发,即使我打开 AutoPostBack="False" 以及 ChildrenAsTriggers="false" 和 UpdateMode="Conditional" 它仍然会回发。因此,每次单击按钮时,它都会在触发按钮事件时重新绑定并与所有子级一起构建父级 Listview。

    简单的修复只是确保页面加载事件仅在页面加载而不是回发时触发。所以在下面添加 IsPostBack = False,下面的工作示例。

    Protected Sub Packing_Load(sender As Object, e As EventArgs) Handles Me.Load
    FuncUsers_Get()
    hdnIDSO.Value = tblUsers.IDOrder
    hdnIDUser.Value = tblUsers.ID
    
    If IsPostBack = False Then
    lvSOLGrpDelAdd.DataSource =   tblDespatchA.DespatchPackSOLGrpDelAdd_Get(IDSO:=hdnIDSO.Value)
    lvSOLGrpDelAdd.DataBind()
    End If
    

    结束子

    【讨论】:

    • 很高兴你能弄明白。做网络表单已经有一段时间了,所以我完全忘记了这个常见问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多