2010-01-29 6 views
4

J'ai un accordéon AJAX de la boîte à outils de contrôle ajax sur une page avec une grille de données à l'intérieur des panneaux. J'ai un itemtemplate personnalisé pour la colonne pour créer une zone de texte multiligne lorsque je clique sur modifier sur la ligne. Lorsque je clique sur mettre à jour sur la ligne, le contenu original de la zone de texte est rendu dans la zone de texte. Il est censé mettre à jour et retourner au littéral et non à la zone de texte. Quand je mets le DataBind() dans un! IsPostBack, il n'est pas rendu quand je clique sur le volet accordéon. Des idées?Mise à jour de DataGrid dans l'accordéon AJAX

code:

protected void Page_Load(object sender, EventArgs e) 
     { 
      announ.HeaderStyle.CssClass = "header"; 
         announ.Width = Unit.Percentage(100); 
         announ.GridLines = GridLines.None; 
         announ.AutoGenerateColumns = false; 
         announ.CellPadding = 10; 
         announ.CellSpacing = 0; 
         announ.HorizontalAlign = HorizontalAlign.Center; 
         announ.HeaderStyle.Font.Bold = true; 
         announ.EnableViewState = false; 
         announ.AlternatingItemStyle.BackColor = System.Drawing.Color.GhostWhite; 
         //announ.DeleteCommand += AnnounDeleteCommand; 
         announ.EditCommand += announ_EditCommand; 
         announ.UpdateCommand += announ_UpdateCommand; 
         announ.CancelCommand += announ_CancelCommand; 
         announ.DataKeyField = "id"; 
         var tc1 = new TemplateColumn 
             { 
              HeaderTemplate = new 
               DataGridTemplate(ListItemType.Header, "Announcement"), 
              ItemTemplate = new DataGridTemplate(ListItemType.Item, "announcement_text"), 
              EditItemTemplate = new 
               DataGridTemplate(ListItemType.EditItem, "announcement_text") 
             }; 



        var editColumn = new EditCommandColumn 
             { 
              ButtonType = ButtonColumnType.PushButton, 
              HeaderText = "Edit", 
              EditText = "Edit", 
              UpdateText = "Update", 
              CancelText = "Cancel" 
             }; 
    var dateColumn = new BoundColumn {HeaderText = "Posted On", DataField = "date", ReadOnly = true}; 
        var expirationColumn = new BoundColumn {HeaderText = "Expiration Date", DataField = "expiration_date"}; 
    announ.Columns.Add(tc1); 
        announ.Columns.Add(dateColumn); 
        announ.Columns.Add(expirationColumn); 
    announ.DataSource = myAnnouncements; 
        announ.DataBind(); 

var deptMgtaccord = new Accordion 
             { 
              ID = "deptMgtaccord", 
              HeaderCssClass = "accordion-header", 
              HeaderSelectedCssClass = "accordion-headerSelected", 
              AutoSize = AutoSize.None, 
              SelectedIndex = 0, 
              FadeTransitions = true, 
              TransitionDuration = 250, 
              FramesPerSecond = 40, 
              RequireOpenedPane = false, 
              SuppressHeaderPostbacks = true 
             }; 
       if (IsPostBack) 
       { 
        deptMgtaccord.SelectedIndex = selected; 
       } 

       var announcementPane = new AccordionPane {ID = "announcementPane"}; 
       announcementPane.HeaderContainer.Attributes.Add("onmouseover", "this.style.backgroundColor='#e3e2e2';"); 
       announcementPane.HeaderContainer.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff';"); 
       announcementPane.HeaderContainer.Controls.Add(new LiteralControl("Announcements >>")); 
       announcementPane.ContentContainer.Controls.Add(announ); 
       deptMgtaccord.Panes.Add(announcementPane); 
       var statsPane = new AccordionPane {ID = "statsPane"}; 
       statsPane.HeaderContainer.Attributes.Add("onmouseover", "this.style.backgroundColor='#e3e2e2';"); 
       statsPane.HeaderContainer.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff';"); 
       statsPane.HeaderContainer.Controls.Add(new LiteralControl("Statistics >>")); 
       statsPane.ContentContainer.Controls.Add(new LiteralControl("Stats")); 
       deptMgtaccord.Panes.Add(statsPane); 
ph1.Controls.Add(deptMgtaccord); 
    } 

      protected void announ_CancelCommand(object source, DataGridCommandEventArgs e) 
      { 
       announ.EditItemIndex = -1; 
       announ.DataBind(); 
      } 

      protected void announ_UpdateCommand(object source, DataGridCommandEventArgs e) 
      { 
       var dc = new MTCDataDataContext(); 
       var announText = (TextBox) e.Item.Cells[1].Controls[1]; 
       int announId = (int)announ.DataKeys[e.Item.ItemIndex]; 
       var currentAnnoun = (from a in dc.announcements 
            where a.id == announId 
            select a).SingleOrDefault(); 
       currentAnnoun.announcement_text = announText.Text; 
       dc.SubmitChanges(); 

       announ.EditItemIndex = -1; 
       announ.DataBind(); 
      } 

      protected void announ_EditCommand(object source, DataGridCommandEventArgs e) 
      { 
       announ.EditItemIndex = e.Item.ItemIndex; 
       announ.DataBind(); 
      } 


