如何在 Sharepoint 的 c# 非可视 Web 部件中以编程方式创建进度更新控件

Posted

技术标签:

【中文标题】如何在 Sharepoint 的 c# 非可视 Web 部件中以编程方式创建进度更新控件【英文标题】:How to create progress update control programatically in c# non visual web part in Sharepoint 【发布时间】:2013-01-14 15:25:32 【问题描述】:

我正在使用 c#,目标是在 ProgressUpdate 控件内创建一个“正在加载...”文本,当更新面板加载更多内容时该文本变为可见,然后在加载内容时消失。如果有人可以提供帮助,那就太棒了。我尝试了以下方法,但没有运气。一个按钮触发更新面板,更新效果很好,但是当我尝试添加更新进度时,它会添加到页面中,但是当我单击触发更新的按钮时它永远不会出现。

UpdatePanel up = new UpdatePanel();
up.UpdateMode = UpdatePanelUpdateMode.Always;
up.ID = "Panel1";

UpdateProgress upp1 = new UpdateProgress();
upp1.AssociatedUpdatePanelID = up.ID.ToString();

upp1.ID = "UpdateProgress1";

upp1.Controls.Add(new LiteralControl("<p>Loading...</p>"));

Controls.Add(upp1);

【问题讨论】:

你有没有尝试过?发布一些代码,也许? 刚刚添加了一些代码。以为我在发布时添加了这一点。无论如何,您可以在上面看到我尝试过的内容。 SharePoint ASP(或更恰当地说,是建立在 ASP 之上)。您可以在 ASP 中执行的任何操作都可以在 SharePoint 中执行。可视化 Web 部件只是自动生成添加到 Web 部件的用户控件的 Web 部件。添加它是因为在 2007 年手动创建用户控件并将其添加到 Web 部件以便您在编码时可以使用标记非常普遍。我强烈建议你这样做;没有真正的理由不这样做。如果您不能使用可视 Web 部件,则只需手动创建您添加的用户控件。此外,“它不起作用”永远不应该成为问题。解释一下。 那么更新面板是否正常工作并进行异步回发,而您遇到的唯一问题是UpdateProgress,或者两者都不起作用?我看不到您将任何控件添加到 UpdatePanel 的位置,或者将其添加到 web 部件(但如果您说该部件工作正常就足够了;您不需要显示代码)。 我发现这个forums.asp.net/t/1216644.aspx可能是这个hepls。 【参考方案1】:

好的,这就是我找到的。如果您在更新面板之外创建更新进度控件,则在触发更新面板时将无法侦听更新面板上的触发器。可以在下面的链接中阅读更多信息。

http://www.mostlydevelopers.com/blog/post/2008/08/23/Show-UpdateProgress-when-using-an-UpdatePanel-with-Triggers.aspx

因此,由于我是这样做的,因此我不得不使用 javascript 解决方法。我必须使用 PageRequestManager 对象的 getInstance() 方法来获取 PageRequestManager 类的实例。然后,我在异步请求初始化和结束时添加了它的函数。这将允许我们在异步调用开始和结束时显示我们的 UpdateProgress 控件。 (请参阅下面的 Javascript)

//Function for postbackUpdateProgress
var prm = Sys.WebForms.PageRequestManager.getInstance();
var postBackElement;

function CancelAsyncPostBack() 
    if (prm.get_isInAsyncPostBack()) 
        prm.abortPostBack();
    


prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);

function InitializeRequest(sender, args) 
    if (prm.get_isInAsyncPostBack()) 
        args.set_cancel(true);
    
    //Get the element that asynchronous postback
    postBackElement = args.get_postBackElement();

    //check to see if any of the following controls activate sender request.
    //search is used to search for the ID name in the string that sharepoint spits out
    // as the ID.
    var controlA = postBackElement.id.search("DropDownListType");
    var controlB = postBackElement.id.search("UserProfileDropList");
    var controlC = postBackElement.id.search("MoreNewsLinkButton");
    var controlD = postBackElement.id.search("PreviousNewsLinkButton");

    if (controlA != -1 || controlB != -1 || controlC != -1 || controlD != -1) 
        $('*[id*=Panel1]:visible').hide();
        //show UpdateProgress
        $('*[id*=UpdateProgress1]').show();
    

//After async postback complete, then show panel again and hide UpdateProgress
function EndRequest(sender, args) 
    $('*[id*=Panel1]').show();//use wild card in jquery to find Panel1 ID
    $('*[id*=UpdateProgress1]:visible').hide();

请注意,我必须对 ID 名称进行 search(),因为 sharepoint 在您的 ID 名称之前放置了一堆文本,否则 javascript 将无法仅通过 ID 的文本文字找到它。使用 jquery 的通配符方法通过以下方式查找面板:

$('[id=Panel1]').show();//在jquery中使用通配符查找Panel1 ID

展示它。

$('[id=Panel1]:visible').hide();

在异步调用初始化时隐藏更新面板。您不必隐藏更新面板,但如果我这样做,我的特定实现看起来更美观。

【讨论】:

以上是关于如何在 Sharepoint 的 c# 非可视 Web 部件中以编程方式创建进度更新控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SharePoint 2010 沙盒可视 WebPart 上创建可编辑属性

将自定义 Web 部件添加到页面 SharePoint 2013 c# csom

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

我们如何使用 C# 在 SharePoint 中获取当前的身份验证模式

阅读 SharePoint 列表字段标题

在哪里为 office365 sharepoint 站点编写 C# 代码