2011-04-30 19 views
2

我有一個Web部件,它動態插入使用C#編寫的VS2010中編寫的div標籤。我想爲這些div實現鼠標懸停事件。當Web部件部署到SP2010上時,當我用我指定的控件ID搜索它們時,我的JavaScript無法找到這些div。在我的SharePoint 2010 Web部件中查找div

當我檢查頁面源代碼時,我發現像ct100_m_g_這樣的一些標籤是前面指定的控件ID的前綴。

我怎樣才能猜出這些ID?

+0

這是用於可視Web部件還是Web控件(不是ascx)? – 2011-04-30 04:21:07

回答

1

ctlxxx的東西被ASP.NET自動預置爲控件的ID,以生成客戶端ID。

如果要設置確定性客戶端ID,則可以設置ClientID屬性而不是ID屬性。請參閱http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx

+0

將webpart的多個實例添加到一個頁面時,靜態ID不會導致問題嗎? – 2011-05-01 00:21:21

+0

是的,它肯定會......您可以設置一個確定性(如可預測)但非靜態的ID,並假設頁面上可能呈現多個Web部件。 – Zach 2011-05-01 09:41:39

+0

謝謝,我不得不使用clientidmode屬性,它的工作。再次感謝 – user731999 2011-05-02 09:02:22

0

在webparts中,您可以使用客戶端ID在J​​avaScript中查找您的控件。看看這個例子,它會變得很清楚:

using System; 
using System.Text; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 

namespace MyDemo.WebParts 
{ 
    public class MyWebPart : WebPart 
    { 
     private TextBox txtInput; 
     private TextBox txtOutput; 
     private Button btnDoSomething; 

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

      txtInput = new TextBox(); 
      Controls.Add(txtInput); 

      txtOutput = new TextBox(); 
      txtOutput.ReadOnly = true; 
      Controls.Add(txtOutput); 

      btnDoSomething = new Button(); 
      btnDoSomething.Text = "Do Something"; 
      btnDoSomething.OnClientClick = string.Format("DoSomething('{0}', '{1}'); return false;", txtInput.ClientID, txtOutput.ClientID); 
      Controls.Add(btnDoSomething); 
     } 

     protected override void OnPreRender(EventArgs e) 
     { 
      base.OnPreRender(e); 

      // Check if the script is already registered, this is necessary because the webpart can be 
      // added multiple times to the same page 
      if (!Page.ClientScript.IsClientScriptBlockRegistered("MyWebPartScript")) 
      { 
       StringBuilder sb = new StringBuilder(); 
       sb.Append("function DoSomething(inputControlID, outputControlID){"); 
       sb.Append(" var inputControl = document.getElementById(inputControlID);"); 
       sb.Append(" var outputControl = document.getElementById(outputControlID);"); 
       sb.Append(" outputControl.value = inputControl.value;"); 
       sb.Append("}"); 

       Page.ClientScript.RegisterClientScriptBlock(GetType(), "MyWebPartScript", sb.ToString(), true); 
      } 
     } 

     protected override void RenderContents(System.Web.UI.HtmlTextWriter writer) 
     { 
      EnsureChildControls(); 

      writer.Write("<table>"); 
      writer.Write("<tr><td>"); 
      txtInput.RenderControl(writer); 
      writer.Write("</td><td>"); 
      txtOutput.RenderControl(writer); 
      writer.Write("</td></tr><tr><td colspan=\"2\">"); 
      btnDoSomething.RenderControl(writer); 
      writer.Write("</td></tr></table>"); 
     } 
    } 
} 
+0

謝謝,我不得不使用clientidmode屬性靜態和事情開始按預期工作。非常感謝你 – user731999 2011-05-02 09:02:49

0

你可以給你的每個DIV生成一個類。那麼,只需使用類名選擇它們並添加事件處理程序即可。

相關問題