ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#动态创建的LinkBut​​ton命令事件处理程序

2019-12-10 21:07:41  阅读:198  来源: 互联网

标签:linkbutton asp-net c


所以我这里有一个奇怪的情况……我有一个System.Web.UI.WebControls.WebParts.EditorPart类.它呈现一个“搜索”按钮,当您单击该按钮时,它的clickHandler方法将进行数据库搜索,并为返回的每一行动态创建一个LinkBut​​ton,设置CommandName和CommandArgument属性并添加CommandEventHandler方法,然后添加LinkBut​​ton控件到页面.

问题是,当您单击LinkBut​​ton时,它的CommandEventHandler方法将永远不会被调用,它看起来就像页面只是回贴到按下原始“搜索”按钮之前的位置一样.

我看到有帖子说您需要在OnLoad()或其他早期方法中添加事件处理程序,但是直到用户告诉我们要搜索的内容并单击“搜索”按钮,我的LinkBut​​ton才创建.关于如何处理这个问题有什么想法吗?

谢谢!

解决方法:

这是我最喜欢的把戏:)

我们的方案是首先呈现一个控件.然后,使用来自用户的一些输入,渲染其他控件并使它们响应事件.

这里的关键是状态-您需要知道控件到达PostBack时的状态-因此我们使用ViewState.这个问题就变成了鸡与蛋的问题.直到LoadViewState()调用之后,ViewState才可用,但是您必须在调用之前创建控件才能正确触发事件.

诀窍是重写LoadViewState()和SaveViewState(),以便我们可以控制事物.

(请注意,下面的代码是粗糙的,来自内存,可能有问题)

private string searchQuery = null;

private void SearchButton(object sender, EventArgs e)
{
    searchQuery = searchBox.Text;
    var results = DataLayer.PerformSearch(searchQuery);
    CreateLinkButtonControls(results);
}

// We save both the base state object, plus our query string.  Everything here must be serializable.
protected override object SaveViewState()
{
    object baseState = base.SaveViewState();
    return new object[] { baseState, searchQuery };
}

// The parameter to this method is the exact object we returned from SaveViewState().
protected override void LoadViewState(object savedState)
{
    object[] stateArray = (object[])savedState;

    searchQuery = stateArray[1] as string;

    // Re-run the query
    var results = DataLayer.PerformSearch(searchQuery);

    // Re-create the exact same control tree as at the point of SaveViewState above.  It must be the same otherwise things will break.
    CreateLinkButtonControls(results);

    // Very important - load the rest of the ViewState, including our controls above.
    base.LoadViewState(stateArray[0]);
}

标签:linkbutton,asp-net,c
来源: https://codeday.me/bug/20191210/2104158.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有