【问题标题】:Updatepanel listview linkbutton issue > Function executed only onceUpdatepanel listview 链接按钮问题 > 函数仅执行一次
【发布时间】:2015-10-24 03:13:52
【问题描述】:

我对这个越来越绝望。我从 Web 服务接收树数据结构并尝试提出浏览器和搜索功能。为了浏览结构,我使用了一个包含列表视图的更新面板,其中包括指向结构子级别的链接按钮(类似于文件夹资源管理器视图)。 问题是链接按钮仅适用于第一个子级别,当在子文件夹中链接按钮不会触发相应的功能而只会重新加载页面。

例子:

结构:

Root
- Folder 1
  - Folder A
  - Folder B
    - Folder b1
    - Folder b2
    - Folder b3
  - Folder c
  - Folder D 
- Folder 2
- Folder 3

页面加载:

- Folder 1
- Folder 2
- Folder 3

点击文件夹 1:

- Folder A
- Folder B
- Folder c
- Folder D 

点击文件夹 B 重新加载带有根结构的页面而不是加载:

- Folder b1
- Folder b2
- Folder b3

apsx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="TMSD4CJ._default" ClientIDMode="AutoID"%>
<%@ Register TagPrefix="sb" TagName="SearchBox" Src="~/Controls/SearchBox.ascx" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta charset="utf-8" />
</head>
<body>
    <form id="form1" runat="server">
        <div class="container">
                    <asp:ScriptManager ID="SM" runat="server" EnablePartialRendering="true" /> 
                    <asp:UpdatePanel ID="upnl" runat="server" UpdateMode="Always">

                    <ContentTemplate>
                        <asp:ListView ID="lstView_entries" runat="server" OnItemDataBound="lstView_entries_ItemDataBound">
                            <LayoutTemplate>
                                <table class="table table-hover">
                                    <tr id="ItemPlaceholder" runat="server">
                                    </tr>
                                </table>
                            </LayoutTemplate>         
                            <ItemTemplate>
                                <tr>
                                    <td><asp:LinkButton runat="server" ID="lbtn_entryName"  OnCommand="lbtn_entryName_Click" CommandArgument=""></asp:LinkButton></td>
                                </tr>
                            </ItemTemplate>
                            </asp:ListView>
                        </ContentTemplate>       
                        </asp:UpdatePanel>
                    </div>
                </div>
            </div>
        </div>
    </form>
</body>
</html>

CS 页面:

protected void lstView_entries_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        LinkButton lbtnEntryName = (LinkButton)e.Item.FindControl("lbtn_entryName");
        var itemType = e.Item.DataItem.GetType();
        if(itemType == typeof(Catalog))
        {
            Catalog currentItem = e.Item.DataItem as Catalog;
            lbtnEntryName.Text = currentItem.Name;
            lbtnEntryName.ToolTip = currentItem.Id;
            lbtnEntryName.CommandArgument = currentItem.Id;
            System.Diagnostics.Debug.WriteLine("Set Name: " + currentItem.Name + " Set ID: " + currentItem.Id);
        }

        SM.RegisterAsyncPostBackControl(lbtnEntryName);
    }
}

protected void lbtn_entryName_Click(object sender, CommandEventArgs e)
{
    Catalog rootCat = (Catalog)ViewState["catalogueEntries"];
    List<object> catalogueEntries = new List<object>();
    Catalog catFound = searchCatalogByID(rootCat, e.CommandArgument.ToString());

    lstView_entries.DataSource = catalogueEntries;
    lstView_entries.DataBind();
}

我在论坛上阅读了许多类似的问题(herehere),但没有得到解决。我会非常感谢第二双眼睛:-)

【问题讨论】:

    标签: asp.net updatepanel postback linkbutton


    【解决方案1】:

    好吧,我终于让它工作了,但我真的不明白为什么以及它是否是干净的代码。如果我使用 lbtn_entryName_Click 的内容创建一个函数,请添加一个回发检查并从该点调用该函数。

    protected void Page_Load(object sender, EventArgs e)
    {
      if(Page.IsPostBack)
      {
        LinkButton lbtn = sender as LinkButton;
        searchCatAndUpdateview(lbtn.CommandArgument);
      }
    }
    
    protected void searchCatAndUpdateview(string catID)
    {
      Catalog rootCat = (Catalog)ViewState["catalogueEntries"];
      List<object> catalogueEntries = new List<object>();
      Catalog catFound = searchCatalogByID(rootCat, catID);
      lstView_entries.DataSource = catalogueEntries;
      lstView_entries.DataBind();
    }
    

    任何人都可以确认这是否是一种正确的方式,并可能清除我们为什么 lbtn_entryName_Click 只能工作一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2019-04-23
      • 2018-11-05
      • 2016-07-15
      相关资源
      最近更新 更多