动态添加的ASP.NET控件从后面的代码中看不到

时间:2010-07-07 01:56:17

标签: c# asp.net controls checkbox

我正在以递归的方式从后面的代码向asp.net页面添加一组动态构建的复选框:

pnlPageAccessList.Controls.Add(myCheckboxControl);

控件在页面上显示正常,但是当我查看源代码时它们不会显示,也无法从后面的代码中访问它们。 如果我在on_init方法中添加控件,它们就可以工作。但是我有一些业务规则驱动对控件列表本身的更改,这需要我在别处激活add方法。 谁看过这个吗?我没有工作,所以我无法复制确切的代码。

关于如何让它发挥作用,我有两个可怕的想法。一个涉及一些jQuery和一组隐藏的控件,包含大量的整数;另一个是运行方法on_init和我的其他事件,所以控件至少会显示出来。两者都闻起来像丑陋的黑客。我怀疑第二个不会从复选框中读取值。

4 个答案:

答案 0 :(得分:4)

在服务器端,每次回发都会从头开始重新创建页面,因此如果您动态添加任何控件,则必须在每次回发时重新添加它们。

在运行时添加控件时,它们在编译时是未知的,因此没有为Page对象中的控件声明变量。如果要访问控件,则必须在创建控件时保留引用,或者在放置它们的Controls集合中找到它们。

答案 1 :(得分:3)

如果您可以设置复选框控件的ID,则可以使用代码后面的FindControl方法来检索控件实例。

答案 2 :(得分:1)

@Anero是正确的,您可以添加ID并使用FindControl。

您还可以使用复选框列表,并向该列表添加复选框。然后,他们已经在您的标记和代码隐藏的预定义控件中。

您没有说出必须触发该方法的位置,但是一旦动态添加它们,就必须在每次回发时添加它们。您可能比在Init事件中添加它们更具灵活性,只要您了解验证发生的位置(在这种情况下是否重要),或者您想要处理复选框内容的位置。您可以推迟到PreRender获取复选框内容。

答案 3 :(得分:0)

好吧,看起来我将不得不在客户端做到这一点。谢谢你的回答。我能够做到On_Init,但是使用隐藏控件做客户端会为我节省很多开销并且更加灵活地向前发展。

如果有人好奇,这里是用于查找所有已选中复选框并将其value属性放入逗号分隔列表中的隐藏控件的jQuery:

<script type="text/javascript">
    $(document).ready(function () {
        $('[id*=PagesPanel]').find(':checkbox').click(function () {
            $('[id*=PagesPanel]').find(':checked').each(function () {
                $('[id*=lblHiddenPageArray]').append($(this).val() + ", ");
            });
        });
    });
</script>