如何创建动态控件以响应按钮单击?

时间:2012-11-26 20:42:03

标签: c# asp.net ajax

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

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

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

我认为我的问题是,当我使用一个dropdownmenu导致回发时,我丢失了另一个dropdownmenu,因为我在button_click处理程序中创建了它。

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

或者,您可以在C#中使用许多常规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。同样,代码隐藏非常糟糕,我只使用这个例子,因为它很容易在项目中自行调试以便自己测试。