【问题标题】:SharePoint WebPart + Override render methodSharePoint WebPart + 覆盖呈现方法
【发布时间】:2010-12-19 01:51:17
【问题描述】:

嗨,在 SharePoint 中创建自定义 Web 部件时,是否可以覆盖“呈现”方法?我有一个继承自 System.Web.UI.WebControls.WebPart 的 Web 部件。我将控件添加到“CreateChildControls”中的控件集合中,然后重写“Render”方法以呈现 html 和控件。

我在使用下拉列表时遇到了一些问题,但我想知道我的上述方法是否正确,然后再尝试通过绑定下拉列表来解决问题。

已编辑

我初始化我的下拉列表并将其添加到“CreateChildControls”中的控件集合中。在此方法结束时,我调用绑定下拉列表的“BindData”,如果我正在编辑现有记录,它会绑定下拉列表数据并设置正确的选定索引。然后我在“渲染”方法中渲染控件。这是一个代码sn-p

protected override void CreateChildControls()
        {
            base.CreateChildControls();
            this.EnsureUpdatePanelFixups();

 ddlClient = new DropDownList();
            ddlClient.ID = "ddlClient";
            ddlClient.SelectedIndexChanged += new EventHandler(ddlClient_SelectedIndexChanged);
            ddlClient.AutoPostBack = true;
            ddlClient.ValidationGroup = __VALIDATIONGROUP;
            ddlClient.Width = ObjCtrlWidth;

            upClient = new UpdatePanel();
            upClient.ID = "upClient";
            upClient.UpdateMode = UpdatePanelUpdateMode.Conditional;
            upClient.ContentTemplateContainer.Controls.Add(ddlClient);

            this.Controls.Add(upClient);

//More controls here

BindData();
}

"ddlClient 是"DropDownList","upClient" 是更新面板。是的,我有一个下拉列表的更新面板,我使用更新方法更新其他更新面板。

这是“渲染”方法

protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
//stuff here

    writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Td);
            upClient.RenderControl(writer);
            writer.RenderEndTag();

//stuff here
}

我的“BindData”方法调用绑定不同下拉列表的其他绑定方法,这就是其中之一的绑定方式

    private void BindData()
            {
                BindClientTypes();
                //binding other drop down lists here

//If an existing record isbeing edited, this method will get the data from db and bind all the controls               
BindMEA();
            }

private void BindClientTypes()
        {
            DataTable dt = DB.GetAllClientTypes();

            if (dt == null)
            {
                ltGlobalErrorMsg.Text = GlobalErrorMessage;
                ltGlobalErrorMsg.Visible = true;
            }
            else
            {
                ddlClient.ClearSelection();
                ddlClient.DataSource = dt;
                ddlClient.DataValueField = "ID";
                ddlClient.DataTextField = "Name";
                ddlClient.DataBind();
                ddlClient.Items.Insert(0, PleaseSelectItem);
                ddlClient.ClearSelection();
            }
        }

在我的 BindMEA 中,我执行以下操作

ddlClient.ClearSelection();
ddlClient.Items.FindByValue(objMea.ClientTypeID.ToString()).Selected = true;

我收到一条错误消息,指出控件不能有两个选定的索引。但在任何给定时间只有一个。下拉列表的状态发生了变化,但是当涉及到渲染时,它会爆炸。

我不明白为什么

谢谢。

【问题讨论】:

  • 如果不执行 .Selected = true 会发生什么。然后选择了哪个项目?
  • 您正在清除正确的选择。我的下一个猜测可能是,您是否在多个下拉列表中使用了 PleaseSelectItem,这意味着它的同一个实例?阅读 cmets - geekswithblogs.net/ranganh/archive/2006/05/03/77072.aspx
  • 是的,我没有意识到我在不同的地方使用它。
  • 您不应该覆盖 Render() 而是覆盖 RenderContents() 。 andrewconnell.com/blog/archive/2008/02/18/…
  • 是的,我知道这一点,但我没有对 WPSC 做任何事情,所以我忽略了它。我现在确实更改了我的代码。谢谢提醒:-)

标签: c# sharepoint


【解决方案1】:

RenderMethod 没问题。

这里有一个更适合您的解决方案。第 2 行和第 3 行是重要部分:

ddlClient.Clear();
ddlClient.AppendDataBoundItems = true;
ddlClient.Add( new ListItem("Please Select" ); // Important to have a new instance
ddlClient.DataSource = dt;
ddlClient.DataValueField = "ID";
ddlClient.DataTextField = "Name";
ddlClient.DataBind();
ddlClient.ClearSelection();

【讨论】:

  • 如果我从“System.Web.UI.WebControls.WebPart”继承,那么我必须重写“Render”方法。所以我想我所做的是正确的。
【解决方案2】:

所以我弄清楚了为什么在 6+ 小时后会发生错误...

如果我在绑定下拉列表的方法中注释这一行

//ddlClient.Items.Insert(0, PleaseSelectItem);

然后我可以绑定网格并设置选定的索引。

所以我的 Bind 方法看起来像这样

private void BindClientTypes()
        {
            DataTable dt = DB.GetAllClientTypes();

            if (dt == null)
            {
                ltGlobalErrorMsg.Text = GlobalErrorMessage;
                ltGlobalErrorMsg.Visible = true;
            }
            else
            {
                ddlClient.DataSource = dt;
                ddlClient.DataValueField = "ID";
                ddlClient.DataTextField = "Name";
                ddlClient.DataBind();
                //ddlClient.Items.Insert(0, PleaseSelectItem);
            }
        }

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 2019-07-17
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2012-11-18
    • 2011-07-10
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多