Update DataGrid Inside AJAX Accordion

I have an AJAX accordion from ajax management toolset on a page with a dataset inside panels. I have my own itemtemplate element for a single column to create a multi-line text field when I click edit on a row. When I click update in a line, the original content of the text field is displayed in the text field. It should be updated and return to the literal, but not to the text field. When I put a DataBind () in an IsPostBack, it fails to appear when I click on the accordion panel. Any ideas?

the 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(); } } 
+4
source share
1 answer

You need to add your dynamic controls to PreInit for each request so that the controls can return to ControlTree and raise events.

Page Event:
Preinit

Typical Usage:
It is restored after the start of the start phase and before the start of the initialization phase.

Use this event for the following:

  • Check the IsPostBack property to determine if this is the first page processing time. The IsCallback and IsCrossPagePostBack properties were also set at this time.
  • Create or recreate dynamic controls.
  • Dynamic installation of the main page.
  • Set the Theme property dynamically.
  • Read or set profile property values.

    Note. If the request is a postback, the values ​​of the controls have not yet been restored from the view state. If you set a control property at this point, its value may be overwritten in the next event.

+1
source

Source: https://habr.com/ru/post/1299753/


All Articles