簡體   English   中英

動態添加的ASP.NET控件從后面的代碼中看不到

[英]ASP.NET controls added dynamically not visible from the code behind

我正在以遞歸的方式從后面的代碼向asp.net頁面添加一組動態構建的復選框:

pnlPageAccessList.Controls.Add(myCheckboxControl);

控件在頁面上顯示正常,但是當我查看源代碼時它們不顯示,也不能從后面的代碼中訪問它們。 如果我在on_init方法中添加控件,它們就可以工作。 但是我有一些業務規則驅動對控件列表本身的更改,這需要我在別處激活add方法。 誰看過這個嗎? 我沒有工作,所以我無法復制確切的代碼。

關於如何讓它發揮作用,我有兩個可怕的想法。 一個涉及一些jQuery和一組隱藏的控件,包含大量的整數; 另一個是運行方法on_init和我的其他事件,所以控件至少會顯示出來。 兩者都聞起來像丑陋的黑客。 我懷疑第二個不會從復選框中讀取值。

在服務器端,每次回發都會從頭開始重新創建頁面,因此如果您動態添加任何控件,則必須在每次回發時重新添加它們。

當您在運行時添加控件時,它們在編譯時是未知的,因此沒有為Page對象中的控件聲明變量。 如果要訪問控件,則必須在創建控件時保留引用,或者在放置它們的Controls集合中找到它們。

如果您可以設置復選框控件的ID,則可以使用后面的代碼中的FindControl方法來檢索控件實例。

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

您還可以使用復選框列表,並向該列表添加復選框。 然后他們已經在您的標記和代碼隱藏中的預定義控件中。

您沒有說出必須觸發該方法的位置,但是一旦它們被動態添加,就必須在每次回發時添加它們。 您可能比在Init事件中添加它們更具靈活性,只要您了解驗證發生的位置(在這種情況下是否重要),或者您想要處理復選框內容的位置。 您可以推遲到PreRender獲取復選框內容。

嗯,看起來我將不得不做客戶端。 謝謝你的回答。 我能夠做到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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM