更新 AJAX 手风琴内的 DataGrid

发布于 2024-08-19 23:37:43 字数 7920 浏览 4 评论 0原文

我在页面上有一个来自 ajax 控制工具包的 AJAX 手风琴,面板内有一个数据网格。当我单击行上的编辑时,我有一个用于一列的自定义项目模板来创建多行文本框。当我单击该行上的更新时,文本框的原始内容将呈现到文本框中。它应该更新并返回到文字而不是文本框。当我将 DataBind() 放入 !IsPostBack 中时,当我单击手风琴窗格时它不会呈现。有什么想法吗?

代码:

    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();
        }
    }

I have an AJAX accordion from the ajax control toolkit on a page with a datagrid inside on of the panels. I have a custom itemtemplate for the one column to create a multiline textbox when I click edit on the row. When I click update on the row, the original content of the textbox gets rendered into the textbox. It is supposed to update and go back to the literal not the textbox. When I put the DataBind() into a !IsPostBack, it doesnt get rendered when I click on the accordion pane. Any ideas?

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();
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

£噩梦荏苒 2024-08-26 23:37:43

您需要在每个请求的 PreInit 中添加动态控件,以便控件返回 ControlTree 并引发事件。

页面事件:
PreInit

典型用途:
在启动阶段完成之后、初始化阶段开始之前引发。

使用此事件进行以下操作:

  • 检查 IsPostBack 属性以确定这是否是第一个
    处理页面的时间。这
    IsCallback 和 IsCrossPagePostBack
    属性也已在此设置
    时间。
  • 创建或重新创建动态控件。
  • 动态设置母版页。
  • 动态设置主题属性。
  • 读取或设置配置文件属性值。

    注意:如果请求是回发,则控件的值尚未从视图状态恢复。如果在此阶段设置控件属性,则其值可能会在下一个事件中被覆盖。

You need to add your dynamic controls in PreInit on every request in order for the controls to get back into the ControlTree and raise events.

Page Event:
PreInit

Typical Use:
Raised after the start stage is complete and before the initialization stage begins.

Use this event for the following:

  • Check the IsPostBack property to determine whether this is the first
    time the page is being processed. The
    IsCallback and IsCrossPagePostBack
    properties have also been set at this
    time.
  • Create or re-create dynamic controls.
  • Set a master page dynamically.
  • 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 view state. If you set a control property at this stage, its value might be overwritten in the next event.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文