Friday, May 18, 2007

Halo 3 in Sept!


Friday, April 20, 2007

Thursday, March 29, 2007

BinaryWave WebPart Wrapper




Wednesday, March 28, 2007

Catching Up!

Trying to get caught up on some posts today. Read on to see what's going on.

The eGroup == BinaryWave

For reasons to numerous to go into we are re-branding ourselves as BinaryWave. This is fantastic news all around (unified branding in US and UK, finally get a dot com address etc... basically the reasons I said were to numerous above. huh).

So expect to see a new web site along with lots of great content, and maybe a new blogger or two!

BTW, BinaryWave is hiring! We are looking for talented, motivated developers. SharePoint experience is a plus, but by no means a requirement. In fact we would love to get a few junior developers in who have a willingness to learn. BinaryWave is one of the top SharePoint developers in the US and Europe and is a great place to expand your skill set and gain valuable experience. Plus, if you want to travel we have several UK clients that you could visit. And if you don't like to travel that's OK too! In a lot of cases we do all the development in our offices and only visit the clients for meetings and code hand-off. We focus exclusively on SharePoint and applications that integrate into SharePoint. We leave everything else to our partners. You wont spend a lot of time doing install and config either! We ONLY do development. And we have a lot of really great projects for you to work on, so there is never any bench time.

If you are interested, please let us know.

Also, look for myself (Sean) or my boss (Eric) at the Dallas SharePoint User Group meetings and at the UK SharePoint User Group meetings. Feel free to introduce yourselves! We won't bite.




And our new logo!




Custom Work Flows in SharePoint and VS2005

Now a topic near and dear to my heart. And it's only that way because writing the first one almost killed me ;-)

There is not a lot of (ie not any) documentation out the for doing custom work flows in MOSS and using custom ASPX forms for the instantiation, association etc... forms. Well we (AKA BinaryWave, AKA The eGroup) have done all the hard work for you! We have developed a custom work flow in VS2005 for SharePoint, and developed some custom ASPX forms for use with the work flow. This should be great news for those of you who do NOT want to use InfoPath forms. More to come...

