2009-11-21 65 views
0

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

我有,当我使用一个下拉列表,但我想知道如果我的上述做法是正确与否我尝试用结合下拉列表解决这个问题之前的一些问题。

编辑

我初始化我的下拉列表,它在“的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’是一个更新面板,是的,我有一个下拉列表中选择一个更新面板,我使用update方法更新其他更新面板。

这是“渲染”的方法

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; 

我得到它说的错误,一个控制不能有两个选择指标。但是在任何时候只有一个。下拉的状态发生了变化,但是当渲染出来时它会弹出。

我不明白为什么

谢谢。

+0

如果你不这样做的.Selected =真会发生什么。然后选择哪个项目? – 2009-11-21 19:46:11

+0

您正在清除正确的选择。我的下一个猜测可能是,你是否在几个下拉菜单中使用了PleaseSelectItem,这意味着它的相同实例? 请阅读 - http:// geekswithblogs上的评论。net/ranganh/archive/2006/05/03/77072.aspx – 2009-11-21 19:54:15

+0

是的,我没有意识到我在不同的地方使用它。 – iJK 2009-11-22 21:25:12

回答

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(); 
+0

如果我从“System.Web.UI.WebControls.WebPart”继承,那么我必须重写“Render”方法。所以我想我正在做的是正确的。 – iJK 2009-11-21 18:46:36

0

所以我想通了,为什么之后6+小时的错误发生...

如果我评论这条线在我的方法,我在下拉列表绑定

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

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

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

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); 
      } 
     } 
+0

查看我的修改答案。 – 2009-11-21 21:19:12