Creating Dynamic SharePoint Help With Lists And RadToolTipManager

Using the RadToolTipManager to build dynamic help options within custom SharePoint WebParts is a really useful trick. It can greatly increase the usability of an application, and you can dynamically store the different help items in SharePoint fields. In this example I am going to dynamically expose some fields on a custom WebPart through a BaseFieldControl method, and just use the field names as keys to bind the different help items.

So let’s assume I am reflecting on a field to surface the correlating WebControl:

[csharp]
BaseFieldControl webControl = SPField.FieldRenderingControl;
webControl.ListId = SPList.ID;
webControl.ItemId = SPListItem.ID;
webControl.FieldName = SPField.Title;
webControl.ID = string.Format(“MyField_{0}”, SPField.Title)
webControl.ControlMode = mode;
[/csharp]

I am going to use this static helper method for the actual tool tip and target control instantiation:

[csharp]
public static void CreateHelpAndAdviceButton(string fieldName, Control Parent, RadToolTipManager manager, bool show)
{
string buttonId = String.Format(“btn{0}”, fieldName);
ImageButton btn = new ImageButton();
btn.ImageUrl = “/_layouts/images/help.png”;
btn.Visible = show;
char[] charsToRemove = new[] {‘\r’, ‘\t’, ‘\n’, ‘ ‘, ‘:’, ‘-‘};
string[] results = String.Format(“{0}”, buttonId).Split(charsToRemove);
StringBuilder transformedString = new StringBuilder();
foreach (string s in results)
{
transformedString.Append(s);
}
btn.ID = transformedString.ToString();
manager.TargetControls.Add(btn.ID, fieldName);

RadToolTip tip = new RadToolTip();
tip.ShowEvent = ToolTipShowEvent.OnMouseOver;
tip.TargetControlID = buttonId;
tip.IsClientID = true;
tip.ID = String.Format(“RadToolTip{0}”, buttonId);
tip.HideEvent = ToolTipHideEvent.LeaveToolTip;
Parent.Controls.Add(tip);
Parent.Controls.Add(btn);
}
[/csharp]

The RadToolTipManager is assumed to be created, but you can just create one with a static method and pass it in. Here is a method for a pretty basic popup with delay window:

[csharp]
public static RadToolTipManager ConfigureTooltip()
{
RadToolTipManager tooltipManager = new RadToolTipManager();
tooltipManager.Position = ToolTipPosition.TopRight;
tooltipManager.Animation = ToolTipAnimation.Resize;
tooltipManager.RelativeTo = ToolTipRelativeDisplay.Mouse;
tooltipManager.ShowEvent = ToolTipShowEvent.OnMouseOver;
tooltipManager.HideEvent = ToolTipHideEvent.ManualClose;
tooltipManager.ContentScrolling = ToolTipScrolling.Default;
tooltipManager.AjaxUpdate += OnAjaxUpdate;
tooltipManager.EnableShadow = true;
tooltipManager.Width = 200;
tooltipManager.Height = 150;
tooltipManager.ShowDelay = 200;
tooltipManager.HideDelay = 1;
tooltipManager.AnimationDuration = 300;
tooltipManager.MouseTrailing = true;
tooltipManager.ShowCallout = true;
tooltipManager.Modal = false;
return tooltipManager;
}
[/csharp]

The OnAjaxUpdate is responsible for the actual display of the item, so that has to be defined. Especially since it’s in the above method! This is also where we will look up to the SPList and get the relevant items. We are just using the field name as a key against the list, and a super simple SPListItem iteration.

[csharp]
public static void OnAjaxUpdate(object sender, ToolTipUpdateEventArgs args)
{
UpdateToolTip(args.Value, args.UpdatePanel);
}
public static void UpdateToolTip(string key, UpdatePanel panel)
{
foreach (SPListItem item in SPContext.Current.Web.Lists[“SomeList”].Items)
{
string fieldName = item[“Field Name”].ToString();
if (fieldName == key)
{
string content = item[“Text”].ToString();
Literal lbl = new Literal();
lbl.Text = content;
panel.ContentTemplateContainer.Controls.Add(lbl);
}
}
}
[/csharp]

Then, just call the static helper method for the button generation:

[csharp]

CreateHelpAndAdviceButton(Some Field Name, ControlToAddTo, RadToolTipManager, false);

[/csharp]

Share

Freeware – SharePoint Security Scanner

Just want to the app?

Download here: http://spsecurityscanner.codeplex.com

I recently was at a client doing an audit on the SharePoint environment, and the question of how to do continual scanning on the site for possible system/ web service / and list WebForm exposure. Mimicking and automating this behavior is no big deal, since you are essentially just dispatching requests to various static URLs. The SPList object SPFormCollections can be exposed through the SPList.Forms property, and via web services rather than using the Forms web service you are sorta relegated learning on the SPList content type methods to get access to all customized forms. The SPWeb related ones are better to keep in a mutable file that can be managed.

So da da da! Here is a simple SharePoint security scanner. The composition of the application is actually pretty straightforward; it’s only about three forms. To abstract SharePoint explicit reference requirements the OM and web service assemblies are dynamically loaded at runtime so that SharePoint references are only required when doing OM connection types. Web service ones it shouldn’t really matter.

There are about three steps to get it going:

Start the application:

Click Open Connection:

And choose the connection type, and credential specifications:

When done hit connect, and you will return to the main form. Fill in whether you want to iterate SPList objects:

You can manage the web related urls, since the SPFormCollections are automated, through the Manage Web Inclusion List:

Scan the site, then you can view the results:

 

So it’s not very fancy, but gets the job done. Have hacky SharePoint fun!

 

Share