首次触发click_event后,第二个click_event不会触发

时间:2011-07-21 13:11:26

标签: c#-4.0

我有两个链接按钮,根据条件动态添加,无论是显示一个还是另一个。这些按钮也有事件。

首先显示按钮的事件触发,但是当条件改变并显示第二个按钮时,它的事件不会触发。

源代码:

    //conditions
    bool wantToChangeBlogPost = false;
    string textBoxOnChangeID = "";

    protected void displayBlogPost()
    {
        SomeArraylist[] arr = valuesFromDdataBase();
        foreach(BlogPost y in arr)
        { 
            string contentStr = y.BlogMailingText;//"some content in mailing";

            //div for displaying content in webpage
            System.Web.UI.HtmlControls.HtmlGenericControl contentDIV = new 
                    System.Web.UI.HtmlControls.HtmlGenericControl("div");
            contentDIV.InnerHtml = contentStr;

            //TB for changes
            TextBox TBcontent = new TextBox();
            TBcontent.Text = contentStr;
            TBcontent.AutoPostBack = true;
            TBcontent.TextMode = TextBoxMode.MultiLine;
            TBcontent.Wrap = true;
            TBcontent.ReadOnly = true;
            TBcontent.EnableViewState = true;


            //two different buttons for cases, whether or not want to change the text 
                            //of blogPost
            LinkButton changePost = new LinkButton();
            changePost.Text = "Change MailingText";
            LinkButton savePost = new LinkButton();
            savePost.Text = "Save Changes";


                //id 's are needed for controls
                TBcontent.ID = "content-" + y.Id;
                contentDIV.ID = "contentDIV-" + y.Id;

                    changePost.ID = "changePost-" + y.Id;
                    savePost.ID = "savePost-" + y.Id;

                    changePost.CommandArgument = "content-" + y.Id;
                    savePost.CommandArgument = "content-" + y.Id;


             //Add these controls to the placeholder, which is defined in asmx:
             //initially add only the contentDiv
             myPlaceHolder.Controls.Add(contentDiv);


             ///////////////////////////
             //  HERE IS THE PROBLEM:  //
             ///////////////////////////

             //Conditions determing when to display one or another linkbutton and 
                                    //TBcontent
             if (wantToChangeBlogPost == true && textBoxOnChangeID == "content-" + y.Id)
                { 
                    savePost.Click += new EventHandler(save_click);
            //HERE IS THE PROBLEM: this event never fires :(
                    contentDIV.InnerHtml = "";
                    TBcontent.ReadOnly = false;
                    TBcontent.Visible = true;

                    // this button is displayd when someone has clicked on button 
                            //'changePost'
                    myPlaceHolder.Controls.Add(savePost);
                }
             else
                {
                    changePost.Click += new EventHandler(changePost_Click); 
                    contentDIV.InnerHtml = contentStr;                         
                    TBcontent.ReadOnly = true;
                    TBcontent.Visible = false;//initially the TB is not visible

                    //initially the bool is false and
                    // this button is displayd
                    myPlaceHolder.Controls.Add(changePost);
                }

        }


        //event methods for both buttons

        //AFTER THIS METHOD COMPLETED I WANT TO DISPLAY THE ANOTHER LINKBUTTON 
                            //'savePost' WITH ANOTHER EVENT 'save_click'
        protected void changePost_Click(object sender, EventArgs e)
        {
            LinkButton LB = sender as LinkButton;
            //CONDITIONS
            textBoxOnChangeID = LB.CommandArgument;
            wantToChangeBlogPost = true;
            //GO TO THE DISPLAYING METHOD AGAIN
            displayBlogPost();
        }

        //THIS METHOD NEVER EVEN FIRES!  WHY??????
        protected void save_click(object sender, EventArgs e)
        {
            LinkButton LB = sender as LinkButton;
            //CONDITIONS
            textBoxOnChangeID = "";
            wantToChangeBlogPost = false;

                    //some logic to send changed data to the database to upload 
                                    //datatable
                    uploadWithChangedDataInTextBox();


            //GO TO THE DISPLAYING METHOD AGAIN
            displayBlogPost();
        }
    }

1 个答案:

答案 0 :(得分:0)

如果你动态添加控件,那么你必须在每个帖子上重新创建那些保持id相同然后只有事件才会发生火灾

或者如果您通过客户端等任何其他方法添加控件,那么您可以调用

__doPostBack(eventTarget,eventArg)并检查服务器端的id,然后相应地调用sm函数