0

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

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

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

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

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

谢谢。

4

1 回答 1

0

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

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

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

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

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。再一次,代码隐藏非常糟糕,我使用这个例子只是因为它很容易在一个项目中为自己测试。

于 2012-11-26T20:58:58.230 回答