(if you can't wait, leave me a comment and I will respond!)

Using User Controls in SharePoint 200x

I am a huge fan of using user controls in SharePoint. It makes the developers life easier since most good .Net devs should be VERY familiar with the concept. You get the UI designer in Visual Studio to make layout and placement of controls much easier. This can also lead to a richer user experience.

Now getting those user controls wrapped up in a web part and deployed is not always the easiest thing in the world. Thanks to the great Jan Tielens you can use the SmartPart. The SmartPart is great and I used it a lot when I was first starting out in SharePoint development. However I soon ran into situations where the SmartPart was not appropriate. Plus I hate to use third party controls where I don't have access to the source so I can really tweak it out. (*Note, Jan has released the source to at least a few versions of SmartPart so you can check out how he did things too!) So inspired by the great work done by Jan I decided to write my own web part that encapsulates user controls. I have used this part on several projects with great success. I will be releasing a sample project that contains a basic working sample of the techniques required to host a user control. This should be ready in the next few days.

Let me know if there are any specific needs and I will try and address them in the release, or in a follow-up release.

Wednesday, February 21, 2007

The (un)Official Guide to adding AJAX to MOSS 2007!!!

Here it is straight from the source (MOSS dev team).

Here is the post

And its quoted below (just in case)

Blogger hates me so replace all the '[' and ']' with '<' and '>' respectively.

Microsoft ASP.NET AJAX 1.0 and SharePoint

Windows SharePoint Services
version 3 builds much more directly on top of ASP.NET 2.0; therefore, many of
the capabilities of ASP.NET AJAX work directly with SharePoint.

However,
in a few cases there are some compatibility issues between ASP.NET AJAX and
SharePoint which are anticipated to be addressed in the first service pack of
Windows SharePoint Services. For this reason, until that first Service Pack of
Windows SharePoint Services, we are unable to offer formal support through
Microsoft Product Support Services for usage of ASP.NET AJAX within a SharePoint
Web site. This post is intended to provide developers with some guidelines for
evaluating ASP.NET AJAX and WSS3.0.

Specifically, there are some
limitations on usages of the UpdatePanel in your web parts and controls. Some
approaches are described below to address these limitations, but these are
workarounds and as such may cause other issues in your application.

Here
are some common scenarios in SharePoint you should be able to achieve with
Microsoft ASP.NET AJAX 1.0:
Building a more powerful, re-usable JavaScript
libraries you can use in your web controls and parts
Enabling your web
services to render via JSON, resulting in easier usage in JavaScript/Ajax
Applications
Building a web part that takes advantage of Extender technology
to provide richer interaction styles, such as autocomplete on a textbox.
Using an UpdatePanel in your web part or control for more fluid, no postback
interaction. (this will require some workarounds, however.)

Adding
Microsoft ASP.NET AJAX Technology to SharePoint Pages

To extend your
SharePoint site with Microsoft ASP.NET AJAX 1.0, you’ll need to perform a few
steps.

First, you will need to download and install ASP.NET AJAX on
servers in your farm.

Second, you need to extend web.config with some
settings to enable ASP.NET AJAX technology.


Third, you will need to
add the ASP.NET AJAX Script Manager into your master page to enable scenarios
such as Extenders or UpdatePanels.

Installing ASP.NET AJAX on servers in
your farm

You will want to install the full "ASP.NET 2.0 AJAX Extensions
1.0" from ajax.asp.net.

Extending SharePoint web.config files with
Microsoft ASP.NET AJAX 1.0

Extending SharePoint web.config files with
ASP.NET AJAX requires that you interleave some Ajax registration entries in-line
with WSS registration entries. To do this you will need to edit your SharePoint
web.config file, typically in a directory like
c:\inetpub\wwwroot\wss\virtualdirectories\80.

1. Add a
[sectionGroup]element to the [configSections]tag:

[configSections]
[sectionGroup name="system.web.extensions"
type="System.Web.Configuration.SystemWebExtensionsSectionGroup,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"]
[sectionGroup name="scripting"
type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions,
Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"]
[section name="scriptResourceHandler"
type="System.Web.Configuration.ScriptingScriptResourceHandlerSection,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" requirePermission="false"
allowDefinition="MachineToApplication"/]
[sectionGroup name="webServices"
type="System.Web.Configuration.ScriptingWebServicesSectionGroup,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"]
[section name="jsonSerialization"
type="System.Web.Configuration.ScriptingJsonSerializationSection,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" requirePermission="false"
allowDefinition="Everywhere" /]
[section name="profileService"
type="System.Web.Configuration.ScriptingProfileServiceSection,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" requirePermission="false"
allowDefinition="MachineToApplication" /]
[section
name="authenticationService"
type="System.Web.Configuration.ScriptingAuthenticationServiceSection,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" requirePermission="false"
allowDefinition="MachineToApplication" /]
[/sectionGroup]
[/sectionGroup]
[/sectionGroup]
[/configSections]

2. Add a
[controls] section as a child of the [system.web]/[pages] tag.

[pages]
[controls]
[add tagPrefix="asp" namespace="System.Web.UI"
assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/]
[/controls]
[/pages]

3. Add
the following tag to the [assemblies] tag, within [compilation]:

[assemblies]
[add assembly="System.Web.Extensions,
Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/]
[/assemblies]

4. Add some new registrations to the end of the
[httpHandlers] section:

[httpHandlers]
[add verb="*" path="*.asmx"
validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/]
[add verb="*" path="*_AppService.axd"
validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/]
[add verb="GET,HEAD"
path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" validate="false"/]
[/httpHandlers]

5. Add a new registration to the HttpModules section, beneath any
existing registrations.

[httpModules]
[add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/]
[/httpModules]


6. Add a SafeControl entry for the System.Web.UI
namespace from Microsoft Ajax Extensions, within the
[SharePoint]/[SafeControls]section:

[SafeControls]
[SafeControl
Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*"
Safe="True" /]
[/SafeControls]

7. Finally, add the following
configuration tags at the bottom of web.config, near the bottom before the end
[configuration] tag.

[system.web.extensions]
[scripting]
[webServices]
[!-- Uncomment this line to enable the authentication
service. Include requireSSL="true" if appropriate. --]
[!--
[authenticationService enabled="true" requireSSL = "truefalse"/]
--]
[!-- Uncomment these lines to enable the profile service. To allow profile
properties to be retrieved and modified in ASP.NET AJAX applications, you need
to add each property name to the readAccessProperties and writeAccessProperties
attributes. --]
[!--
[profileService enabled="true"
readAccessProperties="propertyname1,propertyname2"
writeAccessProperties="propertyname1,propertyname2" /]
--]
[/webServices]
[!--
[scriptResourceHandler enableCompression="true"
enableCaching="true" /]
--]
[/scripting]
[/system.web.extensions]
[system.webServer]
[validation
validateIntegratedModeConfiguration="false"/]
[modules]
[add
name="ScriptModule" preCondition="integratedMode"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/]
[/modules]
[handlers]
[remove
name="WebServiceHandlerFactory-Integrated" /]
[add
name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/]
[add
name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd"
preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions,
Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/]
[add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD"
path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" /]
[/handlers]
[/system.webServer]

Adding a ScriptManager into a SharePoint MasterPage

Many
components of ASP.NET AJAX require the inclusion of a .NET ScriptManager control
within a page.

Although it may be possible in some cases to dynamically
insert a script manager from within a control, in many cases the control may not
be able to insert the script manager early enough in the page lifecycle
depending on how the control is used, making this tricky to get right. Also, the
control implementer will need to ensure that multiple instances of their control
(or other controls) do not result in the addition of multiple script managers
within the page. For these reasons, dynamic insertion of a ScriptManager control
from another control is not recommended.

To statically embed a script
manager into a page, it is recommended that you add the ScriptManager into the
master page of a site.

To do this, open up the master page for your
site. Typically, this will be located at [site url]/_catalogs/masterpage. You
can edit this file by opening it in an editor such as Microsoft SharePoint
Designer, or directly in Notepad by opening your master page library via DAV
(typically \\server\[pathtosite]\_catalogs\masterpage.)
Add the following
into the markup of your page. A recommended location is right beneath the
WebPartManager registration (search for [WebPartPages:SPWebPartManager id="m"
runat="Server" /]):

[asp:ScriptManager runat="server"
ID="ScriptManager1"][/asp:ScriptManager]

Using UpdatePanels within
SharePoint

UpdatePanels are a very useful addition to ASP.NET AJAX, and
represent the simplest way to convert existing, standard ASP.NET controls and
parts to take advantage of Ajax techniques. However, there are some changes
within Windows SharePoint Services which may get in the way of working with
ASP.NET AJAX.

Windows SharePoint Services JavaScript has a “form
onSubmit wrapper” which is used to override the default form action. This work
is put in place to ensure that certain types of URLs, which may contain double
byte characters, will fully work across most postback and asynchronous callback
scenarios. However, if your scenarios do not involve double byte character URLs,
you may successful disable this workaround and gain the ability to use ASP.NET
AJAX UpdatePanels.

To do this, you may need to register a client startup
script which disables this workaround, in addition to resetting the default form
action:

[script type='text/javascript']_spOriginalFormAction =
document.forms[0].action; _spSuppressFormOnSubmitWrapper=true;[/script]

This script may be directly embedded in the page, or could be emitted by
a control that uses the UpdatePanel. The following is an example of a very
simple ASP.NET Web Part which uses UpdatePanel capabilities:

using
System;
using System.Collections;
using System.Text;
using
System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI;
namespace MS.Samples
{
public class
AjaxUpdatePanelPart : WebPart
{
private Label label;
private TextBox
textBox;
protected override void CreateChildControls()
{
base.CreateChildControls();
this.EnsureUpdatePanelFixups();
UpdatePanel up = new UpdatePanel();
up.ID = "UpdatePanel1";
up.ChildrenAsTriggers = true;
up.UpdateMode =
UpdatePanelUpdateMode.Conditional;
this.Controls.Add(up);
this.textBox =
new TextBox();
this.textBox.ID = "TextBox";
up.ContentTemplateContainer.Controls.Add(this.textBox);
this.label = new
Label();
this.label.Text = "Enter your name.";
up.ContentTemplateContainer.Controls.Add(this.label);
Button button =
new Button();
button.Text = "Say Hello";
button.Click += new
EventHandler(HandleButtonClick);
up.ContentTemplateContainer.Controls.Add(button);
}
private void
HandleButtonClick(object sender, EventArgs eventArgs)
{
this.label.Text
= "Hello " + this.textBox.Text;
}
private void EnsureUpdatePanelFixups()
{
if (this.Page.Form != null)
{
string formOnSubmitAtt =
this.Page.Form.Attributes["onsubmit"];
if (formOnSubmitAtt == "return
_spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] =
"_spFormOnSubmitWrapper();";
}
}
ScriptManager.RegisterStartupScript(this, typeof(AjaxUpdatePanelPart),
"UpdatePanelFixup", "_spOriginalFormAction = document.forms[0].action;
_spSuppressFormOnSubmitWrapper=true;", true);
}
}
}

Output
Caching and ASP.NET AJAX

ASP.NET AJAX infrastructure is not compatible
with output caching features. This output caching infrastructure is a featured
component of managed content pages such as those supported by web content
management features in Microsoft Office SharePoint Server. For this reason, many
scenarios which involve output cached features may not be able to take advantage
of components like UpdatePanel. However, you will be able to successfully use
other ASP.NET AJAX features, such as the JavaScript library, combined with your
output cached pages.

Compatibility with output caching is targeted for a
future release of ASP.NET AJAX infrastructure.

Conclusion

Microsoft ASP.NET AJAX 1.0 provides great building blocks for building
rich Ajax-enabled applications. Combined with the power of the SharePoint
platform, and knowing some of the integration limitations, you can build
powerful Web2.0 applications that bring together the best of both of these
technologies.

Tuesday, February 06, 2007

VISUG event in Mechelen (Belgium)

Apparently this event was amazing. Wish I had been there. According to Jans blog (http://weblogs.asp.net/jan/default.aspx) there was a LOT of good news. See these quotes!

"Scott confirmed Daniel's statements (not supported, only use the the client side scripts, server-side controls don't work, etc), but more interesting; he told the audience that ASP.NET AJAX will be supported in SharePoint 2007. How is Microsoft going to pull off this trick? ASP.NET Ajax will be supported in SharePoint when we release a service pack for SharePoint, we will ship it later this year. "

And...

"Another statement that Scott made, (which actually contradicts Daniel's statement) was about using the UpdatePanel in web parts. According to Scott you can make use of the UpdatePanel in SharePoint, when it's hosted in a web part."

Now I like the sound of this! I want to go on record as stating that I believe (and Daniel is free to disagree, but please explain to me your logic) that UpdatePanel is the holy grail of Sharepoint. I have done a lot of Sharepoint work in the past few years and the one thing users hate more than anything is that a page has to post back, and RELOAD EVERYTHING every time. Now we all know that the Sharepoint payload is huge, and pulling it down for every tiny post back in a webpart is crazy. Lets wrap those baby's in an UpdatePanel and increase the user experience 1000-fold!

It has been my personal mission to get UpdatePanel working in a webpart, and now I know that my goal is attainable. Wish me luck!

Attention all developers!

If you are not reading Scott Guthries Blog, you should. Now. Go.

Here is the link.

http://weblogs.asp.net/scottgu/default.aspx

Saturday, January 20, 2007

MOSS and ASP.Net 2.0

I'm working on an application and we are using User Controls hosted in an ASP.Net 2.0 Web Part. Everything was working fine then suddenly nothing seemed to work right. The form view controls were either outright broken, or the we saving blank rows to the database. It took some investigating, but here is what I discovered:

1. You cannot have an Object Data Source running on MOSS and it have a parameter (insert, update or otherwise) with a type of 'object'. This appears to be the type assigned for GUIDs (database fields of type 'unique identifier'). When you do, as soon as I would bind the formview I would get a generic MOSS error page. You know the one, 'A web part is causing a problem....'
By changing the type on the parameter to 'string' everything started working. Of course that was only half the problem. Since making this change eliminated the MOSS error but I was still getting blank rows in the database.

2. The other thing I discovered. You cannot use the asp:table control in templates of the form view. When you do, the data fields are no longer bound to the datasource. The asp:table is bound. The controls of the form view are now children of the asp:table and not the form view. You could probably get around this by fully qualifying the controls for the parameters but why?

So, we changed the templates back to straight HTML tables and changed the parameter types to strings and voila! The app is working as it should.

Now keep in mind that outside off MOSS the app worked fine without changing the parameter types. The asp:tables were still an issue thou.

Weird no?

Wednesday, January 17, 2007

Oh no he didn't!

Well, thank you very much Mr. Shupps (and Mr. Bowman too I'll bet!). So what are five things that people don't know about me that aren't either a) embarrassing or b) still subject to a statute of limitations? How about these:

1) I was in college for 9 years, and I am NOT a doctor. Now some of you may think that a statement like that is quite embarrassing, but you would be wrong. Dead wrong. It's just that I spent a couple of years deciding if computers were my true love (they are BTW, just ask my wife). Then I worked a full time career while trying to finish up my degree. Now 24k dollars and 240 credit hours later I hold a Bachelor of Science in Information Systems degree from the University of Texas. Yes, I could probably also hold a BA in Management, Account and Marketing (not to mention psychology [it's a long story]) with all those hours but thems the facts.

2) I am a huge gadget freak. I mean HUGE with all caps! I don't talk much about it in my blog so most of you probably don't know that yet. But if you saw my study you'd think eBay exploded all over it.

3) My first job was at Six Flags. There I said it. It's not on my resume and I don't speak of it often. When I turned fifteen I took a job at Six Flags Over Texas. It was a magical summer of standing in a store by myself with no way to pee for 6 hours at a time. Ahhh memories.

4) I have never been to Europe. It's a lame one but I'm running out of good stuff. Sorry. I hope to go sometime in the next two years. Otherwise I'll have to make do with the subject of number 5. Can't stand the wait, then lets go...

5) I have been to Disney World 10 times in 8 years (and almost no place else). Sound crazy, well yeah it probably is. My wife's family LOVES Disney World. And they work for an airline (initials AA, good luck figuring that out suckers!) so airfare is not an issue. They go for every vacation, and we didn't have kids in the family at all most of that time. Yeah that's right we went for ourselves, just the adults. And it rocked! I am a convert. I even have clothes with Mickey Mouse on them (ok, now that is embarrassing).

Well, there you have it. Enjoy. If I find anyone who has NOT been it yet I'll tag 'em. Otherwise it dies with me.

Goodnight.