SharePoint WebPart +覆盖渲染方法

时间:2009-11-21 18:24:08

标签: c# sharepoint

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

当我使用下拉列表时遇到一些问题,但在尝试修复绑定下拉列表的问题之前,我想知道上述方法是否正确。

被修改

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

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;

我收到一个错误,指出控件不能有两个选定的索引。但在任何时候都只有一个。下拉的状态会发生变化,但是当谈到渲染时它就会爆炸。

我无法理解为什么

感谢。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

所以我弄清楚为什么错误会在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);
            }
        }