【问题标题】:How can I create dynamic controls in response to a button click?如何创建动态控件以响应按钮单击?
【发布时间】:2012-11-26 20:42:02
【问题描述】:

我想用新的动态控件填充更新面板以响应按钮单击。

但是,我还希望能够访问这些动态控件的值,以响应其中一个控件中的事件。

具体来说,我希望按钮显示两个下拉菜单。其中一个菜单(或两个如果需要)位于另一个更新面板中。我希望更新面板中的第一个菜单更改其数据以响应在另一个菜单中选择的值。

我认为我的问题是,当我使用一个下拉菜单进行回发时,我会丢失另一个下拉菜单,因为我是在 button_click 处理程序中创建的。

我知道我应该在 Page_Init 方法中创建动态控件(或者我听说过),但我只想在单击按钮时显示控件。页面上还有其他按钮需要创建一组不同的动态控件。

谢谢。

【问题讨论】:

  • 如果总是相同的 2 个控件,您可以只制作不可见/禁用的控件,然后在您的活动中启用/显示它们。
  • 我考虑过这一点,但按钮实际上是基于复选框创建控件。也就是说,它将为每个选中的复选框生成我提到的两个控件,并且总复选框的数量是可变的。所以我想,如果我需要制作隐藏控件,我不知道要制作多少。

标签: c# asp.net ajax


【解决方案1】:

有很多方法可以解决这个问题,具体采用哪种方法取决于您的项目要求和可用资源。

通常会提供最佳用户体验的最流畅的方法是使用 Javascript 技术在页面需要时隐藏和显示控件。 JQuery 是我推荐的图书馆。在最基本的层面上,您只需连接控件的激活(例如 button_click 事件)并根据需要隐藏或显示包含动态内容的 div,如下所示:

$("#control").show();
// and
$("#control").hide();

或者,您可以在 C# 中通过在 ASP.NET 的许多常规 Web 控件上使用 Visible 属性来执行此操作。通常的代码隐藏方法如下所示:

private void btnControl_Click(object sender, EventArgs e)
{
    var dynamicControl1 = FindControl("dynamicControl1");
    dynamicControl.Visible = false; // or true, as the case may be
}

不过,这种特殊方法主要依赖于代码隐藏,我建议您尽可能避免使用。它们实际上无法测试,并且会使项目难以工作。您可以在 MVC3 框架中使用类似的方法,当然,发送和接收设置为不的控件的方式会有所不同可见的。这样做的另一个好处是,如果将某些内容设置为不可见,它甚至不会显示在模板引擎生成的 HTML 中(YMMV 取决于引擎,但我知道这在剃刀)。因此,查看您网页源代码的人将无法看到不活动的控件,这可能会或可能不会吸引您。

编辑:我认为问题不在于如何显示这些内容,而在于如何在动态输入的情况下创建和读取它们。

我确信有一种方法可以使用 Javascript 来做到这一点(这可能是最干净和最好的方法),但我对 JS 的了解还不够好,无法知道答案。您在 ASP.NET 中处理此问题的方式是制作您要向服务器端添加控件的 div(通过使用 runat='server',然后在那里添加您需要的内容。同样,微不足道的代码隐藏方法将是一些东西喜欢:

private void btnControl_Click(object sender, EventArgs e)
{
    foreach(var checkBoxChecked in chkBoxes.Where(x => x.Checked))
    {
        div.Controls.Add(new WebControl()) // or whatever the heck else it is you need.
    }
}

当然,这假定您有一个 IEnumerable<CheckBox> 可以迭代。您可能还需要IList<WebControl> 来跟踪您添加的所有垃圾。您还需要确保 CSS 正确应用于您要添加的控件的 div。再一次,代码隐藏非常糟糕,我使用这个示例只是因为它很容易在项目中启动以供自己测试。

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多