2015-04-06 1 views
2

J'ai un contrôle utilisateur [ascx] qui est un radgrid. Il a également un modèle de colonne Modifier qui permet à l'utilisateur d'insérer/modifier/mettre à jour les valeurs.Erreur lors du chargement du contrôle utilisateur

Je suis en train de charger cette commande utilisateur en cliquant sur un bouton [Dites EDIT] dans la page aspx.

Lorsque je clique sur le bouton EDIT de la page aspx, le contrôle de l'utilisateur se charge parfaitement, mais lorsque je clique sur le Add New Record du contrôle utilisateur, je reçois ce message d'erreur.

Echec du chargement de viewstate. L'arborescence de contrôle dans laquelle viewstate est en cours de chargement doit correspondre à l'arborescence de contrôle utilisée pour enregistrer viewstate lors de la demande précédente. Par exemple, lors de l'ajout dynamique de contrôles , les contrôles ajoutés pendant un post-retour doivent correspondre à le type et la position des contrôles ajoutés lors de la demande initiale .

// code de contrôle utilisateur -ascx

<telerik:RadGrid AllowAutomaticDeletes="True" 
    AllowAutomaticInserts="False" AllowAutomaticUpdates="False" 
    Height="410px" ID="rgrd1" runat="server" AutoGenerateColumns="False" 
    OnUpdateCommand="rgrd1_UpdateCommand" 
    OnInsertCommand="rgrd1_InsertCommand" OnNeedDataSource="rgrd1_NeedDataSource" GridLines="None"> 

    <MasterTableView CommandItemDisplay="top" CommandItemStyle-Wrap="False" CommandItemStyle-HorizontalAlign="Left" 
     DataKeyNames="Type"> 
     <Columns> 
      <telerik:GridEditCommandColumn UniqueName="EditColumn" HeaderStyle-HorizontalAlign="left" 
       HeaderText="Edit" ButtonType="ImageButton"> 
      </telerik:GridEditCommandColumn> 
      <telerik:GridTemplateColumn DataField="Type" HeaderStyle-HorizontalAlign="left" 
       HeaderText="Type" UniqueName="Type"> 
       <ItemTemplate> 
        <asp:Label ID="TypeLabel" runat="server" Text='<%# Eval("Type") %>'></asp:Label> 
       </ItemTemplate> 
      </telerik:GridTemplateColumn> 

     </Columns> 
     <EditFormSettings EditFormType="Template"> 
      <EditColumn FilterControlAltText="Filter EditCommandColumn1 column" UniqueName="EditCommandColumn1"> 
      </EditColumn> 
      <FormTemplate> 
       <table> 
         <td> 
          <telerik:RadTextBox ID="txtType" Width="50" runat="server" Text='<%# Eval("Type") %>'> 
          </telerik:RadTextBox> 

         </td> 
        </tr> 
       </table> 
      </FormTemplate> 
     </EditFormSettings> 

    </MasterTableView> 
    <HeaderStyle HorizontalAlign="Center" /> 
</telerik:RadGrid> 

............................. ........ code de ma page ASPX - où je suis le chargement de la usercontrol ci-dessus dans Radwindow

sur clic de bouton EDIT - ci-dessous le code que j'ai written-

RadWindow window = new RadWindow(); 
window.Height = Unit.Pixel(500); 
window.Width = Unit.Pixel(500); 
window.VisibleOnPageLoad = true; 
UserControl uc = (UserControl)Page.LoadControl("../../Controls/TypeUserControl.ascx"); 
uc.EnableViewState = false; 
window.ContentContainer.Controls.Add(uc); 
pnl.Controls.Add(window); 

Quand je cliquez sur Add New Record dans usercontrol il lève l'exception "Impossible de charger l'état d'affichage:"

J'ai la page aspx sur laquelle ce contrôle utilisateur est chargé est héritée par mon BasePage.

Exception vient à OnPreRender de la page de base

protected override void OnPreRender(EventArgs e) 
{ 
    try 
    { 
     base.OnPreRender(e); 
    } 
} 

contrôle de l'utilisateur - Code behing

public partial class TypeUserControl : System.Web.UI.UserControl 
{ 

