Showing posts from 2016

C# Updated on Threading with .net 4

With .NET 4 we now have better ways of handling threads. So in this post I'm going to demonstrate several ways of creating and waiting for threads to finish. First example is creating 10 threads with the new Task.Factory.StartNew() method then we call Task.WaitAll and the framework handles the rest. This call will however block until all the tasks are finished. // Wait for all tasks to complete. Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) { tasks[i] = Task.Factory.StartNew(() => DoSomeWork(10000000)); } Task.WaitAll(tasks); The second way allows us to no block. var task1 = DoWorkAsync(); var task2 = DoMoreWorkAsync(); await Task.WhenAll(task1, task2);

C# parse invalid XML characters

I've been dealing with XML a bit lately and have found that when you don't control the data you get all sorts of weird stuff. XML 1.0 doesn't allow certain characters or the XML is invalid. I tested a variety of ways using streams and string builders but I found a bit of LINQ and using a .NET function and in two lines you get a string of XML that only has valid characters. var validXmlChars = val.Where( ch => XmlConvert.IsXmlChar( ch ) ).ToArray(); return new string( validXmlChars );

using jqGrid in an MVC View

Since MVC has gotten so popular and for a good damn reason we've lost the venerable WebForms grids. However a great replacement is the jqGrid an extension of the jQuery UI. However it does take some setup in your View and I personally find their documentation horrendous. Below is a very basic jqGrid but you need an empty table with the id that matches what's in the grid and a div that's used for the pager. You'll notice these items have to match and the div MUST be below the table for the display to work correctly. I'm using an MVC controller to get the data for the grid back. Now this won't let you add, delete, edit, etc because that gets a lot more complicated. For me this is a pretty basic grid. You need to specify a url to get data, I almost always use json as my datatype, and a GET to the server. Whatever data your return needs to be in a JSON format that matches the format in the  jsonReader section of the grid. See another post of mine on how to return

jqGrid get data from MVC Controller

So ever since MVC for started becoming all the rage, and for good reason! Many people have bemoaned the loss of the venerable DataGrid from WebForms. Well there are a few options out there. You have Teleriks Kendo UI suite which is great but costs money. There are a few other options but the best jqGrid a jQuery plugin. Now this grid can be a bit tricky to use. I personally find the documentation a bit short to put it politely. I've done enough grids now I'm getting the hang of it and want to share some pointers for other MVC developers out there. Now let's assume in your View you have a nice jqGrid pointed to a controller action (I'll make another post about this as well). jqGrids are very powerful and support paging, grouping, filtering, sorting, etc. Now the bad part is you have to handle all that in your controller. This controller action will show you have to sort, page, and generally retrieve data. Now for the jqGrid to work correctly it needs

Kendo UI grid update row using Javascript/jQuery

I've been working on a project that utilizes the Telerik Kendo UI grid. I've found that I have a need to change the values in the current row using client side tech (Javascript/jQuery). It's actually pretty easy to do. You get the grid, then the model bound to the grid and change the values on the model. This will refresh the values in the grid on the client side. You can save these new values in the Update controller action you define in the grid. // get the grid and model used to bind against the grid var grid = $("#AdminFalloutMappingGrid").data("kendoGrid"), model = grid.dataItem(this.element.closest("tr")); // get a value from the model, using the property name on the model var something = model.get("PropertyName"); // update the model using the Property Name model.set("PropertyName", "value"); MVC dynamically create and return image from Controller

I've found that I have a need to create an image dynamically (or read from a file) and return it directly from a controller. We can do that pretty easily. First add this method to a controller: public class ImageController : Controller { public void Generate() { try { //when we create a pixel we need to make it a random color Random randomGen = new Random(); Bitmap image = new Bitmap( width, height ); // create the graphics drawing tool using ( Graphics gfx = Graphics.FromImage( image ) ) // create a solid brush to draw the image, I'm using random colors using ( SolidBrush brush = new SolidBrush( Color.FromArgb( randomGen.Next( 255 ), randomGen.Next( 255 ), randomGen.Next( 255 ) ) ) ) { gfx.FillRectangle( brush, 0, 0, width, height ); MVC Ajax.BeginForm with busy icon

So I've been exploring the world of MVC and found it's pretty easy to do a postback to a controller and do it with AJAX and show a busy icon and keep the user from pressing the submit button. This is MVC 5 with the Razor rendering engine. Below is the entire section: <div id="divSendEmail"> @using ( Ajax.BeginForm( "SendEmail", "Contact", new AjaxOptions { UpdateTargetId = "result", LoadingElementId = "loading", OnBegin= "sendEmailLoad()", OnComplete= "completeSendEmailLoad()" } ) ) { <div id="loading" style="display: none; position: absolute; top: 50%; left: 50%; margin-top: -50px; margin-left: -50px; width: 100px; height: 100px;"> <img src="~/Content/images/gears_animated.gif" /> </div> <fieldset> Name: <input type="text" class="form-

MFC getting the current date and time

I've been updating some older MFC/C++ applications and I found I needed to get the current system time. There's a way in the Win32 API but it's clunky. MFC gives you a simple way. CTime t = CTime :: GetCurrentTime (); CString s = t . Format ( "%m%d%Y" ); The Format method can take a wide variety of parameters. See this MSDN link

ASP.NET dynamically load AJAX toolkit accordion panes

I love the Accordion pane from the AJAX toolkit, but I've found myself needing to dynamically add accordion panes to it. To do this you need to some work on the back end. The following code loops through a DataSet and dynamically creates a Label control for the header and content. It then adds those controls to a new AccordionPane and then add it to your Accordion. for ( var i = 0; i < ds.Tables[10].Rows.Count; i++ ) { Label lblContent = new Label(); lblContent.ID = Guid.NewGuid().ToString(); Label lblTitle = new Label(); lblTitle.ID = Guid.NewGuid().ToString(); lblTitle.Text = ds.Tables[2].Rows[i + 1][1].ToString(); lblContent.Text = ds.Tables[10].Rows[i][1].ToString(); AjaxControlToolkit.AccordionPane pane = new AjaxControlToolkit.AccordionPane(); pane.ID = Guid.NewGuid().ToString(); pane.HeaderContainer.Controls.Add( lblTitle ); pane