C# SharePoint Web部件+;覆盖渲染方法
您好!在SharePoint中创建自定义web部件时,是否可以覆盖“Render”方法?我有一个从System.web.UI.WebControl.WebPart继承的web部件。我将控件添加到“CreateChildControls”中的控件集合中,然后重写“Render”方法来呈现html和控件 当我使用下拉列表时,我遇到了一些问题,但我想知道我的上述方法是否正确,然后再尝试绑定下拉列表来解决问题 已编辑 我初始化下拉列表并将其添加到“CreateChildControls”中的控件集合中。在这个方法的末尾,我调用“BindData”,它绑定我的下拉列表,如果我正在编辑一条现有记录,它将绑定下拉列表数据并设置正确的所选索引。然后,我在“render”方法中渲染控件。下面是一段代码片段C# SharePoint Web部件+;覆盖渲染方法,c#,sharepoint,C#,Sharepoint,您好!在SharePoint中创建自定义web部件时,是否可以覆盖“Render”方法?我有一个从System.web.UI.WebControl.WebPart继承的web部件。我将控件添加到“CreateChildControls”中的控件集合中,然后重写“Render”方法来呈现html和控件 当我使用下拉列表时,我遇到了一些问题,但我想知道我的上述方法是否正确,然后再尝试绑定下拉列表来解决问题 已编辑 我初始化下拉列表并将其添加到“CreateChildControls”中的控件集合中。
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”是一个更新面板。是的,我有一个更新面板用于一个下拉列表,我使用更新方法更新其他更新面板
这是“渲染”方法
我的“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行和第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();
所以我找到了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);
}
}
如果我从“System.Web.UI.WebControls.WebPart”继承,那么我必须重写“Render”“方法。因此,我想我所做的是正确的。如果不执行.Selected=true,会发生什么。然后选择哪个项目?您正在清除正确的选择。我的下一个猜测可能是,您是否在几个下拉列表中使用了PleaseSelection项,意思是相同的实例?阅读上的评论-是的,我没有意识到我在不同的地方使用它。你不应该覆盖Render(),而应该覆盖RenderContents()。是的,我知道这一点,但我没有做任何与WPSC,所以我只是忽略了它。我现在确实更改了代码。谢谢提醒:-)
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);
}
}