0

次のコードは、非同期コールバック中に UpdatePanel の内容を更新しません。

    protected void getMoreInfoCommand_Click(object sender, CommandEventArgs e)
    {
        Button button = (Button)sender;
        UpdatePanel updatePanel = (UpdatePanel)button.Parent.Parent;

        updatePanel.ContentTemplateContainer.Controls.Clear();

         switch(e.CommandName)
         {
            case "PERSON":
                 Person.Portal.UserProfile userProfile = new Person.Portal.UserProfile(e.CommandArgument.ToString());
                 updatePanel = getPanel(userProfile, true);
                 break;
         }
    }

   protected UpdatePanel getPanel(object obj, bool more)
    {
        UpdatePanel updatePanel = new UpdatePanel();
        updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
        updatePanel.EnableViewState = true;
        updatePanel.ViewStateMode = System.Web.UI.ViewStateMode.Enabled;
        updatePanel.ChildrenAsTriggers = true;
        StringBuilder htmlBuilder = new StringBuilder();

        switch (obj.GetType().ToString().Trim())
        {
            case "Person.Portal.UserProfile":
                Person.Portal.UserProfile userProfile = (Person.Portal.UserProfile)obj;
                htmlBuilder.Append("<TABLE border='1' cellpadding=3 cellspacing=0 width=20%>");

                htmlBuilder.Append("<tr><td colspan=2>");
                htmlBuilder.Append("<font color='gray' size=2>Person</font>");
                updatePanel.ContentTemplateContainer.Controls.Add(new LiteralControl(htmlBuilder.ToString()));
                htmlBuilder.Length = 0;

                Button morePersonButton = new Button();
                morePersonButton.ID = "morePersonButton";
                morePersonButton.Text = "More";
                morePersonButton.CommandName = "PERSON";
                morePersonButton.CommandArgument = userProfile.ID;
                morePersonButton.Command += new CommandEventHandler(getMoreInfoCommand_Click);

                updatePanel.ContentTemplateContainer.Controls.Add(morePersonButton);

                htmlBuilder.Append("<tr><td align='center' colspan=2>");
                htmlBuilder.Append("<img src='https://webadvisor.oc.edu/pictures/");
                htmlBuilder.Append(userProfile.Pic_ID);
                htmlBuilder.Append(".jpg'>");
                htmlBuilder.Append("</tr>");

                htmlBuilder.Append("<tr><td>");
                htmlBuilder.Append("<B>Name</B><TD>");
                htmlBuilder.Append(userProfile.FirstName + " " + userProfile.LastName);
                htmlBuilder.Append("</tr>");

                htmlBuilder.Append("<tr><td>");
                htmlBuilder.Append("<B>Email Address</B><TD>");
                htmlBuilder.Append(userProfile.EmailAddress);
                htmlBuilder.Append("</tr>");

                htmlBuilder.Append("<tr><td>");
                htmlBuilder.Append("<B>Phone</B><TD>");
                htmlBuilder.Append(userProfile.Phone);
                htmlBuilder.Append("</tr>");                    

                if (more)
                {
                    if (!String.IsNullOrEmpty(userProfile.Office_Number))
                    {
                        htmlBuilder.Append("<tr><td>");
                        htmlBuilder.Append("<B>Office Building</B><TD>");
                        htmlBuilder.Append(userProfile.Office_Number);
                        htmlBuilder.Append("</tr>");    
                    }
                }

                htmlBuilder.Append("</TABLE><BR>");

                updatePanel.ContentTemplateContainer.Controls.Add(new LiteralControl(htmlBuilder.ToString()));

                htmlBuilder.Length = 0;
                break;
        }
        return updatePanel;
    }

ただし、次のようにすると動作します。

    protected void getMoreInfoCommand_Click(object sender, CommandEventArgs e)
    {
        Button button = (Button)sender;
        UpdatePanel updatePanel = (UpdatePanel)button.Parent.Parent;

        updatePanel.ContentTemplateContainer.Controls.Clear();

         switch(e.CommandName)
         {
            case "PERSON":
                 Person.Portal.UserProfile userProfile = new Person.Portal.UserProfile(e.CommandArgument.ToString());
                 getPanel(userProfile, true, ref updatePanel);
                 break;
         }
    }


    protected void getPanel(object obj, bool more, ref UpdatePanel updatePanel) 
    { 
        ...
    }

私は別の場所で getPanel() を使用していますが、実際にはその動作を変更したくありません。最初の例が機能しない理由がわかりません。私は何が欠けていますか?回避策はありますか?

4

1 に答える 1

0

更新パネルは既にレンダリングされています。親のコントロール コレクションから更新パネルを置き換える必要があります。Update Panels 親のコントロール コレクションを変更すると、正しく更新されます。

于 2012-12-14T20:47:48.537 に答える