2009-11-21 107 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