在我的 SharePoint 2010 Web 部件中查找 div

Posted

技术标签:

【中文标题】在我的 SharePoint 2010 Web 部件中查找 div【英文标题】:Finding a div in my SharePoint 2010 Web Part 【发布时间】:2011-08-15 21:33:06 【问题描述】:

我有一个使用 C# 动态插入用 VS2010 编写的 div 标签的 Web 部件。我想为这些 div 实现鼠标悬停事件。当 Web 部件部署到 SP2010 上时,当我使用我指定的控件 ID 搜索这些 div 时,我的 javascript 无法找到它们。

当我查看页面源时,我发现ct100_m_g_之类的一些标签是在我指定的控件id前面加上前缀的。

我如何猜出这些 id?

【问题讨论】:

这是用于可视 Web 部件还是 Web 控件(无 ascx)? 【参考方案1】:

ctlxxx 内容由 ASP.NET 自动添加到控件的 ID 之前,以生成客户端 ID。

如果要设置确定性客户端 ID,可以设置 ClientID 属性而不是 ID 属性。见http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx

【讨论】:

当您将 Web 部件的多个实例添加到一个页面时,静态 ID 不会导致问题吗? 是的,它肯定会...您可以设置一个确定性(如可预测的)但非静态的 ID,假设页面上可能呈现多个 Web 部件。 谢谢,我必须使用 clientidmode 属性并且它有效。再次感谢【参考方案2】:

在 webparts 中,您可以使用客户端 ID 在 javascript 中查找您的控件。看看这个例子就明白了:

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>");
        
    

【讨论】:

谢谢,我不得不将 clientidmode 属性设置为静态,事情开始按预期工作。非常感谢【参考方案3】:

您可以在生成每个 DIV 时为其指定一个类。然后,只需使用类名来选择它们并添加事件处理程序。

【讨论】:

以上是关于在我的 SharePoint 2010 Web 部件中查找 div的主要内容,如果未能解决你的问题,请参考以下文章

从事件接收器重定向Sharepoint 2010(创建站点后)

sharepoint 2010 Visual webpart 中的自动完成功能

SharePoint 2010 Web 部件部署错误

将Split Access 2010数据库发布到Sharepoint

我现有的 Web 部件在 SharePoint 中不起作用

SharePoint 2010:尝试使用电源外壳安装 Web 部件时出现问题