0

У меня есть следующая функция, которая обновляет содержимое UpdatePanel путем добавления/загрузке ASCX пользовательского UserControl в заполнитель, который находится в default.aspx:пользовательский контент UserControl в UpdatePanel исчезает кнопка мыши постбэка

protected void NavigationTab_Click(string ascxpath) 
       {   
         Control ctrl = LoadControl(ascxpath); 
         //cphmaincontent is my asp ContenPlaceHoderId in masterpage 
         PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent"); 
         phmaincontent.Controls.Clear(); 
         phmaincontent.Controls.Add(ctrl); 
         upmaincontent.Update();    
       } 

Masterpage UpdatePanel:

<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <asp:Label ID="lbmsg" runat="server" Text=""></asp:Label> 
         <asp:ContentPlaceHolder ID="cphmaincontent" runat="server">      
         </asp:ContentPlaceHolder>       
        </ContentTemplate> 
       </asp:UpdatePanel>    

Я зову NavigationTab_Click от моего навигационного управления, который является еще одним пользовательским элементом управления ASCX, мой объект Ctrl управления, который загружается динамически на каждый из них имеют кнопки и ярлык Я нажимаю кнопку, чтобы просто переназначить текст на ярлык.

и у меня есть этот следующий код на моем MasterPage просто получить путь управления ASCX:

protected override void OnInit(EventArgs e) 
     {   
       //raising an event to set ascx path 
       mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click); 

       base.OnInit(e);   
     } 

до сих пор все работает хорошо, после загрузки моего объекта CTRl, вызвав функцию NavigationTab_Click я вижу свою Ct в заполнителе и имеет кнопку и метку, но проблема в этом, если я нажму на эту кнопку, она должна переназначить ярлык на какой-то текст, но вместо этого весь контент управления ctrl исчезнет, ​​пожалуйста, помогите.

ответ

0

Когда вы добавляете элементы управления динамически, вы должны убедиться, что он воссоздается при каждой обратной передаче. Вы также должны убедиться, что вы назначаете тот же идентификатор, что и раньше, иначе события не будут запускаться правильно и значения не могут быть перезагружены из ViewState. Это должно быть сделано как минимум Page_Load (лучше в Page_Init).

Вот почему вам следует избегать динамического контроля, когда это возможно.

Таким образом, вы можете добавлять элементы управления в обработчики событий, как вы это делали. Но они должны быть воссозданы в следующем Postback. Таким образом, вам нужно хранить где-нибудь что (f.e. ID) или сколько элементов управления уже создано. Это можно сделать, например, в ViewState или Session. Затем вы можете назначить соответствующие идентификаторы элементам управления (например, с индексированным индексом или идентификатором).

Вот некоторые дополнительные сведения по этому вопросу:

+0

, если я, чтобы мои классы сериализации, то я не думаю, что мне нужно создать ViewState для каждого элемента управления Я просто сохранил объект класса, затем я отбросил его и правильно назначил им элементы управления. –

+0

Кроме того, я добавил это «ViewState [" ASCXPATH "] = ascxpath;" в моей «NavigationTab_Click()», которую они все в masterpage.cs, затем я проверил в Page_Load(), если ViewState ["ASCXPATH"]! = null, снова вызовет ту же функцию "NavigationTab_Click (ViewState [" ASCXPATH "]. ToString ()) « , но я все еще не могу его загрузить, потому что когда я отлаживал его, ViewState [" ASCXPATH "] был все еще null, который, я думаю, не должен! –

+0

@NazoTajrian: не храните экземпляр управления в ViewState, а только ту информацию, которая вам нужна, чтобы воссоздать их правильно. На самом деле я еще не разобрался, почему вы добавляете их динамически на страницу вместо переключения своего свойства «Видимый». У вас есть статическое количество NavigationTabs, не так ли? Если вы ответите «да», не добавляйте свой UserControl динамически. –

Смежные вопросы