<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DataBatrix &#187; ASP.NET</title>
	<atom:link href="http://www.databatrix.com/category/asp-net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.databatrix.com</link>
	<description>The workings of Eric Bridges</description>
	<lastBuildDate>Thu, 01 Dec 2011 23:47:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Populate TreeView From Custom Object Using Serializer</title>
		<link>http://www.databatrix.com/2010/12/populate-treeview-from-custom-object-using-serializer/</link>
		<comments>http://www.databatrix.com/2010/12/populate-treeview-from-custom-object-using-serializer/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 17:40:41 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[Serialize]]></category>
		<category><![CDATA[TreeView]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=321</guid>
		<description><![CDATA[From time to time I need to spit out the public properties of an object for various reasons.  A typical use would be to show user friendly results from a web service that returns a complex object.  There could be tons of other uses!  After doing this a few times, I finially decided to post [...]]]></description>
			<content:encoded><![CDATA[<p>From time to time I need to spit out the public properties of an object for various reasons.  A typical use would be to show user friendly results from a web service that returns a complex object.  There could be tons of other uses!  After doing this a few times, I finially decided to post this so I can always reference it.  Anytime I do any recursive methods, it always takes me a couple of tweaks before getting it right.</p>
<p>The idea is that I have a custom object that I need to spin through to populate a <span style="color: #0000ff;">TreeView</span>.  I created a couple of simple methods to do such.  I though about using <span style="color: #0000ff;">Reflection</span>, but my method starting getting larger and larger because I was having to put in special code to handle certain Types (i.e. <span style="color: #0000ff;">String</span>, <span style="color: #0000ff;">ICollection</span>, etc).  Since my typical Use Case was to spit out the results of a complex object returned from a ASMX or WCF service, I decided to go the Serialize route.  My DTO class was typically already decorated with the [<span style="color: #008080;">Serializable</span>] attribute, if not, it was simple enought to add.</p>
<p>So first we serialize the object into a string of XML, then stuff that into a XmlDocument.  Then you can loop through the elements while creating each <span style="color: #0000ff;">TreeViewNode</span>.  That&#8217;s it!</p>
<pre class="brush:csharp">        public void PopulateTreeView(object obj, TreeView tv)
        {
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
            System.Text.StringBuilder sb = new System.Text.StringBuilder();  // StringBuilder to hold the XML
            using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(sb))
            {
                serializer.Serialize(writer, obj); // Serialize the object to XML
                System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
                xDoc.LoadXml(sb.ToString());  // Shove it in a XmlDocument
                tv.Nodes.Add(PopulateNode(xDoc));  // Add the Nodes to the TreeView
            }
        }

        public TreeNode PopulateNode(System.Xml.XmlNode node)
        {
            TreeNode treenode = new TreeNode(node.Name);  // Add the Name to the Node
            if (node.ChildNodes.Count == 1) //Prevents ParentNode from displaying all of the InnerText
                treenode.Text += "=" + node.InnerText; // If only 1 ChildNode then add the InnerText

            for (int i = 0; i &lt; node.ChildNodes.Count; i++)
            {
                if (node.ChildNodes[i].HasChildNodes)
                {
                    treenode.ChildNodes.Add(PopulateNode(node.ChildNodes[i]));
                }
            }
            return treenode;
        }</pre>
<p>Then call the method to populate where &#8220;customObject&#8221; is the object you want displayed in your TreeView:</p>
<pre class="brush:csharp">            PopulateTreeView(customObject, TreeView1);</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2010/12/populate-treeview-from-custom-object-using-serializer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Automatically Add RequiredFieldValidator to TextBox Controls</title>
		<link>http://www.databatrix.com/2010/11/automatically-add-requiredfieldvalidator-to-textbox-controls/</link>
		<comments>http://www.databatrix.com/2010/11/automatically-add-requiredfieldvalidator-to-textbox-controls/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 14:56:55 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[RequiredFieldValidator]]></category>
		<category><![CDATA[ValidatorCalloutExtender]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=274</guid>
		<description><![CDATA[If you are like me, you hate having to create the required field validators for a bunch of TextBox controls.  Even more if you are adding Ajax ValidatorCallout controls to all of them.  Sure, you could create another server control to extent the Textbox to automatically include this&#8230;but here is a simple alternative. I created [...]]]></description>
			<content:encoded><![CDATA[<p>If you are like me, you hate having to create the required field validators for a bunch of TextBox controls.  Even more if you are adding Ajax ValidatorCallout controls to all of them.  Sure, you could create another server control to extent the Textbox to automatically include this&#8230;but here is a simple alternative.</p>
<p>I created a method that cycles through all of the controls and checks to see if it has the attribute &#8220;Required&#8221;, and if so, then add the RequiredFieldValidator and Ajax callout controls automatically. You could obviously expand on this to meet your specific needs.<br />
Here is how you would markup your TextBox control:<br />
&lt;asp:TextBox Required=&#8221;true&#8221; ValidationGroup=&#8221;valGroup&#8221; ID=&#8221;TextBox1&#8243; runat=&#8221;server&#8221; /&gt;<br />
<br />
Here is the method in the code behind:</p>
<pre class="brush:csharp">private void AddRequiredValidations(ControlCollection controls)
{
    List requiredValidators = new List();
    for (int i = 0; i &lt; controls.Count; i++)
    {
        if (controls[i] is TextBox)
        {
            TextBox tb = (TextBox)controls[i];
            if (tb.Attributes["Required"] != null &amp;&amp; Convert.ToBoolean(tb.Attributes["Required"]))
            {
                RequiredFieldValidator requiredValidator = new RequiredFieldValidator();
                requiredValidator.ErrorMessage = "Required";
                requiredValidator.ID = "required" + tb.ID;
                requiredValidator.Display = ValidatorDisplay.None;
                requiredValidator.ValidationGroup = tb.ValidationGroup;
                requiredValidator.ControlToValidate = tb.ID;
                // Add the RequiredFieldValidator to a list to be added later
                // Since we can't add them to the control as we are cycling through them
                requiredValidators.Add(requiredValidator); 

                tb.CausesValidation = true;
            }
        }

        if (controls[i].HasControls()) // If this control has child controls
        {
            AddRequiredValidations(controls[i].Controls); // Search the child controls too
        }
    }

    // Now we can actually add the RequiredFieldValidators since we are done cycling through the existing controls
    for (int i = 0; i &lt; requiredValidators.Count; i++)
    {

        AjaxControlToolkit.ValidatorCalloutExtender callout = new AjaxControlToolkit.ValidatorCalloutExtender();
        callout.TargetControlID = requiredValidators[i].ID;
        callout.ID = requiredValidators[i].ID + "Callout";
        controls.Add(requiredValidators[i]);
        controls.Add(callout);
    }
}</pre>
<p>Then all you have to do is call it in your Page_Load() method:</p>
<pre class="brush:csharp">AddRequiredValidations(this.Controls);</pre>
<p>
This will work not only for a singe TextBox control, but also for TextBox controls buried inside a GridView or Repeater!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2010/11/automatically-add-requiredfieldvalidator-to-textbox-controls/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ListSearchExtender not finding some numeric values</title>
		<link>http://www.databatrix.com/2010/11/listsearchextender-not-finding-some-numeric-values/</link>
		<comments>http://www.databatrix.com/2010/11/listsearchextender-not-finding-some-numeric-values/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 17:20:26 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[IsSorted]]></category>
		<category><![CDATA[ListSearchExtender]]></category>
		<category><![CDATA[numeric]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=265</guid>
		<description><![CDATA[I was working on a project when I noticed something strange with my ListSearchExtender.  This was happening on 2 different controls.  One ListSearchExtender was extending a ListBox and another was on a DropDown.  Both of these controls were populated with mostly numeric values (ID numbers) sorted in order ascending order.  The DropDown box was populated [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">I was working on a project when I noticed something strange with my ListSearchExtender.  This was happening on 2 different controls.  One ListSearchExtender was extending a ListBox and another was on a DropDown.  Both of these controls were populated with mostly numeric values (ID numbers) sorted in order ascending order.  The DropDown box was populated with about 1200 ID numbers while the ListBox was populated with about 600 ID numbers along with a small description of each item.  I was using the ListSearchExtender so that the user could easily jump to a specific item if they already knew the ID number.  The proplem I was having was that the ListSearchExtender did not find and jump to certain ID numbers even though they were in the list.  Particularly this seem to happen when the ID number started with the number one (1).  For example, let&#8217;s say the ListBox/DropDown contained these values:</div>
<div id="_mcePaste">23</div>
<div id="_mcePaste">45</div>
<div id="_mcePaste">89</div>
<div id="_mcePaste">101</div>
<div id="_mcePaste">109</div>
<div id="_mcePaste">111</div>
<div id="_mcePaste">140</div>
<div id="_mcePaste">204</div>
<div id="_mcePaste">226</div>
<div id="_mcePaste">1005</div>
<div id="_mcePaste">Using the ListSearchExtender extender, I would not find 101 or 109.  Below is the markup for the ListSearchExtender:</div>
<pre class="brush:html">&lt;ajax:ListSearchExtender ID="lseAjaxDdlFilter" runat="server" TargetControlID="ddlFilter" IsSorted="true" PromptPosition="Top" /&gt;</pre>
<div id="_mcePaste">I discovered that the root of my problem was <strong>IsSorted=&#8221;true&#8221;</strong>.  Since my data was already sorted I had set this value to true to increase the performance.  I am guessing the ListSearchExtender IsSorted property is assuming the sort is by text/string instead of treating them as integers.  The same list above sorted as text would be in this order: 1005, 101, 109, 111, 140, 204, 226, 23, 45, 89.  This would throw off the functionality.  So I set <strong>IsSorted=&#8221;false&#8221;</strong> and everything works as it should!</div>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2010/11/listsearchextender-not-finding-some-numeric-values/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IE: scrollTop Not Working As Expected</title>
		<link>http://www.databatrix.com/2010/08/ie-scrolltop-not-working-as-expected/</link>
		<comments>http://www.databatrix.com/2010/08/ie-scrolltop-not-working-as-expected/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 02:04:10 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[overflow]]></category>
		<category><![CDATA[scrollTop]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=254</guid>
		<description><![CDATA[I banged my head on this one for a couple of days.  Still got a defect out of the deal, but finally got it working.  I had an ajax tabcontainer with several tabs.  In some of these tabs was GridView.  I had overflow set on a DIV that the GridView was placed in so that [...]]]></description>
			<content:encoded><![CDATA[<p>I banged my head on this one for a couple of days.  Still got a defect out of the deal, but finally got it working.  I had an ajax tabcontainer with several tabs.  In some of these tabs was GridView.  I had overflow set on a DIV that the GridView was placed in so that I would get vertical scrollbars within the page.  The issue was that I needed to keep the position of the DIV scroll on a postback.  Should not have been an issue since I have the exact same scenario on another page within the same website which work perfectly.  But for some reason, using the same code, it would not work on this particular page.  Both pages use MasterPages, tabcontainers, and a little javascript and cookies to save the scroll position.</p>
<p>When debugging the issue, I would find that it would save and get the correct scroll position from the cookie; however, when setting the scrollTop:</p>
<pre class="brush:javascript">document.getElementById('myDiv').scrollTop = scrollPosition;</pre>
<p>It would not set.  The DIV&#8217;s scrollTop would be 0 before and after the statement above even after verifying that scrollPosition had an actual value!</p>
<p>I will also mention that the grid did have a decent about of data.  Actually, enough to make the page size about 3.5 MBs by the time HTML was rendered&#8230;almost 1 MB taken up by ViewState alone!  Because of AJAX and the amount of data in the grid, there was a noticeable amount of lag when using the page&#8230;not a lot, but noticeable.</p>
<p>Work Around:</p>
<p>I started to wonder if the above javascript (which ran on window.onload) may be running too quickly&#8230;or rather, ran before IE could finish with the rest of the AJAX/javascript code on the page.  So I tried this line instead of the one above:</p>
<pre class="brush:javascript">setTimeout(function() { document.getElementById('myDiv').scrollTop = scrollPosition; }, 250);</pre>
<p>So basically, I wanted to wait 250 milliseconds before setting the scrollTop.  Much to my surprise, this worked!  By this point I was too exhausted to keep knocking down the delay to see how low it could go and still work.  I couldn&#8217;t really notice the 250 delay in setting the scroll position, so that is where I ended.</p>
<p>Your mileage may vary, but in case you have a similar issue&#8230;try a small delay when setting the scrollTop before attempting to re-engineer the whole page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2010/08/ie-scrolltop-not-working-as-expected/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET Serialization: Binary, SOAP, and XML (VB)</title>
		<link>http://www.databatrix.com/2009/10/net-serialization-binary-soap-and-xml-vb/</link>
		<comments>http://www.databatrix.com/2009/10/net-serialization-binary-soap-and-xml-vb/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 23:43:50 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Binary]]></category>
		<category><![CDATA[Serialization]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=227</guid>
		<description><![CDATA[In .NET when you need to shrink an object into a more portable format you have 3 choices.  Binary, SOAP, or XML.  The process of shrinking and expanding the object is called serialization and deserialization.  Each option has it&#8217;s own advantages which I will explain. Binary You can serialize an object into binary format quite [...]]]></description>
			<content:encoded><![CDATA[<p>In .NET when you need to shrink an object into a more portable format you have 3 choices.  Binary, SOAP, or XML.  The process of shrinking and expanding the object is called serialization and deserialization.  Each option has it&#8217;s own advantages which I will explain.</p>
<h2>Binary</h2>
<p>You can serialize an object into binary format quite easily using the .NET Framework.  This is the quickest and smallest way to serialize; however, the binary format can only be deserialized using the same .NET Framework.  This may be a problem for interoperability.  It must be noted that this format will serialize Public and Private members (unlike XML serialization).</p>
<p>The example below shows how to serialize an object called &#8220;newCustomer&#8221;:</p>
<pre class="brush:vb">        Dim newCustomer As Contact = GetSampleContact()

        Using fs As New IO.FileStream(filePathandName &amp; ".bin", IO.FileMode.Create)
            Dim binFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            binFormatter.Serialize(fs, newCustomer)
        End Using</pre>
<p>And here is the reverse to deserialize:</p>
<pre class="brush:vb">        Dim readCustomer As Contact

        Using fs As New IO.FileStream(filePathandName &amp; ".bin", IO.FileMode.Open, IO.FileAccess.Read)
            Dim binFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            readCustomer = CType(binFormatter.Deserialize(fs), Contact)
        End Using</pre>
<h2>SOAP</h2>
<p>SOAP is another method.  This is similar to the binary method except the serialized data is stored in a standardized form (SOAP) which will easily allow interoperability.  Public and Private members are serialized using this method as well.<br />
To serialize:</p>
<pre class="brush:vb">        Dim newCustomer As Contact = GetSampleContact()
        Using fs As New IO.FileStream(filePathandName &amp; "SOAP.xml", IO.FileMode.Create)
            Dim soapFormattter As New Runtime.Serialization.Formatters.Soap.SoapFormatter()
            soapFormattter.Serialize(fs, newCustomer)
        End Using</pre>
<p>And to deserialize:</p>
<pre class="brush:vb">        Dim readCustomer As Contact
        Using fs As New IO.FileStream(filePathandName &amp; "SOAP.xml", IO.FileMode.Open, IO.FileAccess.Read)
            Dim soapFormattter As New Runtime.Serialization.Formatters.Soap.SoapFormatter()
            readCustomer = CType(soapFormattter.Deserialize(fs), Contact)
        End Using</pre>
<h2>XML</h2>
<p>A third choice is using the XMLSerializer class.  This method will only serialize Public properties and members and the object must be marked with the Serializable attribute and contain an empty constructor.  This method of serialization will be smaller in size than the SOAP method since less information is serialized.  Here is an example of such class:</p>
<pre class="brush:vb">     &lt;Serializable()&gt; Class Contact

        Private _FirstName As String
        Public Property FirstName() As String
            Get
                Return _FirstName
            End Get
            Set(ByVal value As String)
                _FirstName = value
            End Set
        End Property

        Private _LastName As String
        Public Property LastName() As String
            Get
                Return _LastName
            End Get
            Set(ByVal value As String)
                _LastName = value
            End Set
        End Property

        Private _MiddleI As String
        Public Property MiddleI() As String
            Get
                Return _MiddleI
            End Get
            Set(ByVal value As String)
                _MiddleI = value
            End Set
        End Property

        Private _PIN As String
        Public WriteOnly Property PIN() As String
            Set(ByVal value As String)
                _PIN = value
            End Set
        End Property

        Sub New()

        End Sub

        Sub New(ByVal fName As String, ByVal middleI As String, ByVal lName As String, ByVal p As String)
            _FirstName = fName
            _MiddleI = middleI
            _LastName = lName
            _PIN = p
        End Sub
    End Class</pre>
<p>Here is how you would serialize using the XMLSerializer:</p>
<pre class="brush:vb">        Dim newCustomer As Contact = GetSampleContact()
        Using fs As New IO.FileStream(filePathandName &amp; ".xml", IO.FileMode.Create)
            Dim xmlFormatter As New Xml.Serialization.XmlSerializer(GetType(Contact))
            xmlFormatter.Serialize(fs, newCustomer)
        End Using</pre>
<p>And to deserialize:</p>
<pre class="brush:vb">        Dim readCustomer As Contact
        Using fs As New IO.FileStream(filePathandName &amp; ".xml", IO.FileMode.Open, IO.FileAccess.Read)
            Dim xmlFormatter As New Xml.Serialization.XmlSerializer(GetType(Contact))
            readCustomer = CType(xmlFormatter.Deserialize(fs), Contact)
        End Using</pre>
<p><img class="alignnone size-full wp-image-232" title="Serialization Demo" src="http://www.databatrix.com/wp-content/uploads/2009/10/Serialization.JPG" alt="Serialization Demo" width="505" height="336" /></p>
<p>You can download a sample serialization demo project that I created to demonstrate: <a title="Serialization Demo Project.zip" href="http://www.databatrix.com/wp-content/uploads/2009/10/SerializationDemo.zip">SerializationDemoProject.zip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/10/net-serialization-binary-soap-and-xml-vb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JobTime: Time Clock Web Application And Job Cost Tracking</title>
		<link>http://www.databatrix.com/2009/09/jobtime-time-clock-web-application-and-job-cost-tracking/</link>
		<comments>http://www.databatrix.com/2009/09/jobtime-time-clock-web-application-and-job-cost-tracking/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 13:18:06 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Payroll]]></category>
		<category><![CDATA[Timeclock]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/?p=214</guid>
		<description><![CDATA[Background The company needed to track time logged to particular jobs/projects.  The initial idea was to use a site like ClickTime.  However, for an employee to log time against a job, you would need to tell ClickTime all of your jobs (which would be tedious) or configure an integration app to automatically populate the available [...]]]></description>
			<content:encoded><![CDATA[<h3>Background</h3>
<p>The company needed to track time logged to particular jobs/projects.  The initial idea was to use a site like <a href="http://www.clicktime.com/" target="_blank">ClickTime</a>.  However, for an employee to log time against a job, you would need to tell ClickTime all of your jobs (which would be tedious) or configure an integration app to automatically populate the available jobs/projects.</p>
<h3>Solution</h3>
<p>I created a web application that would allow employees to log time against jobs/projects.  It would search instantly against their project management software for a list of available jobs.  The type of work was categorized for reporting.  Since we would have the employee&#8217;s hours, it would be used for payroll.  I implemented an export feature for preparing the payroll information for ADP and EDH.  Work time for each project was then entered into the project management software to be calculated as job cost.  As a bonus, you could use the gathered data to calculate each employees &#8220;utilization&#8221;.</p>
<table border="0">
<tbody>
<tr>
<td>
<p><div id="attachment_217" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/09/MainScreen.JPG"><img class="size-thumbnail wp-image-217" title="MainScreen" src="http://www.databatrix.com/wp-content/uploads/2009/09/MainScreen-150x150.jpg" alt="Landing page." width="150" height="150" /></a><p class="wp-caption-text">Landing page.</p></div></td>
<td>
<p><div id="attachment_216" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/09/EnterTime.JPG"><img class="size-thumbnail wp-image-216" title="EnterTime" src="http://www.databatrix.com/wp-content/uploads/2009/09/EnterTime-150x150.jpg" alt="Enter time for a particular project/job." width="150" height="150" /></a><p class="wp-caption-text">Enter time for a particular project/job.</p></div></td>
</tr>
<tr>
<td>
<p><div id="attachment_215" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/09/ApplyJobCost.JPG"><img class="size-thumbnail wp-image-215" title="ApplyJobCost" src="http://www.databatrix.com/wp-content/uploads/2009/09/ApplyJobCost-150x150.jpg" alt="Apply costs to each job." width="150" height="150" /></a><p class="wp-caption-text">Apply costs to each job.</p></div></td>
<td>
<p><div id="attachment_218" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/09/PayRoll.JPG"><img class="size-thumbnail wp-image-218" title="PayRoll" src="http://www.databatrix.com/wp-content/uploads/2009/09/PayRoll-150x150.jpg" alt="Payroll export options." width="150" height="150" /></a><p class="wp-caption-text">Payroll export options.</p></div></td>
</tr>
<tr>
<td>
<p><div id="attachment_219" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/09/Utilization.JPG"><img class="size-thumbnail wp-image-219" title="Utilization" src="http://www.databatrix.com/wp-content/uploads/2009/09/Utilization-150x150.jpg" alt="Utilization" width="150" height="150" /></a><p class="wp-caption-text">Utilization</p></div></td>
<td> </td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/09/jobtime-time-clock-web-application-and-job-cost-tracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E-manage Mobile Portal</title>
		<link>http://www.databatrix.com/2009/08/e-manage-mobile-portal/</link>
		<comments>http://www.databatrix.com/2009/08/e-manage-mobile-portal/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 15:17:46 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MS SQL]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/2009/08/e-manage-mobile-portal/</guid>
		<description><![CDATA[Background: E-manage is a business management application.  It is capable of managing customer databases (CRM) as well as projects, invoices, purchase orders, and inventory to name a few.  The e-manage client application runs on a users desktop and uses Microsoft .NET as foundation along with a Microsoft SQL Server as the back-end. Problem: Getting information [...]]]></description>
			<content:encoded><![CDATA[<h3>Background:</h3>
<p>E-manage is a business management application.  It is capable of managing customer databases (CRM) as well as projects, invoices, purchase orders, and inventory to name a few.  The e-manage client application runs on a users desktop and uses Microsoft .NET as foundation along with a Microsoft SQL Server as the back-end.</p>
<h3>Problem:</h3>
<p>Getting information was easy when you were in the office at a computer.  However, you were out of luck when you were out of the office.  Something was needed to allow users access to crucial business data while mobile.</p>
<h3>Solution:</h3>
<p>I was asked to created a mobile web portal that could be used with any smart phone that had a basic Internet connection.  This would allow users to access company data while out of the office.</p>
<h3>Result:</h3>
<table border="0">
<tbody>
<tr>
<td>
<p><div id="attachment_181" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/08/em_main.JPG"><img class="size-thumbnail wp-image-181" title="Mobile_Main_Screen" src="http://www.databatrix.com/wp-content/uploads/2009/08/em_main-150x150.jpg" alt="Mobile portal landing screen with alerts and recent items." width="150" height="150" /></a><p class="wp-caption-text">Mobile portal landing screen with alerts and recent items.</p></div></td>
<td>
<p><div id="attachment_180" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/08/em_company.JPG"><img class="size-thumbnail wp-image-180" title="Mobile_Company_View" src="http://www.databatrix.com/wp-content/uploads/2009/08/em_company-150x150.jpg" alt="Mobile portal company view" width="150" height="150" /></a><p class="wp-caption-text">Mobile portal company view</p></div></td>
</tr>
<tr>
<td>
<p><div id="attachment_183" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/08/em_ServiceTicket.JPG"><img class="size-thumbnail wp-image-183" title="Mobile Service Ticket" src="http://www.databatrix.com/wp-content/uploads/2009/08/em_ServiceTicket-150x150.jpg" alt="View/Edit/Create Service Tickets" width="150" height="150" /></a><p class="wp-caption-text">View/Edit/Create Service Tickets</p></div></td>
<td>
<p><div id="attachment_182" class="wp-caption alignnone" style="width: 160px"><a href="http://www.databatrix.com/wp-content/uploads/2009/08/em_projects.JPG"><img class="size-thumbnail wp-image-182" title="Mobile Projects View" src="http://www.databatrix.com/wp-content/uploads/2009/08/em_projects-150x150.jpg" alt="View/Edit Projects" width="150" height="150" /></a><p class="wp-caption-text">View/Edit Projects</p></div></td>
</tr>
</tbody>
</table>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/eManage_Mobile_Portal_Create_Service_Ticket.wmv">e-manage Mobile Portal &#8211; Create Service Ticket</a> (Video)</p>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/eManage_Mobile_Portal_Add_New_Company.wmv">e-manage Mobile Portal &#8211; Add New Company</a> (Video)</p>
<p>I created a web application written in VB.NET that would connect directly with the MS SQL Server to supply the user with the data they needed.  I created it to be light as possible without giving up functionality and usability.  I also integrated with Yahoo Business Search API to lookup business addresses automatically to increase accuracy.  From the mobile portal, you can:</p>
<ul>
<li>View/Edit/Create a Company or Location</li>
<li>Create a Company with the aid of a Yahoo search</li>
<li>View/Edit/Create a Contact</li>
<li>Assign existing Company Contacts to a Project</li>
<li>View/Edit/Create a Project</li>
<li>View/Edit/Create a Service Agreement</li>
<li>View Service Ticket part totals when viewing a Service Agreement</li>
<li>Easily see a service agreement&#8217;s validity based on the agreement&#8217;s start date and agreement contact length</li>
<li>View/Edit/Create a Service Ticket</li>
<li>Assign/Re-Assign Service Tickets to Service Agreements</li>
<li>Add Parts to a Service Ticket by Searching the e-manage part database</li>
<li>View Part totals for a Service Ticket</li>
<li>View/Download a document/attachment that belongs to a Company, Contact, Project, Service Agreement, or Service Ticket</li>
<li>View/Create a Note that belongs to a Company, Contact, Project, Service Agreement, or Service Ticket</li>
<li>View/Reply/Acknowledge a Note that belongs to any object</li>
<li>Submit Project Action Items</li>
<li>View your Actions To Perform</li>
<li>View your Open Action Items</li>
<li>View Recent Items (syncs with the Recent Items in e-manage and updates any items that you open via the mobile portal)</li>
<li>Open multiple items at the same time in a tabbed environment</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/08/e-manage-mobile-portal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.databatrix.com/wp-content/uploads/2009/08/eManage_Mobile_Portal_Create_Service_Ticket.wmv" length="3940379" type="video/x-ms-wmv" />
<enclosure url="http://www.databatrix.com/wp-content/uploads/2009/08/eManage_Mobile_Portal_Add_New_Company.wmv" length="2566817" type="video/x-ms-wmv" />
		</item>
		<item>
		<title>eManage Search for Blackberry</title>
		<link>http://www.databatrix.com/2009/08/emanage-search-for-blackberry/</link>
		<comments>http://www.databatrix.com/2009/08/emanage-search-for-blackberry/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 01:42:18 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Blackberry Enterprise Server]]></category>
		<category><![CDATA[Blackberry MDS Runtime]]></category>
		<category><![CDATA[MS SQL]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/2009/08/emanage-search-for-blackberry/</guid>
		<description><![CDATA[Background: Our CRM software contains a huge list of contacts that are only available from within the software application. Problem: It becomes a challenge when a sales team member is out of the office (on the road) and needs a customer&#8217;s phone number or email address.&#160; It is typically not feasible to boot up their [...]]]></description>
			<content:encoded><![CDATA[<h3>Background:</h3>
<p>Our CRM software contains a huge list of contacts that are only available from within the software application.</p>
<h3>Problem:</h3>
<p>It becomes a challenge when a sales team member is out of the office (on the road) and needs a customer&#8217;s phone number or email address.&#160; It is typically not feasible to boot up their laptop, connect to the Internet and lookup the contact.</p>
<h3>Solution:</h3>
<p>The solution was to create a simple Blackberry application that will allow the team member the ability to lookup a contact against our CRM software&#8217;s database.&#160; From their Blackberry, they would then be able to call any of the listed phone numbers for the contact or send them an email.</p>
<h3>Result:</h3>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen02.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HomeScreen-02" border="0" alt="HomeScreen-02" src="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen02_thumb.png" width="260" height="200" /></a> <a href="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen03.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HomeScreen-03" border="0" alt="HomeScreen-03" src="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen03_thumb.png" width="260" height="200" /></a> <a href="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen04_e.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HomeScreen-04_e" border="0" alt="HomeScreen-04_e" src="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen04_e_thumb.png" width="260" height="200" /></a> <a href="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen05.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HomeScreen-05" border="0" alt="HomeScreen-05" src="http://www.databatrix.com/wp-content/uploads/2009/08/HomeScreen05_thumb.png" width="260" height="200" /></a> </p>
<p>I created a small Blackberry application designed using the <a href="http://na.blackberry.com/eng/developers/rapidappdev/vsplugin.jsp">Blackberry Plug-in for Microsoft Visual Studio</a>.&#160; The applications allows the user to search by name or company (or both).&#160; The application then submits the search request to the Blackberry Enterprise Server, which then uses a web service that I created to search against our CRM database which is a SQL Server 2005 database.    <br />Once the results are returned, you then have the ability to call any of the listed numbers, email, or add them to your Blackberry address book (which will in turn add them to your Outlook address book).    <br />Overall basic program, but can be a lifesaver when out of the office.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/08/emanage-search-for-blackberry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desktop Loader</title>
		<link>http://www.databatrix.com/2009/08/desktop-loader/</link>
		<comments>http://www.databatrix.com/2009/08/desktop-loader/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 01:34:36 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/2009/08/desktop-loader/</guid>
		<description><![CDATA[Background: As new updates or new applications come to light, they need to be installed on everyone&#8217;s machine in the company. Problem: It becomes a challenge to automatically install applications on everyone&#8217;s machine.&#160; At the time this was typically done using &#34;Logon Scripts&#34; that fire off after you log in.&#160; However, this would only work [...]]]></description>
			<content:encoded><![CDATA[<h3>Background:</h3>
<p>As new updates or new applications come to light, they need to be installed on everyone&#8217;s machine in the company.</p>
<h3>Problem:</h3>
<p>It becomes a challenge to automatically install applications on everyone&#8217;s machine.&#160; At the time this was typically done using &quot;Logon Scripts&quot; that fire off after you log in.&#160; However, this would only work if the user was already on the network (not at home).</p>
<h3>Solution:</h3>
<p>The solution was to develop a small desktop application that would run at startup.&#160; The application would check to see if there was anything that needed to be installed, install them, and finally close.&#160; The application also needed to work in or out of the office.</p>
<h3>Result:</h3>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/ApplicationLoader1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ApplicationLoader1" border="0" alt="ApplicationLoader1" src="http://www.databatrix.com/wp-content/uploads/2009/08/ApplicationLoader1_thumb.png" width="260" height="177" /></a>Fig. 1</p>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/ApplicationLoader2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ApplicationLoader2" border="0" alt="ApplicationLoader2" src="http://www.databatrix.com/wp-content/uploads/2009/08/ApplicationLoader2_thumb.png" width="260" height="176" /></a>Fig. 2&#160; </p>
<p>I created a small VB.NET desktop application that would run at startup hidden, or you could run the GUI (viewable) version by launching the application from the Start&gt;Programs.&#160; Since it needed to run in and out of the office, it uses a web service to check to see what updates are needed.&#160; How does it know which ones are needed?&#160; After the program installs the application it uses the web service to update a log that notes the application, logged in user name, and machine name.&#160; This was a application can be installed per machine AND user instead of just one or the other.&#160; If an application is needed, the web service sends back the folder name on a secure FTP site that contains all of the files that need to be copied to the local machine.&#160; It also passes the executable file name to run once it has finished copying the files.&#160; Applications that need to be installed can be assigned to certain users, groups, machines, or everyone.&#160; Also they can be flagged as &quot;optional&quot;.&#160; Optional applications are not automatically installed via the hidden startup application and can only be install by manually kicking off the installation from the GUI version shown in Fig. 2.&#160; Another feature is the application has the ability to update itself.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/08/desktop-loader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inventory Application</title>
		<link>http://www.databatrix.com/2009/08/inventory-application/</link>
		<comments>http://www.databatrix.com/2009/08/inventory-application/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 00:50:05 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
				<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Desktop Applications]]></category>
		<category><![CDATA[MS SQL]]></category>
		<category><![CDATA[Web Applications]]></category>

		<guid isPermaLink="false">http://www.databatrix.com/2009/08/inventory-application/</guid>
		<description><![CDATA[Background: As for any company, physical inventory time is never fun.&#160; Our inventory software did not have a good interface for doing this. Problem: The process of taking physical inventory was long and tedious.&#160; The process typically involved printing our a huge list of parts, write in the quantity next to the part, then someone [...]]]></description>
			<content:encoded><![CDATA[<h3>Background:</h3>
<p>As for any company, physical inventory time is never fun.&#160; Our inventory software did not have a good interface for doing this.</p>
<h3>Problem:</h3>
<p>The process of taking physical inventory was long and tedious.&#160; The process typically involved printing our a huge list of parts, write in the quantity next to the part, then someone would enter that info in an Excel spreadsheet so that it could be imported back into our inventory software to reconcile.&#160; Another issue was finding the inventory items themselves, most items were organized well, but some could only be found by the &quot;one guy&quot; that knows where everything is located.&#160; Identification of parts and part numbers was needed.</p>
<h3>Solution:</h3>
<p>The solution was to create a desktop application that could be used to take physical inventory.&#160; The application would search against our existing parts database and store inventory quantities in a separate table that could later be reconciled.&#160; The application would also print out a part identification label on a thermal printer that was to be placed on the shelf of each item.&#160; This would make subsequent physical inventories much easier.</p>
<h3>Result:</h3>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Inventory1" border="0" alt="Inventory1" src="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory1_thumb.png" width="260" height="132" /></a>Fig. 1</p>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Inventory2" border="0" alt="Inventory2" src="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory2_thumb.png" width="260" height="153" /></a>Fig. 2</p>
<p><a href="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Inventory3" border="0" alt="Inventory3" src="http://www.databatrix.com/wp-content/uploads/2009/08/Inventory3_thumb.png" width="260" height="213" /></a>Fig. 3&#160;&#160; </p>
<p>I created a desktop application the keep track of inventory.&#160; The application also has the ability to print out part identification stickers on a thermal printer that included part information along with a barcode.&#160; Fig. 2 shows the part detail screen.&#160; You can find out various information from the Detail screen as well as adjust inventory levels.&#160; You can pull up a part by either searching by part number or scan the corresponding barcode the program had previously printed out.   <br />The application was such a success, I created a web interface to allow certain other employees access to inventory levels.&#160; Also various reports were created that were needed Accounting purposes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.databatrix.com/2009/08/inventory-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