public class DataGridTemplate : ITemplate 
    { 
     ListItemType templateType; 
     string columnName; 
     public DataGridTemplate(ListItemType type, string colname) 
     { 
      templateType = type; 
      columnName = colname; 
     } 

     public void InstantiateIn(Control container) 
     { 
      Literal lc = new Literal(); 
      TextBox tb = new TextBox(); 
      switch (templateType) 
      { 
       case ListItemType.Header: 
        lc.Text = "<B>" + columnName + "</B>"; 
        container.Controls.Add(lc); 
        break; 
       case ListItemType.Item: 
        lc.DataBinding += lc_DataBinding; 
        container.Controls.Add(lc); 
        break; 
       case ListItemType.EditItem: 
        tb.TextMode = TextBoxMode.MultiLine; 
        tb.Rows = 6; 
        tb.Columns = 57; 
        tb.DataBinding += tb_DataBinding; 
        container.Controls.Add(tb); 
        break; 
       case ListItemType.Footer: 
        lc.Text = "<I>" + columnName + "</I>"; 
        container.Controls.Add(lc); 
        break; 
      } 
     } 
     void tb_DataBinding(object sender, EventArgs e) 
     { 
      TextBox tb = (TextBox)sender; 
      DataGridItem row = (DataGridItem)tb.NamingContainer; 
      tb.ID = "txt_" + row.ItemIndex; 
      tb.Text = DataBinder.Eval(row.DataItem, columnName).ToString(); 
     } 
     void lc_DataBinding(object sender, EventArgs e) 
     { 
      Literal lc = (Literal)sender; 
      DataGridItem row = (DataGridItem)lc.NamingContainer; 
      lc.ID = "txt_" + row.ItemIndex; 
      lc.Text = DataBinder.Eval(row.DataItem, columnName).ToString(); 
     } 
    } 

Répondre

1

Vous devez ajouter vos contrôles dynamiques PreInit à chaque demande pour que les commandes pour se remettre dans le ControlTree et soulèvent des événements.

page de l'événement:
PreInit

d'utilisation:
Raised après la phase de démarrage est terminée et avant la phase d'initialisation commence.

Utilisez cet événement pour les éléments suivants:

  • Vérifiez la propriété IsPostBack pour déterminer si c'est la première fois que la page est en cours de traitement. Les propriétés IsCallback et IsCrossPagePostBack ont également été définies à cette heure .
  • Créer ou recréer des contrôles dynamiques.
  • Définir dynamiquement une page maître.
  • Définissez dynamiquement la propriété Theme.
  • Lit ou définit les valeurs des propriétés de profil.

    Remarque: Si la demande est une publication, les valeurs des contrôles n'ont pas encore été restaurées à partir de l'état d'affichage. Si vous définissez une propriété de contrôle à ce stade, sa valeur peut être remplacée dans l'événement suivant.

Questions connexes