【问题标题】:ASP.NET LinkButtonASP.NET 链接按钮
【发布时间】:2015-01-28 23:52:36
【问题描述】:

我正在开发一个在运行时加载 LinkBut​​ton 对象的用户控件 (ascx)。当在 Page_Load 中加载 aspx 页面时,每个 LinkBut​​ton 的数据源是 Dictionary 的一个条目,例如 ((ferrari, 2), (chevrolet, 10), (jeep, 6)) 随机排序。当用户单击 LinkBut​​ton 执行 PostBack 以查询有关该项目的附加信息的数据库。但是当执行到达事件时:

protected void objHyperLink_Click (object sender, EventArgs e)

不再是启动事件调用的同一个项目,而是一个不同的项目。如何获取启动事件的正确对象?

谢谢

【问题讨论】:

  • 如果您为所有按钮分配相同的事件,sender 应该是启动事件的那个。如果需要,您可以通过DirectCast(sender As LinkButton) 将其转换为LinkButton
  • 您应该在PreInit 事件中创建动态控件,而不是在Load 事件中。
  • @Cᴏʀʏ 不需要DirectCast()。 C# 可以将其与 as 语法一起使用。例如LinkButton btn = sender as LinkButton;
  • @mason:哇,我想了一秒钟我在看 VB.NET 代码......我需要更多的咖啡!
  • 问题是当某个item的click事件触发如(fiat, 20)时,执行返回到Page_Load并随机重新排列字典。当它到达事件时,objHyperLink_Click 不再对应于“fiat”,而是任何其他的,例如 (ford, 30)

标签: c# asp.net linkbutton


【解决方案1】:

鉴于您问题的评论线程,听起来您只希望随机分配在页面生命周期中发生一次,然后在您处理按钮单击之前阻止它再次随机化。您可以通过检查页面是否回发来做到这一点(这是在您单击其中一个按钮之后发生的事情,并且服务器在页面生命周期返回到您的点击处理程序之前会发生这种情况)。

Icemanind 建议将这项工作从Page_Load 中移出,这可能是个好主意,但您仍然需要同样的IsPostBack 检查。

public void Page_PreInit(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // create buttons
    }
}

public void Page_Init(object sender, EventArgs e)
{
    // The buttons exist, now assign events to them
}

我建议阅读臭名昭著的ASP.NET Page Life Cycle Overview MSDN 文章,以更好地了解您应该在哪些页面事件中执行某些操作。

使用上面文章的摘录,你可以看到我为什么使用上面的方法:

  • PreInit: "创建或重新创建动态控件。"
  • Init: "使用此事件读取或初始化控件属性。"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多