【问题标题】:Dynamically created linkbuttons' common event not firing动态创建的链接按钮的常见事件未触发
【发布时间】:2017-07-25 12:21:42
【问题描述】:

每当 DropDownList SelectedIndexChanged 发生时,我都会在代码隐藏中将 LinkBut​​tons 添加为 ul-li 列表。每个链接按钮都分配有 ID 和一个常见的 Click 事件。问题是 Click 事件中的代码未执行或未触发事件。我的代码如下:[编辑] 我按照其他帖子中的建议尝试了这样的操作 (dynamically created list of link buttons, link buttons not posting back)

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
   populate();
}

protected override void OnInit(EventArgs e)
{
   base.OnInit(e);
   populate();
}

void populate()
{
   HtmlGenericControl ulList = new HtmlGenericControl("ul");
   panel.Controls.Add(ulList);

   foreach (DataRow dr in drc) 
   {
      HtmlGenericControl liList = new HtmlGenericControl("li");
      ulList.Controls.Add(liList);

      var lnk = new LinkButton();
      lnk.ID = dr["col1"].ToString();
      lnk.Text = dr["col1"].ToString();
      lnk.Click += Clicked;
      liList.Controls.Add(lnk);
   }
}              

private void Clicked(object sender, EventArgs e)
{
   var btn = (LinkButton)sender;
   label1.Text = btn.ID.ToString();
}

我错过了一些东西。请帮忙。

【问题讨论】:

  • 那些事件不会在回发时绑定。
  • 在回发时运行代码。查看修改...
  • @Daniel 请查看编辑。 Still Clicked 事件未触发。
  • 最好的办法是在带有项目模板的面板中有一个数据列表或列表视图控件。将链接按钮放在项目模板中,并附加公共事件处理程序。在 ddl 的 selectedindexchanged 事件中,您需要对 listview 或 datalist 进行数据绑定。
  • @Chetan,我会试一试,然后回复你。

标签: c# asp.net visual-studio-2008


【解决方案1】:

这里的问题在于ViewState。当dropdownlist 的选定索引发生更改时,会发生postback,并且先前的状态会丢失,因此此时您必须保持控件的状态。

现在在您的代码中,控件的状态实际上已经丢失,因此click event 不会触发。所以解决办法就是保持控件的状态。

下面是一个工作示例,您可以粘贴并尝试。

这是我的page load

protected void Page_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < LinkButtonNumber; i++)
                AddLinkButton(i);
        }

同样你必须像这样保持之前添加的控件的状态。

private int LinkButtonNumber
        {
            get
            {
                var number = ViewState["linkButtonNumber"];
                return (number == null) ? 0 : (int)number;
            }
            set
            {
                ViewState["linkButtonNumber"] = value;
            }
        }

下面是我的SelectedIndexChangedEventDropDownList

protected void Example_SelectedIndexChanged(object sender, EventArgs e)
        {
            AddLinkButton(LinkButtonNumber);
            LinkButtonNumber++;
        }

我有一个动态创建控件的函数,该函数在页面加载和SelectedIndexChanged 上调用。

private void AddLinkButton(int index)
        {
            LinkButton linkbutton = new LinkButton { ID = string.Concat("txtDomain", index) };
            linkbutton.ClientIDMode = ClientIDMode.Static;
            linkbutton.Text = "Link Button ";
            linkbutton.Click += linkbutton_Click;
            PanelDomain.Controls.Add(linkbutton);
            PanelDomain.Controls.Add(new LiteralControl("<br />"));
        }

这是Click eventLinkButton

void linkbutton_Click(object sender, EventArgs e)
        {
            //You logic here
        }

【讨论】:

  • 我看到了您的问题并准备了该解决方案。 @Tres
  • 我的错,不能使用你的代码。我的框架仍然是 3.5。对不起
  • 没有。我的意思是 ClientIDMode 在 3.5 中不可用
  • @Tres 为了您的目的,您不需要 ClientIDMode。评论一下看看。但是您仍然想使用 javascript 访问元素,您仍然可以选择这样做 ,特别是对于 3.5 框架。
【解决方案2】:

我使用暴力代码解决了它,哈哈。 由于控件的事件在回发时未绑定,因此我们在回发时重新创建它们。因此,在我的 Page_Load 中,我调用了重新创建控件的模块,从而将它们绑定到相应的事件。这行得通,但是...

重新创建这些控件会创建重复项 (Multiple Controls with same ID were found),如果像使用 panel.FindControl 这样按 ID 查找控件,您将遇到麻烦。 为了解决这种情况,我在重新创建它们之前检查了相同的控件 ID 是否已经存在,瞧!它有效。

protected void Page_Load(object sender, EventArgs e)
{
   populate();
}

void populate()
{
   HtmlGenericControl ulList = new HtmlGenericControl("ul");
   panel.Controls.Add(ulList);

   foreach (DataRow dr in drc) 
   {
      HtmlGenericControl liList = new HtmlGenericControl("li");
      ulList.Controls.Add(liList);

      if (liList.FindControl(dr["col1"].ToString()) == null)
      {
          var lnk = new LinkButton();
          lnk.ID = dr["col1"].ToString();
          lnk.Text = dr["col1"].ToString();
          lnk.Click += Clicked;
          liList.Controls.Add(lnk);
      }
   }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2014-02-15
    相关资源
    最近更新 更多