    protected void rgrd1Types_NeedDataSource(object source, GridNeedDataSourceEventArgs e) 
    { 
     try 
     { 
      //dbase call 
     } 
     catch (Exception ex) 
     { 
      SetValidationMessage(ex.Message.ToString()); 
     } 
    } 

    protected void rgrd1_InsertCommand(object source, GridCommandEventArgs e) 
    { 
     try 
     { 
      //dbase call 

     } 
     catch (Exception ex) 
     { 
      SetValidationMessage(ex.Message.ToString()); 
     } 
    } 
+0

quelle ligne est de lancer l'erreur .. si vous supprimez le chemin et juste avoir les éléments suivants 'UserControl uc = (UserControl) Page.LoadControl (« TypeUserControl.ascx »)?' – MethodMan

+0

exception vient sur l'événement PreRender de la page de base –

+0

s'il vous plaît lire la réponse suivante située ici .. semble que vous ne pouvez pas besoin de cet appel http://stackoverflow.com/questions/18984242/why-and-when-to-override-and-use-onprerender-in -asp-net – MethodMan

Répondre

0

je ne sais pas si cela est le problème, mais votre code HTML est incorrect dans votre modèle de formulaire

    <table> 

          <td> 
           <telerik:RadTextBox ID="txtType" Width="50" runat="server" Text='<%# Eval("Type") %>'> 
           </telerik:RadTextBox> 

          </td> 
         </tr> 

        </table> 

il vous manque l'ouverture <tr> tag. Cela pourrait avoir quelque chose à voir avec le problème.

vous devriez vérifier tout votre code pour vous assurer qu'il est correct.

-

Je suppose que vous devez supprimer cette ligne de code de l'événement bouton Modifier OnClick()

uc.EnableViewState = false; 
+0

mon mauvais, j'ai raté la balise Opening tr ... –

+0

Est-ce que le code fonctionne maintenant? Est-ce que cela a réglé le problème? – Malachi

+0

Non - J'ai manqué tr - mais cela ne devrait pas être la cause réelle. –

0

Vous devez recréer le contrôle sur postback que vous ajoutez dynamiquement. Recréer ou Ajouter le contrôle dans le gestionnaire d'événements Init_page, vous pouvez vérifier ici le type d'événement ou de contrôle qui a provoqué la publication, à savoir que vous devez recréer ce contrôle. Pouvez-vous publier le fichier code-behind.

EDIT: Il y a longtemps, quand je l'ai fait. Mais voici un exemple de travail. Je pense qu'il y a un meilleur moyen. Vérifiez la collection de clés, quel bouton a causé la publication, si c'est un certain bouton dans votre contrôle ascx puis readd votre contrôle à la page ou où vous l'avez mis, mais il doit être le même endroit sur la publication, sinon vous obtiendrez un erreur, je pense.

protégée override void OnInit (EventArgs e) {base.OnInit (e);

 if (this.Page.IsPostBack)   { 
      var x = base.DeterminePostBackMode(); 

      if (x.Keys.Get(3).Contains("btnInControl")) 
      { 
       Control ctrl = Page.LoadControl("WebUserControl1.ascx"); 
       this.Page.Form.Controls.Add(ctrl); 
      }  
} 
} 
+0

pouvez-vous élaborer un peu plus à ce sujet - je comprends quand je clique sur le bouton [Modifier] c'est un appel de post retour - alors comment je recréer le contorl sur page_init –

+0

mis à jour ma réponse ... ceci est la mise en œuvre de base, vous devez l'optimiser plus tard. – Legends

+0

Lorsque je clique sur "Ajouter un nouvel enregistrement" bouton de contrôle utilisateur - je reçois P = null [var p = GetPostBackControl (this.Page)] –

0

Il a été une année depuis que vous avez publié cette question, mais juste au cas où quelqu'un encore face à ceci: voici la racine principale de ce type d'erreur. J'ai lutté beaucoup de temps avec ça.

  • La meilleure façon de réparer votre bug est de mettre à la commande que vous ajoutez dynamiquement:

    EnableViewState = false 
    
  • Si vous avez besoin Viewstate, les autres options que vous avez devez ajouter le contrôle que vous ajoutez dynamiquement onInit, ou le recréer à chaque publication.

Espérons que cela aide. Pour plus d'informations, voir Funkylife's comment pour plus d'informations.