tag:blogger.com,1999:blog-93609702024-03-14T07:48:48.763+00:00Dev NotesFixes to common .NET problems, as well as information on .NET features and solutions to common problems that are not language-specific.Unknownnoreply@blogger.comBlogger42125tag:blogger.com,1999:blog-9360970.post-91831230829812053062015-01-22T09:51:00.000+00:002015-01-22T09:51:04.206+00:00LINQ JoinsUse Inner Join when you know you've got a match:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-family: Consolas, Courier, monospace !important; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17.5499992370605px; margin: 0px; orphans: auto; overflow: auto; padding: 5px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><span style="color: blue;">var</span> innerJoinQuery =
<span style="color: blue;">from</span> category <span style="color: blue;">in</span> categories
<span style="color: blue;">join</span> prod <span style="color: blue;">in</span> products <span style="color: blue;">on</span> category.ID <span style="color: blue;">equals</span> prod.CategoryID
<span style="color: blue;">select</span> <span style="color: blue;">new</span> { ProductName = prod.Name, Category = category.Name }; <span style="color: green;">//produces flat sequence</span></pre>
<br />
<br />
Use Group Join when you want to see associated records in another set, for example:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-family: Consolas, Courier, monospace !important; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17.5499992370605px; margin: 0px; orphans: auto; overflow: auto; padding: 5px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><span style="color: blue;">var</span> innerGroupJoinQuery =
<span style="color: blue;">from</span> category <span style="color: blue;">in</span> categories
<span style="color: blue;">join</span> prod <span style="color: blue;">in</span> products <span style="color: blue;">on</span> category.ID <span style="color: blue;">equals</span> prod.CategoryID <span style="color: blue;">into</span> prodGroup
<span style="color: blue;">select</span> <span style="color: blue;">new</span> { CategoryName = category.Name, Products = prodGroup }; </pre>
<br />
You can then perform a sub-query using that group if you want to, e.g.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-family: Consolas, Courier, monospace !important; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17.5499992370605px; margin: 0px; orphans: auto; overflow: auto; padding: 5px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><span style="color: blue;">var</span> innerGroupJoinQuery2 =
<span style="color: blue;">from</span> category <span style="color: blue;">in</span> categories
<span style="color: blue;">join</span> prod <span style="color: blue;">in</span> products <span style="color: blue;">on</span> category.ID <span style="color: blue;">equals</span> prod.CategoryID <span style="color: blue;">into</span> prodGroup
<span style="color: blue;">from</span> prod2 <span style="color: blue;">in</span> prodGroup
<span style="color: blue;">where</span> prod2.UnitPrice > 2.50M
<span style="color: blue;">select</span> prod2;</pre>
<br />When you Left-Outer Join all the elemtns in the left source sequence are returned even if no matches are found in the right sequence. We use 'DefaultIfEmpty' to provide a NULL or a default value for the right-side element to produce if a left-side element has no matches. You can use null as the default or you can specify your own, e.g.<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; color: black; font-family: Consolas, Courier, monospace !important; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 17.5499992370605px; margin: 0px; orphans: auto; overflow: auto; padding: 5px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><span style="color: blue;">var</span> leftOuterJoinQuery =
<span style="color: blue;">from</span> category <span style="color: blue;">in</span> categories
<span style="color: blue;">join</span> prod <span style="color: blue;">in</span> products <span style="color: blue;">on</span> category.ID <span style="color: blue;">equals</span> prod.CategoryID <span style="color: blue;">into</span> prodGroup
<span style="color: blue;">from</span> item <span style="color: blue;">in</span> prodGroup.DefaultIfEmpty(<span style="color: blue;">new</span> Product { Name = String.Empty, CategoryID = 0 })
<span style="color: blue;">select</span> <span style="color: blue;">new</span> { CatName = category.Name, ProdName = item.Name };</pre>
<br />
See here for more info: https://msdn.microsoft.com/en-us/library/bb311040.aspx<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-29467123404696348892014-04-02T18:59:00.000+01:002014-04-02T18:59:24.286+01:00Check for duplicates SQLSELECT<br /> contentid, contenttypefieldid, COUNT(*)<br />FROM<br /> contentvalue<br />GROUP BY<br /> contentid, contenttypefieldid<br />HAVING <br /> COUNT(*) > 1Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-40958314653764189672014-02-19T11:25:00.000+00:002014-02-19T11:25:15.187+00:00An old one, but worth remembering...Resetting the identity value of any SQL table is as easy as follows:<br />
<br />
<pre>USE AdventureWorks2012;
GO
<b>DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);</b>
GO</pre>
<pre> </pre>
<pre>http://technet.microsoft.com/en-us/library/ms176057.aspx</pre>
<pre> </pre>
<pre> </pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-9262093345528408322013-12-06T10:06:00.003+00:002013-12-06T10:06:57.673+00:00RoutingWhen adding custom routing in MVC, any custom routing must go BEFORE the default. For example:<br />
<br />
<pre style="background: #1e1e1e; color: gainsboro; font-family: Consolas; font-size: 13;"><span style="color: #569cd6;">public</span> <span style="color: #569cd6;">static</span> <span style="color: #569cd6;">void</span> <span style="color: white;">RegisterRoutes</span>(<span style="color: #4ec9b0;">RouteCollection</span> <span style="color: white;">routes</span>)
{
<span style="color: white;">routes</span><span style="color: #b4b4b4;">.</span><span style="color: white;">IgnoreRoute</span>(<span style="color: #d69d85;">"{resource}.axd/{*pathInfo}"</span>);
<span style="color: white;">routes</span><span style="color: #b4b4b4;">.</span><span style="color: white;">MapRoute</span>(
<span style="color: white;">name</span>: <span style="color: #d69d85;">"Zing"</span>,
<span style="color: white;">url</span>: <span style="color: #d69d85;">"zing/{type}/{p}"</span>,
<span style="color: white;">defaults</span>: <span style="color: #569cd6;">new</span> { <span style="color: white;">controller</span> <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"zing"</span>, <span style="color: white;">action</span> <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"Index"</span>, <span style="color: white;">type</span> <span style="color: #b4b4b4;">=</span> <span style="color: #4ec9b0;">UrlParameter</span><span style="color: #b4b4b4;">.</span><span style="color: white;">Optional</span> }
);
<span style="color: white;">routes</span><span style="color: #b4b4b4;">.</span><span style="color: white;">MapRoute</span>(
<span style="color: white;">name</span>: <span style="color: #d69d85;">"Default"</span>,
<span style="color: white;">url</span>: <span style="color: #d69d85;">"{controller}/{action}/{id}"</span>,
<span style="color: white;">defaults</span>: <span style="color: #569cd6;">new</span> { <span style="color: white;">controller</span> <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"Home"</span>, <span style="color: white;">action</span> <span style="color: #b4b4b4;">=</span> <span style="color: #d69d85;">"Index"</span>, <span style="color: white;">id</span> <span style="color: #b4b4b4;">=</span> <span style="color: #4ec9b0;">UrlParameter</span><span style="color: #b4b4b4;">.</span><span style="color: white;">Optional</span> }
);
}</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-89864536123114228912013-12-03T12:26:00.003+00:002013-12-03T12:26:34.460+00:00ToTitleCase methodThe following lets you format a whole string in Title format; for example 'the news today' becomes 'The News Today' when applied.
string val = new CultureInfo("en-GB", false).TextInfo.ToTitleCase(val as String);Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-17256200623907748552013-03-06T10:17:00.001+00:002013-03-06T10:50:01.693+00:00Code Prettifier<p>
For a long time, I've been intending to make use of a good code "prettifier" - something which keeps the formatting of code when you blog it and that provides appropriate contrast on the page. I have discovered the "Blogger Code Prettifier" and have followed instructions to install it on my own blog. From what I can see so far, the results are good!
<br />
Check it out <a href="http://pkario.blogspot.com/2010/04/blogger-code-prettifier.html">here</a>
</p>
<p>And here's what it can do!</p>
<pre class="prettyprint lang-html">
static void Main(string[] args)
{
CopyObjectsUsingAutoMapper();
Console.ReadLine();
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-55153110554491460252013-03-06T09:26:00.002+00:002013-03-06T10:51:14.793+00:00The joy of Auto-MapperAuto-Mapper solves a common problem - its mission is to make code that's used to map one object to another, obsolete. Its own website summarises the vision of the product adequately:<br />
<br />
"AutoMapper is a simple little library built to solve a deceptively complex problem - getting rid of code that mapped one object to another. This type of code is rather dreary and boring to write, so why not invent a tool to do it for us?"<br />
<br />
<a href="http://automapper.org/">http://automapper.org/</a><br />
<br />
I decided to throw together a really quick example.<br />
<br />
First, I defined two identically built, but differently named, classes:<br />
<br />
<pre class="prettyprint lang-html">public class AltPlanA
{
public string Name { get; set; }
public int FirstRowNumber { get; set; }
public int LastRowNumber { get; set; }
public string FirstRowLetter { get; set; }
public string LastRowLetter { get; set; }
}
public class AltPlanB
{
public string Name { get; set; }
public int FirstRowNumber { get; set; }
public int LastRowNumber { get; set; }
public string FirstRowLetter { get; set; }
public string LastRowLetter { get; set; }
}
</pre>
<br />
<br />
Then, in a separate class, I wrote some mapping logic:<br />
<br />
<pre class="prettyprint lang-html"> public class AutoMapEx
{
public AutoMapEx()
{
}
public AltPlanB DoMapping()
{
// Create the map
Mapper.CreateMap<altplana altplanb="">();
// Define source (this might, for example, come back from a DB)
AltPlanA planA = new AltPlanA()
{
FirstRowLetter = "A",
FirstRowNumber = 1,
LastRowLetter = "Z",
LastRowNumber = 10,
Name = "My Plan"
};
// Copy to another object
AltPlanB planB = Mapper.Map<altplana altplanb="">(planA);
return planB;
}
}
</altplana></altplana></pre>
<br />
I wanted to see the result of my mapping - to ensure it was working correctly - in a console window. To facilitate this, I decided to override the ToString() method in my AltPlanB class, like so:<br />
<br />
<pre class="prettyprint lang-html">
public override string ToString()
{
return "Name : " + Name + "\nFirstRowLetter: " + FirstRowLetter +
"\nFirstRowNumber: " + FirstRowNumber.ToString()
+ "\nLastRowLetter: " + LastRowLetter
+ "\nLastRowNumber: " + LastRowNumber;
}
</pre>
<br />
My new AltPlanB class looked like this:<br />
<br />
<pre class="prettyprint lang-html"> public class AltPlanB
{
public string Name { get; set; }
public int FirstRowNumber { get; set; }
public int LastRowNumber { get; set; }
public string FirstRowLetter { get; set; }
public string LastRowLetter { get; set; }
public override string ToString()
{
return "Name : " + Name + "\nFirstRowLetter: " + FirstRowLetter +
"\nFirstRowNumber: " + FirstRowNumber.ToString()
+ "\nLastRowLetter: " + LastRowLetter
+ "\nLastRowNumber: " + LastRowNumber;
}
}
</pre>
<br />
Then I wrote some simple calling code on the Console side:<br />
<br />
<pre class="prettyprint lang-html"> static void CopyObjectsUsingAutoMapper()
{
AutoMapEx mapper = new AutoMapEx();
AltPlanB bPlan = mapper.DoMapping();
Console.WriteLine(bPlan.ToString());
}
</pre>
<br />
Then I called this from my Main method:<br />
<br />
<pre class="prettyprint lang-html">
static void Main(string[] args)
{
CopyObjectsUsingAutoMapper();
Console.ReadLine();
}
</pre>
<br />
Running the application produced the following output:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-wTpvywp_e1o/UTcNjHVqS4I/AAAAAAAAAZA/155kRMVJXtM/s1600/automapperout.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="http://4.bp.blogspot.com/-wTpvywp_e1o/UTcNjHVqS4I/AAAAAAAAAZA/155kRMVJXtM/s640/automapperout.jpg" width="640" /></a></div>
<br />
<b>Going Further</b><br />
<b><br /></b>
Above is quite a straightforward example, but Auto-Mapper can go much further than that, for example objects do not necessarily have to be identical in order to map. By default, AM matches like for like (name and variable type) to do its mapping, but there are other possibilities too. See <a href="https://github.com/AutoMapper/AutoMapper/wiki">https://github.com/AutoMapper/AutoMapper/wiki</a> to read up on what those possibilities are.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-67110369901150433362013-03-04T11:56:00.000+00:002013-03-04T11:58:48.214+00:00Accessing a TFS file that has not been checked in (by someone other than you)In the scenario where a member of your team has checked out a file, disappeared from the company, thus rendering their profile/machine unusable, take the following steps to rectify the situation:<br />
<br />
<br />
<ol>
<li>Open a Visual Studio command prompt</li>
<li>Type the following: <b>tf undo /workspace:OtherUserWorkSpace;OtherUser $/Project/ItemName.cs</b></li>
</ol>
<br />
<br />
Replace '<i>OtherUserWorkspace</i>' with the workspace name where the file is checked out (i.e. the user's computer name)<br />
Replace '<i>OtherUser</i>' with the username that has checked out the file<br />
Replace '<i>$/Project/ItemName.cs</i>' with the full path (including all namespaces) with the file that needs to be undone<br />
<br />
Example:<br />
<br />
<b>tf undo /workspace:WRK0130-PC;rbobby $/MISV2/www/Web.config.</b><br />
<br />
You'll get an error such as the following when you first attempt to access the file:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ivR-gDE4xc8/UTSLL3lhzmI/AAAAAAAAAWE/TtTTalmH0TU/s1600/tfscheckout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="http://4.bp.blogspot.com/-ivR-gDE4xc8/UTSLL3lhzmI/AAAAAAAAAWE/TtTTalmH0TU/s640/tfscheckout.png" width="640" /></a></div>
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-47498367164238454262012-05-03T09:11:00.002+01:002012-05-03T09:11:30.544+01:00Grant execute perms on all SPROCS to a userRecently we had a problem getting grant permissions going on all sprocs in a db we'd deployed.<br />
<br />
Please see the brilliant 'The Code Project' article by Sumit Amar with the solution:<br />
<br />
http://www.codeproject.com/Articles/5860/Grant-Execute-on-all-procedures-to-a-userUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-10855502611197682952012-02-09T10:24:00.000+00:002012-02-09T10:24:18.327+00:00Asserting Exception messages in unit testsI found a handy little class for checking against specific exception types and their messages which is a nice upgrade from the standard "ExpectedException" attribute.<br />
<br />
I must credit the author of this, found on Stack Overflow. Link here: <a href="http://stackoverflow.com/questions/113395/how-can-i-test-for-an-expected-exception-with-a-specific-exception-message-from">http://stackoverflow.com/questions/113395/how-can-i-test-for-an-expected-exception-with-a-specific-exception-message-from</a><br />
<br />
The class is as follows:<br />
<br />
<br />
<pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">public static class ExceptionAssert
{
public static T Throws<t>(Action action) where T : Exception
{
try
{
action();
}
catch (T ex)
{
return ex;
}
Assert.Fail("Exception of type {0} should be thrown.", typeof(T));
// The compiler doesn't know that Assert.Fail
// will always throw an exception
return null;
}
}</t></code></pre>
<pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"><span style="font-family: 'Times New Roman'; font-size: small; line-height: normal; text-align: -webkit-auto; white-space: normal;">An example of a test that makes use of this class is below</span></pre>
<pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"><pre style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">[TestMethod]
public void GetOrganisation_MultipleOrganisations_ThrowsException()
{
OrganizationList organizations = new Organizations();
organizations.Add(new Organization());
organizations.Add(new Organization());
var ex = ExceptionAssert.Throws<criticalexception>(
() => organizations.GetOrganization());
Assert.AreEqual(MyRes.MultipleOrganisationsNotAllowed, ex.Message);
}</criticalexception></code></pre>
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-68497162220382361252012-01-05T16:46:00.002+00:002012-01-05T16:46:44.501+00:00Downloading Zip FilesDownloading Zip files from a remote host can be a tricky business...<br />
<br />
You can approach it in the following way:<br />
<br />
<br />
private void GetDownloadDocument(string filename, Uri url)<br />
{<br />
// Create a stream for the file<br />
Stream stream = null;<br />
<br />
// This controls how many bytes to read at a time and send to the client<br />
int bytesToRead = 10000;<br />
<br />
// Buffer to read bytes in chunk size specified above<br />
byte[] buffer = new Byte[bytesToRead];<br />
<br />
// The number of bytes read<br />
try<br />
{<br />
//Create a WebRequest to get the file<br />
HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(url);<br />
<br />
//Create a response for this request<br />
HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();<br />
<br />
if (fileReq.ContentLength > 0)<br />
fileResp.ContentLength = fileReq.ContentLength;<br />
<br />
//Get the Stream returned from the response<br />
stream = fileResp.GetResponseStream();<br />
<br />
// prepare the response to the client. resp is the client Response<br />
<br />
//Indicate the type of data being sent<br />
<br />
<br />
System.Web.HttpResponse resp = System.Web.HttpContext.Current.Response;<br />
resp.ContentType = "application/octet-stream";<br />
<br />
<br />
//Name the file<br />
resp.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");<br />
resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());<br />
<br />
int length;<br />
do<br />
{<br />
// Verify that the client is connected.<br />
if (resp.IsClientConnected)<br />
{<br />
// Read data into the buffer.<br />
length = stream.Read(buffer, 0, bytesToRead);<br />
<br />
// and write it out to the response's output stream<br />
resp.OutputStream.Write(buffer, 0, length);<br />
<br />
// Flush the data<br />
resp.Flush();<br />
<br />
//Clear the buffer<br />
buffer = new Byte[bytesToRead];<br />
}<br />
else<br />
{<br />
// cancel the download if client has disconnected<br />
length = -1;<br />
}<br />
} while (length > 0); //Repeat until no data is read<br />
}<br />
finally<br />
{<br />
if (stream != null)<br />
{<br />
//Close the input stream<br />
stream.Close();<br />
}<br />
}<br />
<br />
<br />
}<br />
<br />
But this can present a number of problems - particularly with regards to Internet Explorer in its ability to allow the file to be downloaded. Far better to take the 'present a link approach' as per below:<br />
<br />
<br />
public string DownloadZipToServer(string fileName, Uri url)<br />
{<br />
// Get the file from the remote server and save it to a local (to the server) folder, before returning the path.<br />
<br />
HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(url);<br />
// Create a response for this request<br />
HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();<br />
string pathToFile = "";<br />
string mainUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);<br />
string relativePathToFile = mainUrl + "/Docs/" + fileName;<br />
<br />
using (Stream stream = fileResp.GetResponseStream())<br />
{<br />
pathToFile = System.Web.HttpContext.Current.Server.MapPath("/Docs/" + fileName);<br />
using (FileStream fs = new FileStream(pathToFile, FileMode.Append))<br />
{<br />
int length = 0;<br />
int bytesToRead = 1000;<br />
byte[] buffer = new byte[bytesToRead];<br />
<br />
do<br />
{<br />
length = stream.Read(buffer, 0, bytesToRead);<br />
fs.Write(buffer, 0, length);<br />
<br />
} while (length > 0);<br />
}<br />
}<br />
<br />
return relativePathToFile;<br />
}<br />
<br />
Then present the result of this method as a standard hyperlink.<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-46089848081665424252011-11-23T09:45:00.001+00:002011-11-23T09:56:21.903+00:00Resetting a table's identity in SQL ServerThe following syntax is what's needed if at any time you need to reset the auto-identity (INT) of any table.<br />
<br />
<b>DBCC CHECKIDENT([tablename(string)], [command], [numbertoreseedto(int)])</b><br />
<br />
So, for example, if I wanted to reset the current identity value for my Customer table to 39, I would write the following:<br />
<br />
<b>DBCC CHECKIDENT('Customer', RESEED, 39)</b><br />
<br />
Note that the table name is in quotes. Also, it's important to note that the number you use for your reseed will increment by one for the next new entry into the table. Generally speaking you will be reseeding to the last known identity value in your table. So, in my example above, if the last row entry reads 39 as its ID column, then I will reseed to 39, meaning the next row I add will have an ID value of 40. I can reseed to 40 if I choose (actually you can in theory reseed to anything equal to or beyond the maximum ID value in the table currently), but it would mean that you'd end up with a 'gap' in your column IDs; so they might read: 39, 41, 42... and so on, with 40 being missing because of the way the RESEED occurred. So, assuming you're aiming for consecutive numbers (which most of us are when it comes to IDs for table rows) then <b>always reseed to the last known identity value.</b>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-76497498459584169972011-11-01T12:10:00.000+00:002011-11-01T12:12:03.736+00:00ASPX data-bound values and Javascript combined - tips and tricksThere are ways at combining ASPX data bound portions of code neatly with Javascript and some of the syntax is not very memorable and can be tricky.
To get a reference to a server control on the page via javascript, use the ClientID property, like so:
<blockquote><b>var grid = document.getElementById("<%= CurrApprovalsGrid.ClientID %>");</b></blockquote>
Alternatively, if you're using jQuery:
<blockquote><b>var grid = $find("<%= CurrApprovalsGrid.ClientID %>");</b></blockquote>
To pass bound values (inside 'Eval' methods) to a javascript function, the syntax is the following:
<b><blockquote>OnClientClick='<%# "if (!checkDocument(" + Eval("JobId") + "," + Eval("SubJobId") + ")) return false;" %>'</blockquote></b>
Make careful note of the extra speech marks - these must be included as is or the page will break.
<br /><br />
To fire an ItemCommand on a server side control in a grid view - for example a LinkButton from javascript code, use the following syntax:
<blockquote><b>var masterTable = $find("<%= CurrApprovalsGrid.ClientID %>").get_masterTableView();
masterTable.fireCommand("ViewLatest", ""); // 'ViewLatest' is the name of the CommandName</b></blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-24309391724205221342009-04-27T16:14:00.002+01:002009-04-27T16:14:41.356+01:00Value cannot be null. Parameter name: gWhen programming in Sharepoint, if this error occurs check that there<br>is no Web.Config variable retrieval occuring at the private variable<br>declaration stage, e.g.<p>private string myString =<br>System.Configuration.ConfigurationManager.AppSettings["myString"].ToString();<p>where a Web.Config value that matches has not been declared in the<br>Web.Config file itself.<p>A far better practise is to retrieve such variables at the page load<br>stage, or in the constructor of your class, i.e.<p>private string myString = "";<br>public MyClass()<br>{<br> myString = System.Configuration.ConfigurationManager.AppSettings["myString"].ToString();<br>}Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-9360970.post-62520478847167456662009-01-14T14:02:00.003+00:002009-01-14T14:04:51.230+00:00Old Skool VB TrickeryRecently I had need to modify some column values in an Excel spreadsheet.<br /><br />I used the following combination of the InStr and Mid functions to modify values on all rows in Sheet1.<br /><br />Sub RemoveHashesFromAM()<br /><br />Dim b<br />Dim v<br /><br />Dim lresult As String<br /><br />For i = 1 To 1124<br /><br />If InStr(1, Sheet1.Cells(i, 16), ";#") > 0 Then<br /><br />b = InStr(1, Sheet1.Cells(i, 16), ";#")<br />b = b + 2<br /><br />Sheet1.Cells(i, 16) = Mid(Sheet1.Cells(i, 16), b)<br /><br /><br />End If<br /><br />Next i<br /><br />End Sub<br /><br /><br />And I used the following Replace and Trim functions as necessary<br /><br />Sheet1.Cells(i, 31) = Replace(Sheet1.Cells(i, 31), ";#", " ")<br />Sheet1.Cells(i, 31) = Trim(Sheet1.Cells(i, 31))Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-39008540598104476702008-10-23T13:47:00.003+01:002008-10-23T14:32:49.301+01:00Elevation nightmaresRecently I've been struggling with an all too common error in Sharepoint development:<br /><br /><span style="font-weight:bold;">"The operation is not valid due to the current state of the object"</span><br /><br />Elevation of code is necessary in Sharepoint coding because, depending on the user in context at the time the application code executes, an un-elevated version of the code may or may not work. You need to have the correct rights as the user running the application code at a given point in time in order to have it execute successfully.<br /><br />Up until now I'd been doing all my elevation like so:<br /><br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red43\green145\blue175;\red255\green255\blue255;\red0\green0\blue0;\red0\green0\blue255;\red163\green21\blue21;}??\fs20 \cf1 SPSecurity\cf0 .RunWithElevatedPrivileges(\cf4 delegate\cf0 ()\par ?? \{\par ?? \cf4 using\cf0 (\cf1 SPSite\cf0 elevatedSite = \cf4 new\cf0 \cf1 SPSite\cf0 (siteUrl))\par ?? \{\par ?? \cf4 using\cf0 (\cf1 SPWeb\cf0 elevatedWeb = elevatedSite.OpenWeb())\par ?? \{\par ?? \cf1 SPList\cf0 elevatedList = elevatedWeb.Lists[\cf5 "Tasks"\cf0 ];\par ?? \cf4 if\cf0 (elevatedList != \cf4 null\cf0 )\par ?? \{\par ?? \cf1 SPListItem\cf0 elevatedListItem = elevatedList.Items[0];\par ??\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The task is: "\cf0 + elevatedListItem[\cf5 "Task"\cf0 ].ToString());\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The due date for the task is: "\cf0 + elevatedListItem[\cf5 "DueDate"\cf0 ].ToString());\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The task was created by: "\cf0 + elevatedListItem[\cf5 "Creator"\cf0 ].ToString());\par ?? \}\par ?? \}\par ?? \} \par ?? \});\par ??}<br />--><br /><div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><pre style="margin: 0px;"><span style="color: #2b91af;">SPSecurity</span>.RunWithElevatedPrivileges(<span style="color: blue;">delegate</span>()</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: blue;">using</span> (<span style="color: #2b91af;">SPSite</span> elevatedSite = <span style="color: blue;">new</span> <span style="color: #2b91af;">SPSite</span>(siteUrl))</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: blue;">using</span> (<span style="color: #2b91af;">SPWeb</span> elevatedWeb = elevatedSite.OpenWeb())</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">SPList</span> elevatedList = elevatedWeb.Lists[<span style="color: #a31515;">"Tasks"</span>];</pre><pre style="margin: 0px;"> <span style="color: blue;">if</span> (elevatedList != <span style="color: blue;">null</span>)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">SPListItem</span> elevatedListItem = elevatedList.Items[0];</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task is: "</span> + elevatedListItem[<span style="color: #a31515;">"Task"</span>].ToString());</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The due date for the task is: "</span> + elevatedListItem[<span style="color: #a31515;">"DueDate"</span>].ToString());</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task was created by: "</span> + elevatedListItem[<span style="color: #a31515;">"Creator"</span>].ToString());</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> } </pre><pre style="margin: 0px;"> });</pre></div><br /><br /><br />This code block will work flawlessly - the details of the task output to the console.<br /><br />But the problem comes when I try to update the list item...<br /><br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red43\green145\blue175;\red255\green255\blue255;\red0\green0\blue0;\red0\green0\blue255;\red163\green21\blue21;}??\fs20 \cf1 SPSecurity\cf0 .RunWithElevatedPrivileges(\cf4 delegate\cf0 ()\par ?? \{\par ?? \cf4 using\cf0 (\cf1 SPSite\cf0 elevatedSite = \cf4 new\cf0 \cf1 SPSite\cf0 (siteUrl))\par ?? \{\par ?? \cf4 using\cf0 (\cf1 SPWeb\cf0 elevatedWeb = elevatedSite.OpenWeb())\par ?? \{\par ?? \cf1 SPList\cf0 elevatedList = elevatedWeb.Lists[\cf5 "Tasks"\cf0 ];\par ?? \cf4 if\cf0 (elevatedList != \cf4 null\cf0 )\par ?? \{\par ?? \cf1 SPListItem\cf0 elevatedListItem = elevatedList.Items[0];\par ??\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The task is: "\cf0 + elevatedListItem[\cf5 "Task"\cf0 ].ToString());\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The due date for the task is: "\cf0 + elevatedListItem[\cf5 "DueDate"\cf0 ].ToString());\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "The task was created by: "\cf0 + elevatedListItem[\cf5 "Creator"\cf0 ].ToString());\par ??\par ??\par ?? \cf4 try\par ??\cf0 \{\par ?? elevatedListItem[\cf5 "DueDate"\cf0 ] = \cf1 DateTime\cf0 .Now.AddDays(12).ToString();\par ?? \cf4 try\par ??\cf0 \{\par ?? elevatedWeb.AllowUnsafeUpdates = \cf4 true\cf0 ;\par ?? elevatedListItem.Update();\par ?? \}\par ?? \cf4 catch\cf0 (\cf1 SPException\cf0 updateEx)\par ?? \{\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "There was an error updating the list item. "\cf0 + updateEx.ToString());\par ?? \}\par ?? \cf4 finally\par ??\cf0 \{\par ?? elevatedWeb.AllowUnsafeUpdates = \cf4 false\cf0 ;\par ?? \}\par ?? \}\par ?? \cf4 catch\cf0 (\cf1 SPException\cf0 updateFieldValueEx)\par ?? \{\par ?? \cf1 Console\cf0 .WriteLine(\cf5 "Error updating field value for column 'DueDate'. "\cf0 + updateFieldValueEx.ToString());\par ?? \}\par ?? \}\par ?? \}\par ?? \} \par ?? \});\par ??}<br />--><br /><div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><pre style="margin: 0px;"><span style="color: #2b91af;">SPSecurity</span>.RunWithElevatedPrivileges(<span style="color: blue;">delegate</span>()</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: blue;">using</span> (<span style="color: #2b91af;">SPSite</span> elevatedSite = <span style="color: blue;">new</span> <span style="color: #2b91af;">SPSite</span>(siteUrl))</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: blue;">using</span> (<span style="color: #2b91af;">SPWeb</span> elevatedWeb = elevatedSite.OpenWeb())</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">SPList</span> elevatedList = elevatedWeb.Lists[<span style="color: #a31515;">"Tasks"</span>];</pre><pre style="margin: 0px;"> <span style="color: blue;">if</span> (elevatedList != <span style="color: blue;">null</span>)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">SPListItem</span> elevatedListItem = elevatedList.Items[0];</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task is: "</span> + elevatedListItem[<span style="color: #a31515;">"Task"</span>].ToString());</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The due date for the task is: "</span> + elevatedListItem[<span style="color: #a31515;">"DueDate"</span>].ToString());</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task was created by: "</span> + elevatedListItem[<span style="color: #a31515;">"Creator"</span>].ToString());</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> <span style="color: blue;">try</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedListItem[<span style="color: #a31515;">"DueDate"</span>] = <span style="color: #2b91af;">DateTime</span>.Now.AddDays(12).ToString();</pre><pre style="margin: 0px;"> <span style="color: blue;">try</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedWeb.AllowUnsafeUpdates = <span style="color: blue;">true</span>;</pre><pre style="margin: 0px;"> elevatedListItem.Update();</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">catch</span> (<span style="color: #2b91af;">SPException</span> updateEx)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"There was an error updating the list item. "</span> + updateEx.ToString());</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">finally</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedWeb.AllowUnsafeUpdates = <span style="color: blue;">false</span>;</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">catch</span> (<span style="color: #2b91af;">SPException</span> updateFieldValueEx)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Error updating field value for column 'DueDate'. "</span> + updateFieldValueEx.ToString());</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> } </pre><pre style="margin: 0px;"> });</pre></div><br /><br />The error will occur:<br /><span style="font-weight:bold;">"The operation is not valid due to the current state of the object"</span><br /><br />Basically, in short, there appears to be a bit of an issue with updating an item inside an elevated wrapper. My best guess as to the reason this is occurring is that it is due to the fact that elevation of code will not allow for updates to occur because then the update would be occuring as an elevated user and would not contain information on the user in context running the code which is of course used to update the modified by value on a list item, though I have not found any official line to support this theory.<br /><br /><span style="font-weight:bold;">The Solution</span><br /><br />The solution is to rejig your code slightly and do your update <span style="font-style:italic;">outside</span> of your elevation wrapper, like so:<br /><br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green128\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue0;\red0\green0\blue255;\red163\green21\blue21;}??\fs20 \cf1 // Declare list item, list and web variables outside of elevation block\par ??\par ??\cf3 SPListItem\cf0 elevatedListItem = \cf5 null\cf0 ;\par ??\cf3 SPList\cf0 elevatedList = \cf5 null\cf0 ;\par ??\cf3 SPWeb\cf0 elevatedWeb = \cf5 null\cf0 ;\par ??\par ??\cf1 // Elevate to get hold of the list item\par ??\par ??\cf3 SPSecurity\cf0 .RunWithElevatedPrivileges(\cf5 delegate\cf0 ()\par ?? \{\par ?? \cf5 using\cf0 (\cf3 SPSite\cf0 elevatedSite = \cf5 new\cf0 \cf3 SPSite\cf0 (siteUrl))\par ?? \{\par ?? elevatedWeb = elevatedSite.OpenWeb();\par ?? \par ?? elevatedList = elevatedWeb.Lists[\cf6 "Tasks"\cf0 ];\par ?? \cf5 if\cf0 (elevatedList != \cf5 null\cf0 )\par ?? \{\par ?? elevatedListItem = elevatedList.Items[0];\par ?? \}\par ?? \par ?? \} \par ?? \});\par ??\par ??\cf1 // Do the output and update\par ??\par ??\cf3 Console\cf0 .WriteLine(\cf6 "The task is: "\cf0 + elevatedListItem[\cf6 "Task"\cf0 ].ToString());\par ??\cf3 Console\cf0 .WriteLine(\cf6 "The due date for the task is: "\cf0 + elevatedListItem[\cf6 "DueDate"\cf0 ].ToString());\par ??\cf3 Console\cf0 .WriteLine(\cf6 "The task was created by: "\cf0 + elevatedListItem[\cf6 "Creator"\cf0 ].ToString());\par ??\par ??\cf5 if\cf0 (elevatedListItem != \cf5 null\cf0 )\par ??\{\par ??\par ?? \cf5 try\par ??\cf0 \{\par ?? elevatedListItem[\cf6 "DueDate"\cf0 ] = \cf3 DateTime\cf0 .Now.AddDays(12).ToString();\par ?? \cf5 try\par ??\cf0 \{\par ?? elevatedWeb.AllowUnsafeUpdates = \cf5 true\cf0 ;\par ?? elevatedListItem.Update();\par ?? \}\par ?? \cf5 catch\cf0 (\cf3 SPException\cf0 updateEx)\par ?? \{\par ?? \cf3 Console\cf0 .WriteLine(\cf6 "There was an error updating the list item. "\cf0 + updateEx.ToString());\par ?? \}\par ?? \cf5 finally\par ??\cf0 \{\par ?? elevatedWeb.AllowUnsafeUpdates = \cf5 false\cf0 ; \par ?? \}\par ?? \}\par ?? \cf5 catch\cf0 (\cf3 SPException\cf0 updateFieldValueEx)\par ?? \{\par ?? \cf3 Console\cf0 .WriteLine(\cf6 "Error updating field value for column 'DueDate'. "\cf0 + updateFieldValueEx.ToString());\par ?? \}\par ??\}\par ??}<br />--><br /><div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><pre style="margin: 0px;"><span style="color: green;">// Declare list item, list and web variables outside of elevation block</span></pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: #2b91af;">SPListItem</span> elevatedListItem = <span style="color: blue;">null</span>;</pre><pre style="margin: 0px;"><span style="color: #2b91af;">SPList</span> elevatedList = <span style="color: blue;">null</span>;</pre><pre style="margin: 0px;"><span style="color: #2b91af;">SPWeb</span> elevatedWeb = <span style="color: blue;">null</span>;</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: green;">// Elevate to get hold of the list item</span></pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: #2b91af;">SPSecurity</span>.RunWithElevatedPrivileges(<span style="color: blue;">delegate</span>()</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: blue;">using</span> (<span style="color: #2b91af;">SPSite</span> elevatedSite = <span style="color: blue;">new</span> <span style="color: #2b91af;">SPSite</span>(siteUrl))</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedWeb = elevatedSite.OpenWeb();</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> elevatedList = elevatedWeb.Lists[<span style="color: #a31515;">"Tasks"</span>];</pre><pre style="margin: 0px;"> <span style="color: blue;">if</span> (elevatedList != <span style="color: blue;">null</span>)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedListItem = elevatedList.Items[0];</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> } </pre><pre style="margin: 0px;"> });</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: green;">// Do the output and update</span></pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task is: "</span> + elevatedListItem[<span style="color: #a31515;">"Task"</span>].ToString());</pre><pre style="margin: 0px;"><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The due date for the task is: "</span> + elevatedListItem[<span style="color: #a31515;">"DueDate"</span>].ToString());</pre><pre style="margin: 0px;"><span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"The task was created by: "</span> + elevatedListItem[<span style="color: #a31515;">"Creator"</span>].ToString());</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"><span style="color: blue;">if</span> (elevatedListItem != <span style="color: blue;">null</span>)</pre><pre style="margin: 0px;">{</pre><pre style="margin: 0px;"> </pre><pre style="margin: 0px;"> <span style="color: blue;">try</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedListItem[<span style="color: #a31515;">"DueDate"</span>] = <span style="color: #2b91af;">DateTime</span>.Now.AddDays(12).ToString();</pre><pre style="margin: 0px;"> <span style="color: blue;">try</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedWeb.AllowUnsafeUpdates = <span style="color: blue;">true</span>;</pre><pre style="margin: 0px;"> elevatedListItem.Update();</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">catch</span> (<span style="color: #2b91af;">SPException</span> updateEx)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"There was an error updating the list item. "</span> + updateEx.ToString());</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">finally</span></pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> elevatedWeb.AllowUnsafeUpdates = <span style="color: blue;">false</span>; </pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;"> <span style="color: blue;">catch</span> (<span style="color: #2b91af;">SPException</span> updateFieldValueEx)</pre><pre style="margin: 0px;"> {</pre><pre style="margin: 0px;"> <span style="color: #2b91af;">Console</span>.WriteLine(<span style="color: #a31515;">"Error updating field value for column 'DueDate'. "</span> + updateFieldValueEx.ToString());</pre><pre style="margin: 0px;"> }</pre><pre style="margin: 0px;">}</pre></div><br /><br />That should do it! There should be no more operation is invalid error.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-80347639206222364222008-08-15T10:33:00.009+01:002008-08-15T10:41:47.994+01:00AJAX call within the same pageThere is a way you can trick the code behind on an aspx page into believing it's a web service.<br /><br /><span style="font-weight:bold;">Example</span><br /><br />First set up your code behind like so:<br /><br /><br />using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.Services;<br /><br />namespace PostAuthenticateRequestModule<br />{<br /> public class SignOut : Page<br /> {<br /> <br /> [WebMethod]<br /> public static string GetServerTime()<br /> {<br /> return DateTime.Now.ToString();<br /> }<br /> }<br />}<br /><br />And then your ASPX page goes something like this:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lc2j2Dvj8Pk/SKVO_r4e4vI/AAAAAAAAAHo/OL-QtPKm1rk/s1600-h/ajaxcalling.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Lc2j2Dvj8Pk/SKVO_r4e4vI/AAAAAAAAAHo/OL-QtPKm1rk/s320/ajaxcalling.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234676997906424562" /></a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-9195538956353640882007-02-20T13:39:00.000+00:002007-02-20T13:58:09.997+00:00ASP.NET 2.0 ObjectDataSource MadnessOk so after several days and nights of torment, I have learnt quite a lot about GridView controls and binding (or not, as the case may be) to them.<br /><br /><br />You thought with .NET 2.0 that all your data binding woes had been answered. Oh how very wrong you were, you poor, poor developer (emphasis on poor; these are hard times, what with house prices soaring and whatnot).<br /><br />It is true to say that you <span style="font-weight: bold;">can</span> use an ObjectDataSource in conjunction with a GridView control to present data to the user in a nice tabular format, though you are not likely to achieve this without a) pain b) coffee and c) (in extreme cases) a near-death experience.<br /><br />Here are some brief and scattered notes on my experiences whilst attempting to use Object Data Sources:<br /><br />- Update methods can get easily out of synch. There is a hack-around/fix for this - use the ODS 'OnUpdating' method, like so:<br /><br /><blockquote> //protected void DtypesODS_Updating(object source, ObjectDataSourceMethodEventArgs e)<br /> {<br /> // Modify input parameters because ODS is too dumb to figure it out. <br /> if (e.InputParameters.Contains("DType"))<br /> e.InputParameters.Remove("DType");<br /> }</blockquote>And obviously add a ref to that in your aspx, or initialise the event by overriding OnInit.<br /><br />[More to come.]<br /><hints id="hah_hints"></hints>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-9360970.post-19114769598602494282007-02-15T09:53:00.000+00:002007-02-15T09:59:48.800+00:00Using A Class From A Seperate Assembly With An ObjectDataSourceFirst, add a reference to the assembly at the top of the page:<br /><br /><blockquote><%@ Register TagPrefix="MyAssembly" Namespace="MyAssembly.Data" Assembly="MyAssembly, Version=1.0.0.1, Culture=neutral, PublicKeyToken=zj1251fcc32b5cg6" %></blockquote><br /><br />Now set the ObjectDataSource's "TypeName" property to the specific class:<br /><br />TypeName="MyAssembly.Data.MyDataClass"<br /><br />Now right click on the object data source in design view and select 'Configure Data Source' and you'll see the methods on your class to choose from.<br /><br /><br /><br /><br /><br /><hints id="hah_hints"></hints>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-67819633615875762122007-02-09T10:49:00.000+00:002007-02-09T10:59:28.888+00:00ASP.NET 2.0 - Some Basic Things To Remember- When you want to use simple binding with no evaluation:<br /><br /># Bind("MyFieldName")<br /><asp:templatefield headertext="Lead"></asp:templatefield><br />- When you want to use evaluation, for example a value against a protected method, use:<br /><br /># IsLead(Eval("Lead"))<asp:templatefield headertext="Lead"><itemtemplate><asp:label id="lblLead" runat="server" text="'<%#"></asp:label><br /> </itemtemplate> </asp:templatefield><br />Code behind:<br />protected string IsLead(object val)<br /> {<br /> if (val.ToString() == "True")<br /> return "Yes";<br /> else<br /> return String.Empty;<br /> }<br /><hints id="hah_hints"></hints>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-5955569373359024162006-12-15T09:52:00.000+00:002006-12-18T14:09:49.450+00:00Sharepoint rollup web partsI've recently been working with Sharepoint 2007 on a large scale project. A common requirement for many Sharepoint-enabled web portals is to create what is termed as a 'rollup' of data. In a nutshell, this entails the amalgamation of one or more Sharepoint 'Lists' - e.g. Tasks, Shared Documents, etc. But not simply an amalgamation of that data on one level - For if, as is commonly the case, you have set up sub-sites underneath your top level site, then you'll want to collect data from the lists within those sites too. The term associated with this bundling of site and sub-sites' data is known as a rollup.<br /><br />One of the requirements for the portal I've been working on was to create a rollup webpart of all the Tasks lists across the entire site collection. Using VS.NET, I created the following WebPart-derived class and deployed it to the Sharepoint server.<br /><blockquote><br /><style type="text/css"><br />.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt; }<br />.cl { margin: 0px; }<br />.cln { color: teal; }<br />.cb1 { color: blue; }<br />.cb2 { color: green; }<br />.cb3 { color: gray; }<br /></style><br /><div class="cf"><br /><p class="cl"><span class="cln"> 1</span> <span class="cb1">using</span> System;</p><br /><p class="cl"><span class="cln"> 2</span> <span class="cb1">using</span> System.Runtime.InteropServices;</p><br /><p class="cl"><span class="cln"> 3</span> <span class="cb1">using</span> System.Web.UI;</p><br /><p class="cl"><span class="cln"> 4</span> <span class="cb1">using</span> System.Web.UI.WebControls.WebParts;</p><br /><p class="cl"><span class="cln"> 5</span> <span class="cb1">using</span> System.Xml.Serialization;</p><br /><p class="cl"><span class="cln"> 6</span> </p><br /><p class="cl"><span class="cln"> 7</span> <span class="cb1">using</span> Microsoft.SharePoint;</p><br /><p class="cl"><span class="cln"> 8</span> <span class="cb1">using</span> Microsoft.SharePoint.WebControls;</p><br /><p class="cl"><span class="cln"> 9</span> <span class="cb1">using</span> Microsoft.SharePoint.WebPartPages;</p><br /><p class="cl"><span class="cln"> 10</span> </p><br /><p class="cl"><span class="cln"> 11</span> <span class="cb1">using</span> System.Xml;</p><br /><p class="cl"><span class="cln"> 12</span> <span class="cb1">using</span> System.Xml.Xsl;</p><br /><p class="cl"><span class="cln"> 13</span> <span class="cb1">using</span> System.IO;</p><br /><p class="cl"><span class="cln"> 14</span> <span class="cb1">using</span> System.Text;</p><br /><p class="cl"><span class="cln"> 15</span> </p><br /><p class="cl"><span class="cln"> 16</span> <span class="cb1">using</span> System.Data;</p><br /><p class="cl"><span class="cln"> 17</span> </p><br /><p class="cl"><span class="cln"> 18</span> <span class="cb1">namespace</span> Custom.WebParts</p><br /><p class="cl"><span class="cln"> 19</span> {</p><br /><p class="cl"><span class="cln"> 20</span> [Guid("9e209402-e946-4070-b869-3faa90a92513")]</p><br /><p class="cl"><span class="cln"> 21</span> <span class="cb1">public</span> <span class="cb1">class</span> TasksRollUp : System.Web.UI.WebControls.WebParts.WebPart</p><br /><p class="cl"><span class="cln"> 22</span> {</p><br /><p class="cl"><span class="cln"> 23</span> <span class="cb2">// Private vars.</span></p><br /><p class="cl"><span class="cln"> 24</span> <span class="cb1">private</span> <span class="cb1">string</span> strCulture = "en-GB";</p><br /><p class="cl"><span class="cln"> 25</span> <span class="cb1">private</span> <span class="cb1">string</span> strUserOrGroup = "Context"; <span class="cb2">// by default, base the results on the user in context.</span></p><br /><p class="cl"><span class="cln"> 26</span> </p><br /><p class="cl"><span class="cln"> 27</span> <span class="cb2">// Checkbox private vars.</span></p><br /><p class="cl"><span class="cln"> 28</span> <span class="cb1">private</span> <span class="cb1">bool</span> bStatusNotStarted = <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 29</span> <span class="cb1">private</span> <span class="cb1">bool</span> bStatusInProgress = <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 30</span> <span class="cb1">private</span> <span class="cb1">bool</span> bStatusCompleted = <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 31</span> <span class="cb1">private</span> <span class="cb1">bool</span> bStatusDeferred = <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 32</span> <span class="cb1">private</span> <span class="cb1">bool</span> bStatusWaitingOnSomeoneElse = <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 33</span> </p><br /><p class="cl"><span class="cln"> 34</span> </p><br /><p class="cl"><span class="cln"> 35</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><summary></span></p><br /><p class="cl"><span class="cln"> 36</span> <span class="cb3">///</span><span class="cb2"> The main method to write to the UI.</span></p><br /><p class="cl"><span class="cln"> 37</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"></summary></span></p><br /><p class="cl"><span class="cln"> 38</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="writer"></param></span></p><br /><p class="cl"><span class="cln"> 39</span> <span class="cb1">protected</span> <span class="cb1">override</span> <span class="cb1">void</span> Render(HtmlTextWriter writer)</p><br /><p class="cl"><span class="cln"> 40</span> {</p><br /><p class="cl"><span class="cln"> 41</span> <span class="cb1">string</span> results = LoadTasks();</p><br /><p class="cl"><span class="cln"> 42</span> writer.Write(results);</p><br /><p class="cl"><span class="cln"> 43</span> }</p><br /><p class="cl"><span class="cln"> 44</span> </p><br /><p class="cl"><span class="cln"> 45</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><summary></span></p><br /><p class="cl"><span class="cln"> 46</span> <span class="cb3">///</span><span class="cb2"> Loads 'All My Tasks'.</span></p><br /><p class="cl"><span class="cln"> 47</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"></summary></span></p><br /><p class="cl"><span class="cln"> 48</span> <span class="cb1">private</span> <span class="cb1">string</span> LoadTasks()</p><br /><p class="cl"><span class="cln"> 49</span> {</p><br /><p class="cl"><span class="cln"> 50</span> <span class="cb2">// Knock up a SPSiteDataQuery object and detail the CAML query.</span></p><br /><p class="cl"><span class="cln"> 51</span> <span class="cb1">bool</span> applyContextOrGroup = (<span class="cb1">this</span>.UserOrGroup == "") ? <span class="cb1">false</span> : <span class="cb1">true</span>;</p><br /><p class="cl"><span class="cln"> 52</span> </p><br /><p class="cl"><span class="cln"> 53</span> <span class="cb1">string</span> user = "";</p><br /><p class="cl"><span class="cln"> 54</span> <span class="cb1">if</span> (<span class="cb1">this</span>.UserOrGroup.ToLower() == "context")</p><br /><p class="cl"><span class="cln"> 55</span> user = SPContext.Current.Web.CurrentUser.Name;</p><br /><p class="cl"><span class="cln"> 56</span> <span class="cb1">else</span></p><br /><p class="cl"><span class="cln"> 57</span> user = <span class="cb1">this</span>.UserOrGroup;</p><br /><p class="cl"><span class="cln"> 58</span> </p><br /><p class="cl"><span class="cln"> 59</span> SPSiteDataQuery q = <span class="cb1">new</span> SPSiteDataQuery();</p><br /><p class="cl"><span class="cln"> 60</span> </p><br /><p class="cl"><span class="cln"> 61</span> <span class="cb1">if</span> (!applyContextOrGroup)</p><br /><p class="cl"><span class="cln"> 62</span> {</p><br /><p class="cl"><span class="cln"> 63</span> q.ViewFields = "<FieldRef Name=\"ID\" /><FieldRef Name=\"Title\" /><FieldRef Name=\"Created\" /><FieldRef Name=\"Body\" />";</p><br /><p class="cl"><span class="cln"> 64</span> q.Lists = "<Lists ServerTemplate=\"107\"/>";</p><br /><p class="cl"><span class="cln"> 65</span> q.Webs = "<Webs Scope=\"Recursive\"/>";</p><br /><p class="cl"><span class="cln"> 66</span> q.Query = "<Where><Eq><FieldRef Name=\"ID\"/><Value Type=\"String\">1</Value></Eq></Where>";</p><br /><p class="cl"><span class="cln"> 67</span> }</p><br /><p class="cl"><span class="cln"> 68</span> <span class="cb1">else</span> <span class="cb1">if</span> (applyContextOrGroup == <span class="cb1">true</span> && user == "context")</p><br /><p class="cl"><span class="cln"> 69</span> {</p><br /><p class="cl"><span class="cln"> 70</span> q.ViewFields = "<FieldRef Name=\"ID\" /><FieldRef Name=\"Title\" /><FieldRef Name=\"Created\" /><FieldRef Name=\"Body\" />";</p><br /><p class="cl"><span class="cln"> 71</span> q.Lists = "<Lists ServerTemplate=\"107\"/>";</p><br /><p class="cl"><span class="cln"> 72</span> q.Webs = "<Webs Scope=\"Recursive\"/>";</p><br /><p class="cl"><span class="cln"> 73</span> q.Query = "<Where><And><Eq><FieldRef Name=\"ID\" /><Value Type=\"Counter\">1</Value></Eq><Eq><FieldRef Name=\"AssignedTo\" /><Value Type=\"User\">" + user + "</Value></Eq></And></Where>";</p><br /><p class="cl"><span class="cln"> 74</span> }</p><br /><p class="cl"><span class="cln"> 75</span> <span class="cb1">else</span></p><br /><p class="cl"><span class="cln"> 76</span> {<span class="cb2">//GROUPS.</span></p><br /><p class="cl"><span class="cln"> 77</span> q.ViewFields = "<FieldRef Name=\"ID\" /><FieldRef Name=\"Title\" /><FieldRef Name=\"Created\" /><FieldRef Name=\"Body\" />";</p><br /><p class="cl"><span class="cln"> 78</span> q.Lists = "<Lists ServerTemplate=\"107\"/>";</p><br /><p class="cl"><span class="cln"> 79</span> q.Webs = "<Webs Scope=\"Recursive\"/>";</p><br /><p class="cl"><span class="cln"> 80</span> q.Query = "<Where><Eq><FieldRef Name=\"AssignedTo\" /><Value Type=\"User\">" + user + "</Value></Eq></Where>";</p><br /><p class="cl"><span class="cln"> 81</span> }</p><br /><p class="cl"><span class="cln"> 82</span> </p><br /><p class="cl"><span class="cln"> 83</span> DataTable dt = <span class="cb1">null</span>;</p><br /><p class="cl"><span class="cln"> 84</span> SPWeb w = SPContext.Current.Web;</p><br /><p class="cl"><span class="cln"> 85</span> <span class="cb2">// Load ALL 'My' tasks from across ALL sites.</span></p><br /><p class="cl"><span class="cln"> 86</span> dt = w.GetSiteData(q);</p><br /><p class="cl"><span class="cln"> 87</span> </p><br /><p class="cl"><span class="cln"> 88</span> w = <span class="cb1">null</span>;</p><br /><p class="cl"><span class="cln"> 89</span> </p><br /><p class="cl"><span class="cln"> 90</span> <span class="cb1">if</span> (dt.Rows.Count == 0)</p><br /><p class="cl"><span class="cln"> 91</span> <span class="cb1">return</span> "No tasks to view on this level.";</p><br /><p class="cl"><span class="cln"> 92</span> </p><br /><p class="cl"><span class="cln"> 93</span> DataSet ds = <span class="cb1">new</span> DataSet();</p><br /><p class="cl"><span class="cln"> 94</span> ds.Tables.Add(dt);</p><br /><p class="cl"><span class="cln"> 95</span> </p><br /><p class="cl"><span class="cln"> 96</span> <span class="cb1">string</span> xml = ds.GetXml();</p><br /><p class="cl"><span class="cln"> 97</span> </p><br /><p class="cl"><span class="cln"> 98</span> <span class="cb2">// Format the data.</span></p><br /><p class="cl"><span class="cln"> 99</span> xml = System.Text.RegularExpressions.Regex.Replace(xml, "&lt;", "<");</p><br /><p class="cl"><span class="cln"> 100</span> xml = System.Text.RegularExpressions.Regex.Replace(xml, "&gt;", ">");</p><br /><p class="cl"><span class="cln"> 101</span> </p><br /><p class="cl"><span class="cln"> 102</span> <span class="cb2">// XSL parameter list.</span></p><br /><p class="cl"><span class="cln"> 103</span> XsltArgumentList oArgList = <span class="cb1">new</span> XsltArgumentList();</p><br /><p class="cl"><span class="cln"> 104</span> </p><br /><p class="cl"><span class="cln"> 105</span> <span class="cb2">// Site ID is based on SPContext.</span></p><br /><p class="cl"><span class="cln"> 106</span> </p><br /><p class="cl"><span class="cln"> 107</span> <span class="cb1">#if</span> DEBUG</p><br /><p class="cl"><span class="cln"> 108</span> <span class="cb3"> oArgList.AddParam("SiteId", "", "2352352"); // FOR TEST. </span></p><br /><p class="cl"><span class="cln"> 109</span> <span class="cb1">#else</span></p><br /><p class="cl"><span class="cln"> 110</span> oArgList.AddParam("SiteId", "", SPContext.Current.Site.ID.ToString());</p><br /><p class="cl"><span class="cln"> 111</span> <span class="cb1">#endif</span></p><br /><p class="cl"><span class="cln"> 112</span> <span class="cb2">// Set the culture, based on the setting. (Default to site wide culture setting).</span></p><br /><p class="cl"><span class="cln"> 113</span> oArgList.AddParam("Culture", "", <span class="cb1">this</span>.Culture);</p><br /><p class="cl"><span class="cln"> 114</span> </p><br /><p class="cl"><span class="cln"> 115</span> <span class="cb1">string</span> outHtml = XslTransform(xml, "/", "Shared Documents", "TaskList.xsl", oArgList);</p><br /><p class="cl"><span class="cln"> 116</span> <span class="cb1">return</span> outHtml;</p><br /><p class="cl"><span class="cln"> 117</span> }</p><br /><p class="cl"><span class="cln"> 118</span> </p><br /><p class="cl"><span class="cln"> 119</span> <span class="cb1">public</span> CustomDocument GetDocument(<span class="cb1">string</span> fileName, <span class="cb1">string</span> pathWeb, <span class="cb1">string</span> listName)</p><br /><p class="cl"><span class="cln"> 120</span> {</p><br /><p class="cl"><span class="cln"> 121</span> SPSite gSite = <span class="cb1">null</span>;</p><br /><p class="cl"><span class="cln"> 122</span> SPWeb gWeb = <span class="cb1">null</span>;</p><br /><p class="cl"><span class="cln"> 123</span> SPList gList;</p><br /><p class="cl"><span class="cln"> 124</span> CustomDocument bdoc = <span class="cb1">new</span> CustomDocument();</p><br /><p class="cl"><span class="cln"> 125</span> <span class="cb1">try</span></p><br /><p class="cl"><span class="cln"> 126</span> {</p><br /><p class="cl"><span class="cln"> 127</span> <span class="cb2">// If the Path web is passed in then use it to find the list otherwise use current context </span></p><br /><p class="cl"><span class="cln"> 128</span> <span class="cb1">#if</span> DEBUG</p><br /><p class="cl"><span class="cln"> 129</span> <span class="cb3"> //FOR TEST.</span></p><br /><p class="cl"><span class="cln"> 130</span> <span class="cb3"> SPSite s = new SPSite("http://localhost");</span></p><br /><p class="cl"><span class="cln"> 131</span> <span class="cb3"> gSite = s;</span></p><br /><p class="cl"><span class="cln"> 132</span> <span class="cb1">#else</span></p><br /><p class="cl"><span class="cln"> 133</span> <span class="cb2">// gSite = SPContext.Current.Site; // Doesn't work. Mais pourquoi?</span></p><br /><p class="cl"><span class="cln"> 134</span> SPSite s = <span class="cb1">new</span> SPSite("http://localhost");</p><br /><p class="cl"><span class="cln"> 135</span> gSite = s;</p><br /><p class="cl"><span class="cln"> 136</span> <span class="cb1">#endif</span></p><br /><p class="cl"><span class="cln"> 137</span> gWeb = gSite.AllWebs[pathWeb];</p><br /><p class="cl"><span class="cln"> 138</span> gList = gWeb.Lists[listName];</p><br /><p class="cl"><span class="cln"> 139</span> </p><br /><p class="cl"><span class="cln"> 140</span> <span class="cb1">foreach</span> (SPListItem item <span class="cb1">in</span> gList.Items)</p><br /><p class="cl"><span class="cln"> 141</span> {</p><br /><p class="cl"><span class="cln"> 142</span> <span class="cb1">if</span> (item.Title.ToLower() == fileName.ToLower())</p><br /><p class="cl"><span class="cln"> 143</span> {</p><br /><p class="cl"><span class="cln"> 144</span> <span class="cb1">byte</span>[] xmlfile = item.File.OpenBinary();</p><br /><p class="cl"><span class="cln"> 145</span> System.Text.ASCIIEncoding enc = <span class="cb1">new</span> System.Text.ASCIIEncoding();</p><br /><p class="cl"><span class="cln"> 146</span> </p><br /><p class="cl"><span class="cln"> 147</span> bdoc.Body = enc.GetString(xmlfile);</p><br /><p class="cl"><span class="cln"> 148</span> bdoc.DocumentID = item.UniqueId.ToString();</p><br /><p class="cl"><span class="cln"> 149</span> bdoc.list = gList.ID.ToString();</p><br /><p class="cl"><span class="cln"> 150</span> <span class="cb2">//bdoc.CheckedOutTo = item.File.CheckedOutBy.ToString();</span></p><br /><p class="cl"><span class="cln"> 151</span> }</p><br /><p class="cl"><span class="cln"> 152</span> }</p><br /><p class="cl"><span class="cln"> 153</span> <span class="cb1">return</span> bdoc;</p><br /><p class="cl"><span class="cln"> 154</span> }</p><br /><p class="cl"><span class="cln"> 155</span> <span class="cb1">catch</span> (Exception ex)</p><br /><p class="cl"><span class="cln"> 156</span> {</p><br /><p class="cl"><span class="cln"> 157</span> bdoc.Body = ex.Message.ToString();</p><br /><p class="cl"><span class="cln"> 158</span> <span class="cb1">return</span> bdoc;</p><br /><p class="cl"><span class="cln"> 159</span> }</p><br /><p class="cl"><span class="cln"> 160</span> <span class="cb1">finally</span></p><br /><p class="cl"><span class="cln"> 161</span> {</p><br /><p class="cl"><span class="cln"> 162</span> </p><br /><p class="cl"><span class="cln"> 163</span> <span class="cb1">if</span> (gSite != <span class="cb1">null</span>)</p><br /><p class="cl"><span class="cln"> 164</span> gSite.Dispose();</p><br /><p class="cl"><span class="cln"> 165</span> </p><br /><p class="cl"><span class="cln"> 166</span> <span class="cb1">if</span> (gWeb != <span class="cb1">null</span>)</p><br /><p class="cl"><span class="cln"> 167</span> gWeb.Dispose();</p><br /><p class="cl"><span class="cln"> 168</span> }</p><br /><p class="cl"><span class="cln"> 169</span> }</p><br /><p class="cl"><span class="cln"> 170</span> </p><br /><p class="cl"><span class="cln"> 171</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><summary></span></p><br /><p class="cl"><span class="cln"> 172</span> <span class="cb3">///</span><span class="cb2"> Perform an XSL transform.</span></p><br /><p class="cl"><span class="cln"> 173</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"></summary></span></p><br /><p class="cl"><span class="cln"> 174</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="xml"></span><span class="cb2">The raw XML to use</span><span class="cb3"></param></span></p><br /><p class="cl"><span class="cln"> 175</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="xsl"></span><span class="cb2">The XSL document name</span><span class="cb3"></param></span></p><br /><p class="cl"><span class="cln"> 176</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="sharepointPath"></span><span class="cb2">The Sharepoint path</span><span class="cb3"></param></span></p><br /><p class="cl"><span class="cln"> 177</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="sharepointList"></span><span class="cb2">The Sharepoint list name</span><span class="cb3"></param></span></p><br /><p class="cl"><span class="cln"> 178</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><param name="parameters"></span><span class="cb2">A list of XSL parameters</span><span class="cb3"></param></span></p><br /><p class="cl"><span class="cln"> 179</span> <span class="cb3">///</span><span class="cb2"> </span><span class="cb3"><returns></returns></span></p><br /><p class="cl"><span class="cln"> 180</span> <span class="cb1">public</span> <span class="cb1">string</span> XslTransform(<span class="cb1">string</span> xml, <span class="cb1">string</span> sharepointPath, <span class="cb1">string</span> sharepointList, <span class="cb1">string</span> xsl, XsltArgumentList parameters)</p><br /><p class="cl"><span class="cln"> 181</span> {</p><br /><p class="cl"><span class="cln"> 182</span> <span class="cb2">// Get the TaskList.xsl file from Sharepoint.</span></p><br /><p class="cl"><span class="cln"> 183</span> CustomDocument oDoc = GetDocument(xsl, sharepointPath, sharepointList);</p><br /><p class="cl"><span class="cln"> 184</span> </p><br /><p class="cl"><span class="cln"> 185</span> TextReader trXSL;</p><br /><p class="cl"><span class="cln"> 186</span> trXSL = <span class="cb1">new</span> StringReader(oDoc.Body);</p><br /><p class="cl"><span class="cln"> 187</span> </p><br /><p class="cl"><span class="cln"> 188</span> <span class="cb2">// Load up a reader object with the contents of the XSL.</span></p><br /><p class="cl"><span class="cln"> 189</span> XmlReader xrXSL = XmlReader.Create(trXSL);</p><br /><p class="cl"><span class="cln"> 190</span> </p><br /><p class="cl"><span class="cln"> 191</span> StringBuilder sbHTML = <span class="cb1">new</span> StringBuilder(); <span class="cb2">// Used for HTML to be returned.</span></p><br /><p class="cl"><span class="cln"> 192</span> </p><br /><p class="cl"><span class="cln"> 193</span> <span class="cb2">// Load up an XMLDocument object with the incoming XML...</span></p><br /><p class="cl"><span class="cln"> 194</span> XmlDocument xDoc = <span class="cb1">new</span> XmlDocument();</p><br /><p class="cl"><span class="cln"> 195</span> xDoc.LoadXml(xml);</p><br /><p class="cl"><span class="cln"> 196</span> </p><br /><p class="cl"><span class="cln"> 197</span> <span class="cb2">// Create an XMLWriter object based on the string builder.</span></p><br /><p class="cl"><span class="cln"> 198</span> XmlWriter xwHTML = XmlWriter.Create(sbHTML);</p><br /><p class="cl"><span class="cln"> 199</span> </p><br /><p class="cl"><span class="cln"> 200</span> <span class="cb2">// Perform the conversion.</span></p><br /><p class="cl"><span class="cln"> 201</span> XslCompiledTransform xsltTransform = <span class="cb1">new</span> XslCompiledTransform();</p><br /><p class="cl"><span class="cln"> 202</span> xsltTransform.Load(xrXSL);</p><br /><p class="cl"><span class="cln"> 203</span> </p><br /><p class="cl"><span class="cln"> 204</span> <span class="cb1">try</span></p><br /><p class="cl"><span class="cln"> 205</span> {</p><br /><p class="cl"><span class="cln"> 206</span> <span class="cb2">// Attempt the transform.</span></p><br /><p class="cl"><span class="cln"> 207</span> xsltTransform.Transform(xDoc, parameters, xwHTML);</p><br /><p class="cl"><span class="cln"> 208</span> }</p><br /><p class="cl"><span class="cln"> 209</span> <span class="cb1">catch</span> (IOException ioEx)</p><br /><p class="cl"><span class="cln"> 210</span> {</p><br /><p class="cl"><span class="cln"> 211</span> <span class="cb1">throw</span> ioEx;</p><br /><p class="cl"><span class="cln"> 212</span> }</p><br /><p class="cl"><span class="cln"> 213</span> <span class="cb1">catch</span> (Exception ex)</p><br /><p class="cl"><span class="cln"> 214</span> {</p><br /><p class="cl"><span class="cln"> 215</span> <span class="cb1">throw</span> ex;</p><br /><p class="cl"><span class="cln"> 216</span> }</p><br /><p class="cl"><span class="cln"> 217</span> <span class="cb1">finally</span></p><br /><p class="cl"><span class="cln"> 218</span> {</p><br /><p class="cl"><span class="cln"> 219</span> <span class="cb2">// Write the results to file.</span></p><br /><p class="cl"><span class="cln"> 220</span> xwHTML.Flush();</p><br /><p class="cl"><span class="cln"> 221</span> xwHTML.Close();</p><br /><p class="cl"><span class="cln"> 222</span> </p><br /><p class="cl"><span class="cln"> 223</span> <span class="cb2">// Clean up.</span></p><br /><p class="cl"><span class="cln"> 224</span> </p><br /><p class="cl"><span class="cln"> 225</span> trXSL.Close();</p><br /><p class="cl"><span class="cln"> 226</span> trXSL.Dispose();</p><br /><p class="cl"><span class="cln"> 227</span> </p><br /><p class="cl"><span class="cln"> 228</span> xrXSL.Close();</p><br /><p class="cl"><span class="cln"> 229</span> }</p><br /><p class="cl"><span class="cln"> 230</span> </p><br /><p class="cl"><span class="cln"> 231</span> <span class="cb1">return</span> sbHTML.ToString();</p><br /><p class="cl"><span class="cln"> 232</span> }</p><br /><p class="cl"><span class="cln"> 233</span> </p><br /><p class="cl"><span class="cln"> 234</span> </p><br /><p class="cl"><span class="cln"> 235</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 236</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 237</span> [WebDescription("What is the culture? Choose for the time being from two options: the default 'en-GB' or 'en-US'")]</p><br /><p class="cl"><span class="cln"> 238</span> [WebDisplayName("Active Culture")]</p><br /><p class="cl"><span class="cln"> 239</span> [System.ComponentModel.Category("Custom Settings")]</p><br /><p class="cl"><span class="cln"> 240</span> <span class="cb1">public</span> <span class="cb1">string</span> Culture</p><br /><p class="cl"><span class="cln"> 241</span> {</p><br /><p class="cl"><span class="cln"> 242</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 243</span> {</p><br /><p class="cl"><span class="cln"> 244</span> <span class="cb1">return</span> strCulture;</p><br /><p class="cl"><span class="cln"> 245</span> }</p><br /><p class="cl"><span class="cln"> 246</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 247</span> {</p><br /><p class="cl"><span class="cln"> 248</span> strCulture = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 249</span> }</p><br /><p class="cl"><span class="cln"> 250</span> }</p><br /><p class="cl"><span class="cln"> 251</span> </p><br /><p class="cl"><span class="cln"> 252</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 253</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 254</span> [WebDescription("Base the task list that is generated on the user in context (type 'Context') - e.g. show only tasks assigned to the user in context, or specify a group name, e.g. 'Administrators'")]</p><br /><p class="cl"><span class="cln"> 255</span> [WebDisplayName("Filter by User or Group")]</p><br /><p class="cl"><span class="cln"> 256</span> [System.ComponentModel.Category("Custom Settings")]</p><br /><p class="cl"><span class="cln"> 257</span> <span class="cb1">public</span> <span class="cb1">string</span> UserOrGroup</p><br /><p class="cl"><span class="cln"> 258</span> {</p><br /><p class="cl"><span class="cln"> 259</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 260</span> {</p><br /><p class="cl"><span class="cln"> 261</span> <span class="cb1">return</span> strUserOrGroup;</p><br /><p class="cl"><span class="cln"> 262</span> }</p><br /><p class="cl"><span class="cln"> 263</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 264</span> {</p><br /><p class="cl"><span class="cln"> 265</span> strUserOrGroup = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 266</span> }</p><br /><p class="cl"><span class="cln"> 267</span> }</p><br /><p class="cl"><span class="cln"> 268</span> </p><br /><p class="cl"><span class="cln"> 269</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 270</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 271</span> [WebDescription("Tick to show/hide tasks that have not been started.")]</p><br /><p class="cl"><span class="cln"> 272</span> [WebDisplayName("Not started")]</p><br /><p class="cl"><span class="cln"> 273</span> [System.ComponentModel.Category("Task Status")]</p><br /><p class="cl"><span class="cln"> 274</span> <span class="cb1">public</span> <span class="cb1">bool</span> NotStarted</p><br /><p class="cl"><span class="cln"> 275</span> {</p><br /><p class="cl"><span class="cln"> 276</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 277</span> {</p><br /><p class="cl"><span class="cln"> 278</span> <span class="cb1">return</span> bStatusNotStarted;</p><br /><p class="cl"><span class="cln"> 279</span> }</p><br /><p class="cl"><span class="cln"> 280</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 281</span> {</p><br /><p class="cl"><span class="cln"> 282</span> bStatusNotStarted = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 283</span> }</p><br /><p class="cl"><span class="cln"> 284</span> }</p><br /><p class="cl"><span class="cln"> 285</span> </p><br /><p class="cl"><span class="cln"> 286</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 287</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 288</span> [WebDescription("Tick to show/hide tasks that are in progress.")]</p><br /><p class="cl"><span class="cln"> 289</span> [WebDisplayName("In progress")]</p><br /><p class="cl"><span class="cln"> 290</span> [System.ComponentModel.Category("Task Status")]</p><br /><p class="cl"><span class="cln"> 291</span> <span class="cb1">public</span> <span class="cb1">bool</span> InProgress</p><br /><p class="cl"><span class="cln"> 292</span> {</p><br /><p class="cl"><span class="cln"> 293</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 294</span> {</p><br /><p class="cl"><span class="cln"> 295</span> <span class="cb1">return</span> bStatusInProgress;</p><br /><p class="cl"><span class="cln"> 296</span> }</p><br /><p class="cl"><span class="cln"> 297</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 298</span> {</p><br /><p class="cl"><span class="cln"> 299</span> bStatusInProgress = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 300</span> }</p><br /><p class="cl"><span class="cln"> 301</span> }</p><br /><p class="cl"><span class="cln"> 302</span> </p><br /><p class="cl"><span class="cln"> 303</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 304</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 305</span> [WebDescription("Tick to show/hide tasks that have been completed.")]</p><br /><p class="cl"><span class="cln"> 306</span> [WebDisplayName("Completed")]</p><br /><p class="cl"><span class="cln"> 307</span> [System.ComponentModel.Category("Task Status")]</p><br /><p class="cl"><span class="cln"> 308</span> <span class="cb1">public</span> <span class="cb1">bool</span> Completed</p><br /><p class="cl"><span class="cln"> 309</span> {</p><br /><p class="cl"><span class="cln"> 310</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 311</span> {</p><br /><p class="cl"><span class="cln"> 312</span> <span class="cb1">return</span> bStatusCompleted;</p><br /><p class="cl"><span class="cln"> 313</span> }</p><br /><p class="cl"><span class="cln"> 314</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 315</span> {</p><br /><p class="cl"><span class="cln"> 316</span> bStatusCompleted = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 317</span> }</p><br /><p class="cl"><span class="cln"> 318</span> }</p><br /><p class="cl"><span class="cln"> 319</span> </p><br /><p class="cl"><span class="cln"> 320</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 321</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 322</span> [WebDescription("Tick to show/hide tasks that have been deferred.")]</p><br /><p class="cl"><span class="cln"> 323</span> [WebDisplayName("Deferred")]</p><br /><p class="cl"><span class="cln"> 324</span> [System.ComponentModel.Category("Task Status")]</p><br /><p class="cl"><span class="cln"> 325</span> <span class="cb1">public</span> <span class="cb1">bool</span> Deferred</p><br /><p class="cl"><span class="cln"> 326</span> {</p><br /><p class="cl"><span class="cln"> 327</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 328</span> {</p><br /><p class="cl"><span class="cln"> 329</span> <span class="cb1">return</span> bStatusDeferred;</p><br /><p class="cl"><span class="cln"> 330</span> }</p><br /><p class="cl"><span class="cln"> 331</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 332</span> {</p><br /><p class="cl"><span class="cln"> 333</span> bStatusDeferred = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 334</span> }</p><br /><p class="cl"><span class="cln"> 335</span> }</p><br /><p class="cl"><span class="cln"> 336</span> </p><br /><p class="cl"><span class="cln"> 337</span> [WebPartStorage(Storage.Shared), System.Xml.Serialization.XmlElement(Namespace = "http://localhost")]</p><br /><p class="cl"><span class="cln"> 338</span> [WebBrowsable(<span class="cb1">true</span>), Personalizable(<span class="cb1">true</span>)]</p><br /><p class="cl"><span class="cln"> 339</span> [WebDescription("Tick to show/hide tasks that are waiting on someone else.")]</p><br /><p class="cl"><span class="cln"> 340</span> [WebDisplayName("Waiting on someone else")]</p><br /><p class="cl"><span class="cln"> 341</span> [System.ComponentModel.Category("Task Status")]</p><br /><p class="cl"><span class="cln"> 342</span> <span class="cb1">public</span> <span class="cb1">bool</span> WaitingOnSomeoneElse</p><br /><p class="cl"><span class="cln"> 343</span> {</p><br /><p class="cl"><span class="cln"> 344</span> <span class="cb1">get</span></p><br /><p class="cl"><span class="cln"> 345</span> {</p><br /><p class="cl"><span class="cln"> 346</span> <span class="cb1">return</span> bStatusWaitingOnSomeoneElse;</p><br /><p class="cl"><span class="cln"> 347</span> }</p><br /><p class="cl"><span class="cln"> 348</span> <span class="cb1">set</span></p><br /><p class="cl"><span class="cln"> 349</span> {</p><br /><p class="cl"><span class="cln"> 350</span> bStatusWaitingOnSomeoneElse = <span class="cb1">value</span>;</p><br /><p class="cl"><span class="cln"> 351</span> }</p><br /><p class="cl"><span class="cln"> 352</span> }</p><br /><p class="cl"><span class="cln"> 353</span> }</p><br /><p class="cl"><span class="cln"> 354</span> </p><br /><p class="cl"><span class="cln"> 355</span> <span class="cb1">public</span> <span class="cb1">class</span> CustomDocument</p><br /><p class="cl"><span class="cln"> 356</span> {</p><br /><p class="cl"><span class="cln"> 357</span> <span class="cb1">public</span> <span class="cb1">string</span> Body;</p><br /><p class="cl"><span class="cln"> 358</span> <span class="cb1">public</span> <span class="cb1">string</span> DocumentID;</p><br /><p class="cl"><span class="cln"> 359</span> <span class="cb1">public</span> <span class="cb1">string</span> CheckedOutTo;</p><br /><p class="cl"><span class="cln"> 360</span> <span class="cb1">public</span> <span class="cb1">string</span> site;</p><br /><p class="cl"><span class="cln"> 361</span> <span class="cb1">public</span> <span class="cb1">string</span> list;</p><br /><p class="cl"><span class="cln"> 362</span> }</p><br /><p class="cl"><span class="cln"> 363</span> }</p><br /></div><br /></blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-46590723841232599382006-11-23T10:13:00.001+00:002006-11-23T10:15:10.388+00:00A Fairly Painless Way To Combine Dataset Dataforeach (DataRow dr in ds2.Tables[1].Rows)<br>{<br> object[] vals = dr.ItemArray;<br> ds.Tables[1].Rows.Add(vals);<br>}<p>ItemArray is key.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-28960382817565390092006-11-02T11:48:00.001+00:002006-11-02T11:50:09.557+00:00Using Resource FilesRecently, I had a case to use an XML embedded resource file. After adding the following XML file to the solution and setting its 'Build Action' property to 'Embedded Resource'...<br><br><?xml version="1.0" encoding="utf-8" ?> <br><Config><br> <VariablefileName>../Projects/RealEstatePostcard/PostCard.xvp</VariablefileName><br> <ProjectFileForVariableEvaluation>../Projects/RealEstatePostcard/PostCard.pf</ProjectFileForVariableEvaluation> <br> <JobForVariableEvaluation>PDF_Job</JobForVariableEvaluation><br> <ShowScrollBars>Yes</ShowScrollBars><br> <BevelThickness>1</BevelThickness><br> <BevelThicknessInset>3</BevelThicknessInset> <br> <BevelColorInset>lightGray</BevelColorInset><br> <BevelColorTopLeft>lightGray</BevelColorTopLeft><br> <BevelColorBottomRight>darkGray</BevelColorBottomRight><br> <uiConfiguration> PanelPostCardConfig.xml</uiConfiguration><br> <EditImage>Edit Image: Crop and Scale Your Image</EditImage><br> <bitmapUpdateMethod>xor</bitmapUpdateMethod><br></Config><br><br>I grabbed a hold of it and set its contents against relevant public property names within my class. Like so: <br><br>private void LoadConfigValues()<br> {<br> // Create a new XmlDocument object and select the appropriate values. <br> <br> // Reference the running assembly.<br> Assembly thisAssembly = Assembly.GetExecutingAssembly();<br> <br> Stream oStrRead = thisAssembly.GetManifestResourceStream("Burrows.PageFlex.WYSIWYG.Config.Configuration.xml");<br> <br><br> XmlDocument xDoc = new XmlDocument(); <br><br> try<br> { <br> xDoc.Load(oStrRead);<br> }<br> catch (IOException ioEx)<br> {<br> throw ioEx;<br> }<br> finally<br> { <br> oStrRead.Close();<br> oStrRead.Dispose();<br> }<br><br> // Loop through doc nodes and assign values to public properties. <br> XmlNodeList oNodeList = xDoc.SelectNodes("//Config/*");<br> foreach (XmlNode xN in oNodeList)<br> {<br> switch (xN.Name)<br> {<br> case "VariablefileName": <br> this.strVariableFileName = xN.InnerText;<br> break;<br> case "ProjectFileForVariableEvaluation":<br> this.strProjectFileForVariableEvaluation = xN.InnerText;<br> break;<br> case "JobForVariableEvaluation":<br> this.strJobForVariableEvaluation = xN.InnerText;<br> break; <br> case "ShowScrollBars":<br> this.strShowScrollBars = xN.InnerText;<br> break;<br> case "BevelThickness":<br> this.strBevelThickness = xN.InnerText;<br> break;<br> case "BevelThicknessInset":<br> this.strBevelThicknessInset = xN.InnerText;<br> break; <br> case "BevelColorInset":<br> this.strBevelColorInset = xN.InnerText;<br> break;<br> case "BevelColorTopLeft":<br> this.strBevelColorTopLeft = xN.InnerText;<br> break;<br> case "BevelColorBottomRight":<br> this.strBevelColorBottomRight = xN.InnerText;<br> break;<br> case "uiConfiguration":<br> this.strUiConfiguration = xN.InnerText;<br> break;<br> case "EditImage": <br> this.strEditImage = xN.InnerText;<br> break;<br> case "bitmapUpdateMethod":<br> this.strBitmapUpdateMethod = xN.InnerText ;<br> break;<br> default:<br> break;<br> };<br> } <br> }<br>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-69704671955409625542006-10-18T11:13:00.001+01:002006-10-18T11:14:14.650+01:00Don't Underestimate The Power Of The Alt KeyRecently, whilst doing a menacing cut and paste job, I remembered the convenience of using the Alt key when selecting text.<br><br>Take the following text, for example:<br><br>Fruit Crisps<br>===== ====== <br>Strawberries Salt And Vinegar<br>Apples Cheese And Onion<br>Pears Ready Salted<br>Oranges Chicken<br>Pineapples Prawn Cocktail<br><br>Now, if I only want to grab hold of whatever is underneath the heading 'Crisps' then all I need to do is hold down my Alt key, hover over the area just left of the letter C and begin dragging across and down. This will select only that portion of text and will exclude whatever lies under the heading 'Fruit'. <br><br>Note that only certain programs support the use of this style of copying and pasting. So far I've successfully employed its use in both Visual Studio (2003 & 2005) and SQL Server (2000 & 2005).<br><br>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9360970.post-42452392526159390132006-10-04T14:46:00.000+01:002006-10-04T14:48:22.594+01:00How To Kill A Process That Just Won't Die<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/5706/1142/1600/ScreenShotOfPIDKill.0.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/5706/1142/400/ScreenShotOfPIDKill.jpg" border="0" alt="" /></a><br />Recently when developing a Windows service, I had problems terminating something through the admin GUI. There is, fortunately though, a manual way of getting your way, via the command line.Unknownnoreply@blogger.com0