<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4681758802259224925</id><updated>2012-01-27T16:03:45.283-08:00</updated><category term='google docs'/><category term='calendar'/><category term='eStorefront'/><category term='CalendarExtender'/><category term='tigra'/><category term='office'/><category term='outside'/><category term='ControlToValidate'/><category term='subheader'/><category term='outdoors'/><category term='RequiredFieldValidator'/><category term='GridView'/><category term='Everest API'/><category term='subtotal'/><category term='CustomValidator'/><category term='Everest'/><category term='pdf viewer'/><category term='footer'/><category term='disable'/><category term='AjaxToolkit'/><category term='total'/><category term='Everest  application server'/><title type='text'>KC Web Programmers</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-2366859385384880502</id><published>2012-01-27T16:03:00.000-08:00</published><updated>2012-01-27T16:03:45.295-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subheader'/><category scheme='http://www.blogger.com/atom/ns#' term='total'/><category scheme='http://www.blogger.com/atom/ns#' term='subtotal'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>GridView: Grouping with Subtotals</title><content type='html'>The issue has come up a couple times on a site I work on that we would like to be able to have a GridView that provides subtotals based on grouping by a certain field. &amp;nbsp;So we wanted it to sort and group by one field -- Publisher, for example -- then for all publishers of the same value, provide a subtotal row under the last row for that publisher, then continue on with the next group of Publishers. &amp;nbsp;Basically, this is the same type of grouping that Microsoft Access provides in its reports automatically, but it is not provided as a standard feature of GridView.&lt;br /&gt;&lt;br /&gt;So I began looking for a solution. &amp;nbsp;I found one here that was pretty close to what I wanted. &amp;nbsp;It shows how to add a subheading after each group, but doesn't do any totalling of numeric fields:&lt;br /&gt;&lt;a href="http://www.4guysfromrolla.com/articles/072603-1.aspx"&gt;Including Subheadings in a Datagrid&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I modified that solution to also provide subtotals on the subheader line. &amp;nbsp;I use a hash table to store all the different totals. &amp;nbsp;(I have another post on &lt;a href="http://kcwebprogrammers.blogspot.com/2010/05/sum-total-line-in-footer-of-aspnet.html"&gt;creating a footer row with totals&lt;/a&gt; and this solution ties in pretty tightly with that.) &amp;nbsp;And the other modification I made is to make the grouping field dynamic so that it can easily be changed by sending in different parameters in the URL. &amp;nbsp;Here it is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected Hashtable total;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected string m_groupFieldName = "";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // get grouping type&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string groupType = Request.QueryString["group"];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (groupType == "A")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_groupFieldName = "A";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ReportTitle.InnerHtml = "Grouped by A";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (groupType == "B")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_groupFieldName = "B";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ReportTitle.InnerHtml = "Grouped by B";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;string sql = "YOUR SQL HERE";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["EMTConnectionString"].ConnectionString);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SqlDataAdapter myCommand = new SqlDataAdapter(sql, myConnection);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DataSet ds = new DataSet();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; myCommand.Fill(ds);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string curCat = "", prevCat = "";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int i = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DataRow subheaderRow = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Loop through the rows of the data adding placeholder rows into dataset&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (i &amp;lt;= ds.Tables[0].Rows.Count - 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; curCat = ds.Tables[0].Rows[i][m_groupFieldName].ToString();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (i == 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; prevCat = curCat;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (curCat != prevCat)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // categories changed, so make new row&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow = ds.Tables[0].NewRow();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // for the field on which we're grouping, display the grouped value and " TOTAL"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow[m_groupFieldName] = prevCat + " TOTAL";&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // set the value of each numeric field to the running subtotal calculated below&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // or to a calculation based on those subtotals&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["NumericFieldA"] = GetTotal("NumericFieldASubTotal");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["NumericFieldB"] = GetTotal("NumericFieldBSubTotal");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["APctOfB"] = (GetTotal("NumericFieldASubTotal") / GetTotal("NumericFieldASubTotal")).ToString();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ds.Tables[0].Rows.InsertAt(subheaderRow, i);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; prevCat = curCat;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i += 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total.Clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // keep running totals for numeric columns&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AddToTotal(ds.Tables[0].Rows[i]["NumericFieldA"].ToString(), "NumericFieldASubTotal");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AddToTotal(ds.Tables[0].Rows[i]["NumericFieldB"].ToString(), "NumericFieldBSubTotal");&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i += 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; // make the final subtotal row&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow = ds.Tables[0].NewRow();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow[m_groupFieldName] = prevCat + " TOTAL";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["NumericFieldA"] = GetTotal("NumericFieldASubTotal");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["NumericFieldB"] = GetTotal("NumericFieldBSubTotal");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subheaderRow["APctOfB"] = (GetTotal("NumericFieldASubTotal") / GetTotal("NumericFieldASubTotal")).ToString();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ds.Tables[0].Rows.InsertAt(subheaderRow, i);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reportGrid.DataSource = ds;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reportGrid.DataBind();&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected void ReportGrid_RowDataBound(Object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (e.Row.RowType == DataControlRowType.DataRow)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string subheadFlag = DataBinder.Eval(e.Row.DataItem, m_groupFieldName).ToString();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // See if we have a Subheader&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (subheadFlag.Contains(" TOTAL"))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Format the row&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.Row.Font.Bold = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.Row.BackColor = Color.LightSalmon;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected double GetTotal(string type)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;try&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double result = double.Parse(total[type].ToString());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; protected double AddToTotal(string itemStr, string type)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double item;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (itemStr == "True")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; item = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (!double.TryParse(itemStr, out item))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; item = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (total.ContainsKey(type))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total[type] = double.Parse(total[type].ToString()) + item;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total[type] = item;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return item;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-2366859385384880502?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/2366859385384880502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2012/01/gridview-grouping-with-subtotals.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2366859385384880502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2366859385384880502'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2012/01/gridview-grouping-with-subtotals.html' title='GridView: Grouping with Subtotals'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-99077098546144941</id><published>2011-10-12T10:22:00.000-07:00</published><updated>2011-10-12T10:23:09.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outdoors'/><category scheme='http://www.blogger.com/atom/ns#' term='outside'/><category scheme='http://www.blogger.com/atom/ns#' term='office'/><title type='text'>Outdoor office</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VNK4Je1IXx0/TpXJTWSkX6I/AAAAAAAAB94/F3eYez2W-1k/s1600/OutdoorOffice.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-VNK4Je1IXx0/TpXJTWSkX6I/AAAAAAAAB94/F3eYez2W-1k/s400/OutdoorOffice.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I tried a fun experiment last week: making an outdoor office and working outside. &amp;nbsp;I'm sure many others like me hate to be indoors all day when the weather is perfect outside. &amp;nbsp;I'd tried taking my laptop outside to work before, but ran into some issues. &amp;nbsp;With a little bit of effort though, I was able to make it work quite well and was able to spend most of my time out there for a week. &amp;nbsp;The advantages to working outside are pretty clear if you love the outdoors: fresh air, nice scenery, less stress, etc. &amp;nbsp;Here are some of the issues that I found needed some effort to make working outdoors work:&lt;br /&gt;&lt;br /&gt;1) Weather. &amp;nbsp;Again, this is great when the weather is perfect. &amp;nbsp;Even when it cooled down a bit, I was fine wearing some fleece. &amp;nbsp;But don't leave your computer out there if it looks like rain!&lt;br /&gt;&lt;br /&gt;2) Furniture. &amp;nbsp;When I tried this unsuccessfully in the past, I just took my laptop to our outdoor table and chairs. The ergonomics were bad, it was on a patio that was too hot... it just didn't work. &amp;nbsp;What did work is I had a spare simple rolling desk made of light weight metal and glass. &amp;nbsp;I rolled it out into the grass and the ergonomics were much better. &amp;nbsp;Sometimes I'd bring a keyboard and mouse to make it even better, sometimes I wouldn't. &amp;nbsp;Mine was light and small enough that I brought it in each night. &amp;nbsp;Since it was metal and glass, I think I could've kept it outside even.&lt;br /&gt;&lt;br /&gt;3) Power and Wireless. So if you take special furniture outside, you'll want to put it somewhere where you get a good wireless signal. &amp;nbsp;Hopefully your router isn't too far from your back yard. &amp;nbsp;You may also want to be close to a power outlet if you want to stay out longer periods of time. &amp;nbsp;I just brought my laptop inside at lunch time to recharge.&lt;br /&gt;&lt;br /&gt;4) Glare. &amp;nbsp;This is another factor in picking your location. &amp;nbsp;You'll probably want to be in the shade, if possible. &amp;nbsp;Since shade moves, I had to adjust my position a bit later in the day.&lt;br /&gt;&lt;br /&gt;5) Bugs. &amp;nbsp;In Kansas City, summer is often too hot to be outside for a long time with no A/C, and conveniently that's when the mosquitoes are out anyway. &amp;nbsp;When the weather is nicer in spring and fall, there are far less mosquitoes, but still a few. &amp;nbsp;I used a bit of bug spray on my hands.&lt;br /&gt;&lt;br /&gt;6) Wind. If you're totally paperless, then wind isn't a big issue, other than the occasional leaf particle falling in your keyboard. &amp;nbsp;If you need to use some papers, then you may need a paperweight some days.&lt;br /&gt;&lt;br /&gt;That's really about it. &amp;nbsp;The only other issue is that if you enjoy it too much, then you may be a bit distracted and not get as much work done. But there are plenty of distractions inside as well, so I didn't find that to be too much of an issue.&lt;br /&gt;&lt;br /&gt;If you try it, let me know how it went!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-99077098546144941?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/99077098546144941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/10/outdoor-office.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/99077098546144941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/99077098546144941'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/10/outdoor-office.html' title='Outdoor office'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-VNK4Je1IXx0/TpXJTWSkX6I/AAAAAAAAB94/F3eYez2W-1k/s72-c/OutdoorOffice.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-1095773834700546844</id><published>2011-09-14T15:55:00.000-07:00</published><updated>2011-09-14T15:55:19.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CalendarExtender'/><category scheme='http://www.blogger.com/atom/ns#' term='tigra'/><category scheme='http://www.blogger.com/atom/ns#' term='calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='AjaxToolkit'/><title type='text'>AjaxToolkit:CalendarExtender display problem</title><content type='html'>I've been using the AjaxToolkit:CalendarExtender for quite a while. Its always worked really well for me... until today. &amp;nbsp;I added it to a site and the header was not displaying properly. &amp;nbsp;The month name and the next arrow in the header were not there, only the previous arrow displayed in the calendar header.&lt;br /&gt;&lt;br /&gt;As I saw in many posts, the cause is a CSS conflict. &amp;nbsp;Sure enough, in the designer's CSS, he had a style defined for all div tags that was messing up the calendar header. &amp;nbsp;I think it was a combination of a position:relative and a display:block that caused the problem. &amp;nbsp;I tried everything I could think of to fix it without having to modify the designer's CSS file. &amp;nbsp;I gave the calendar its own class and tried to override the div settings. &amp;nbsp;I tried defining styles for&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: #efefef; color: #666666; font-family: Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;strong style="font-weight: bold;"&gt;.ajax__calendar_header.&amp;nbsp;&lt;/strong&gt;&lt;/span&gt; Couldn't get anything to work for two hours. &amp;nbsp;I never found a solution for the CalendarExtender, but I did find an alternative.&lt;br /&gt;&lt;br /&gt;After doing a search for "javascript calendar date picker", I found the &lt;a href="http://www.softcomplex.com/products/tigra_calendar/"&gt;Tigra Calendar&lt;/a&gt;. &amp;nbsp;There is a live demo on the page linked to there. &amp;nbsp;It looks better than the CalendarExtender and it was even easier to implement. &amp;nbsp;No AjaxControlToolkit.dll is needed, just a .js file and a .css file. &amp;nbsp;Their&amp;nbsp;examples use an HTML input control as the target for the calendar, but I found that it worked just as well with an asp:TextBox control. &amp;nbsp;And its free! &amp;nbsp;They do have some nice features in the paid version, and that's only $29, so I could definitely see using the paid version on some project in the future. &amp;nbsp;Particularly for the ability to restrict to certain dates. &amp;nbsp;Very glad to have found this calendar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-1095773834700546844?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/1095773834700546844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/09/ajaxtoolkitcalendarextender-display.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1095773834700546844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1095773834700546844'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/09/ajaxtoolkitcalendarextender-display.html' title='AjaxToolkit:CalendarExtender display problem'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8658559764464042496</id><published>2011-09-05T11:07:00.000-07:00</published><updated>2011-09-05T11:08:41.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RequiredFieldValidator'/><category scheme='http://www.blogger.com/atom/ns#' term='CustomValidator'/><category scheme='http://www.blogger.com/atom/ns#' term='ControlToValidate'/><title type='text'>CustomValidator doesn't run / execute / fire</title><content type='html'>This problem drove me nuts for a while the other day. &amp;nbsp;I had a CustomValidator on my page that had some client validation code and it was not running. &amp;nbsp;the page just kept validating successfully even though the validation should have failed. &amp;nbsp;The issue was that I had set the ControlToValidate attribute of the validator to one of the form fields on my page, and that field was blank, so the validator thought that it didn't need to run since no value was provided. &amp;nbsp;The field was only required if another field had a certain value, that was the point of the validator. &amp;nbsp;So I couldn't add a RequiredFieldValidator to the control too.&lt;br /&gt;&lt;br /&gt;The solution turned out to be just removing the ControlToValidate attribute. &amp;nbsp;That attribute is not required for the CustomValidator. &amp;nbsp;Without that attribute set, the validator runs any time the form is submitted. &amp;nbsp;And you can still display a potential error message next to whichever control you like just by placing the CustomValidator next to that control on the page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8658559764464042496?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8658559764464042496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/09/customvalidator-doesnt-run-execute-fire.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8658559764464042496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8658559764464042496'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/09/customvalidator-doesnt-run-execute-fire.html' title='CustomValidator doesn&apos;t run / execute / fire'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-1252230614197261577</id><published>2011-08-01T08:00:00.000-07:00</published><updated>2011-09-05T11:09:07.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf viewer'/><category scheme='http://www.blogger.com/atom/ns#' term='disable'/><category scheme='http://www.blogger.com/atom/ns#' term='google docs'/><title type='text'>Disable Google Docs PDF viewer</title><content type='html'>This has been driving me crazy for many months. &amp;nbsp;Somehow both my main browsers, Chrome and IE, got configured to open all PDF files in the Google Docs PDF Viewer. &amp;nbsp;That would be fine if it worked all the time, but often it would give an error saying "Sorry, we are unable to generate a view of the document at this time.". &amp;nbsp;Always I would see this when trying to open my Groupons from Groupon.com, which are stored as PDFs. &amp;nbsp;I looked at all my plug-ins and couldn't find anything about Google Docs. &amp;nbsp;I tried turning off and on different PDF Viewer plug-ins.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CHROME:&lt;/b&gt; Finally, I found &lt;a href="http://www.google.com/support/forum/p/Google%20Docs/thread?tid=5b956a785493cded&amp;amp;hl=en"&gt;this solution in the Google Forums&lt;/a&gt;. &amp;nbsp;Essentially, the Google Doc PDF viewer is *not* a plug-in, but an "extension". &amp;nbsp;So if you browse to&amp;nbsp;&lt;a href="chrome://extensions/"&gt;chrome://extensions/&lt;/a&gt;&amp;nbsp;in Chrome, then you will see it there and you can disable it. &amp;nbsp;Probably need to refresh the page you're on to update the links too, or close browser and re-open&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IE&lt;/b&gt;: Thankfully, Internet Explorer 9 just groups plug-ins and extensions as "add-ons". &amp;nbsp;So to disable the viewer in IE, go to the Settings Gear &amp;gt; Manage Add-ons. &amp;nbsp;Still I had a difficult time from there just because I was expecting that the Add-On to be made by Google. &amp;nbsp;But when I disabled the "Adobe PDF Link Helper", that seemed to do the trick after I refreshed the page.&lt;br /&gt;&lt;br /&gt;Screen shot of Internet Explorer 9 Add-On Manager:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DHi7S8EJFiE/Tja_XHbHtMI/AAAAAAAAB9E/c3EH7YSKTIc/s1600/GrouponPDF.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-DHi7S8EJFiE/Tja_XHbHtMI/AAAAAAAAB9E/c3EH7YSKTIc/s640/GrouponPDF.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-1252230614197261577?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/1252230614197261577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/08/disable-google-docs-pdf-viewer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1252230614197261577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1252230614197261577'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/08/disable-google-docs-pdf-viewer.html' title='Disable Google Docs PDF viewer'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-DHi7S8EJFiE/Tja_XHbHtMI/AAAAAAAAB9E/c3EH7YSKTIc/s72-c/GrouponPDF.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-4739308849173246583</id><published>2011-07-15T07:36:00.000-07:00</published><updated>2011-10-11T15:51:14.869-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Everest API'/><category scheme='http://www.blogger.com/atom/ns#' term='eStorefront'/><category scheme='http://www.blogger.com/atom/ns#' term='Everest'/><title type='text'>Everest Advanced Edition 5.0 API versus eStorefront</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;My client that uses &lt;a href="http://www.everestsoftwareinc.com/"&gt;Everest Advanced Edition business software&lt;/a&gt; built a web front end for online orders using the eStorefront provided by Everest. &amp;nbsp;I wasn't involved in that part, but as I understand it, Everest generates all the pages in the eStorefront for you based on some parameters you can set within Everest. &amp;nbsp;There is some possibility of customization after the eStorefront pages are generated, but there are a couple problems with that:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;A) If you upgrade Everest, then apparently the existing eStorefront ends up not working. &amp;nbsp;That means you have to regenerate all the eStorefront pages, so all your customizations get wiped out&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;B) The code generated for the eStorefront is really quite ugly and is in classic ASP. &amp;nbsp;There is no separation of the interface from the logic so with all that ugly code mixed in there, customization is not easy&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;So the client asked me to build a new store front using the Everest 5.0 API and ASP.Net. &amp;nbsp;I've built a project with the Everest API already, so I know most of its abilities. &amp;nbsp;I noticed pretty quickly that the eStorefront pages could do some things that didn't seem possible with the API. &amp;nbsp;So I looked a little more closely at the code in the eStorefront pages.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;As it turns out, the&amp;nbsp;auto-generated&amp;nbsp;eStorefront uses a completely different set of objects and calls than the 5.0 API. &amp;nbsp;I don't know if the eStorefront is using an old version of the API or if its an undocumented API reserved just for their eStorefront. &amp;nbsp;There is plenty of documentation about the new 5.0 API, but I could find nothing about these eStorefront objects. &amp;nbsp;It doesn't help that on the Everest support site, neither their Customer Forums or the Knowledge Base are functional, both produce errors (at least for our support account). &amp;nbsp;I saw one reference to the "shopping cart" objects in the list of COM objects installed with Everest, so I think that's what they might be called. &amp;nbsp;I considered trying to re-use some of that code to get some of those more powerful features. &amp;nbsp;But even if I could find documentation on those other objects and decided to use them,&amp;nbsp;I'm not sure it would be a good idea to use them anyway since they seem to have problems when Everest is upgraded.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;So far I already know of a couple small consequences of using the new API instead of the eStorefront objects:&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;1) In the API, you can not update a customer's billing address once they have been invoiced. Once a customer is invoiced for anything, then you can only update some things in their profile, like phone number and credit cards, but some things like billing address become locked. &amp;nbsp;This is consistent with the interface of the Everest desktop application. &amp;nbsp;But there is a way around it in Everest, and there seems to be a way around it with the eStorefront objects too.&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;2) &amp;nbsp;The eStorefront claims that it can email you your password if you forget it. &amp;nbsp;I say "claims" because this feature wasn't working in our eStorefront. &amp;nbsp;Regardless, the API does not allow this because there is no way to retrieve a person's password for the sake of emailing it to them. &amp;nbsp;Again, this is consistent with using the Everest application, as you can't see a person's password in their profile. &amp;nbsp;The API allows a check to see if a provided password is valid, so that's how a login can be checked. &amp;nbsp;If users forget their password, they can answer their secret question correctly so that they can reset their password to something else. &amp;nbsp;The secret question and secret answer are retrievable from the customer profile using the API.&lt;/div&gt;&lt;div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Overall, it seems like the API can handle all the important features provided to a normal user in the application for setting up a new customer and handling orders. &amp;nbsp;So it should have everything we need for the new web interface. &amp;nbsp;It will be very nice having a custom built web interface that we can customize how we want and not have to worry about it breaking when Everest is upgraded.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-4739308849173246583?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/4739308849173246583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/07/everest-advanced-edition-50-api-versus.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/4739308849173246583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/4739308849173246583'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/07/everest-advanced-edition-50-api-versus.html' title='Everest Advanced Edition 5.0 API versus eStorefront'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8284398763802977888</id><published>2011-05-23T08:52:00.000-07:00</published><updated>2011-05-23T08:52:23.900-07:00</updated><title type='text'>Business Insurance</title><content type='html'>On a non-technical note, one of the things I had to do recently was to get business insurance for my company. &amp;nbsp;That turned out to be a much bigger pain than I thought it would be.&lt;br /&gt;&lt;br /&gt;What happened is that one of my clients decided that they were going to pay all of their contractors through a third party billing agency called MBO Partners. &amp;nbsp;But MBO Partners had a requirement that in order to be paid through them as a contractor I had to have $1,000,000 of General Liability insurance and workers' compensation insurance.&lt;br /&gt;&lt;br /&gt;I got one referral to a business insurance agent from a friend. &amp;nbsp;He had to collect a whole bunch of information from me over the phone in order to get a quote. &amp;nbsp;He had to call back to get more information he forgot. &amp;nbsp;After a couple weeks, he got me a quote from American Family that was about $1060/year. &amp;nbsp;But that wasn't even official, so I waited longer for him to send an official quote. &amp;nbsp;This was taking so long that I contacted another agent I just found using Google. &amp;nbsp;He quoted me a much lower number, but the application process was just as slow and he was slow to return my calls when I wondered what was taking so long. &amp;nbsp;I contacted yet another agency and they never even called back. &amp;nbsp;This all dragged on for over one month.&lt;br /&gt;&lt;br /&gt;Finally, on my 4th try, I found the site I needed. &amp;nbsp;It's called &lt;a href="http://www.netquote.com/"&gt;NetQuote&lt;/a&gt;. &amp;nbsp;Similar to car insurance sites (and NetQuote also does car insurance quotes), you just fill out one form on their site and they send it to 5-10 business insurance agencies. &amp;nbsp;I got 3 or more return calls within minutes! &amp;nbsp;One sent me a great email with comparisons of two plans. &amp;nbsp;But I ended up going with the first agency that called me because they were able to get me an official quote within an hour, rather than the weeks it took for the first agents I contacted! &amp;nbsp;And their price for the GL and Workers Comp combined was $715/year.&lt;br /&gt;&lt;br /&gt;By the way, I also looked into Professional Insurance, i.e. "Errors and Ommisions", which gives you coverage int he case that a software mistake costs your client money. &amp;nbsp;The application is *way* longer for that and the only quote I got so far for that was about $1000/year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8284398763802977888?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8284398763802977888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/05/business-insurance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8284398763802977888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8284398763802977888'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/05/business-insurance.html' title='Business Insurance'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-6741921171367783270</id><published>2011-05-11T17:36:00.000-07:00</published><updated>2011-05-13T13:37:55.943-07:00</updated><title type='text'>Amazon Cloud Player</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.swaggrabber.com/wp-content/uploads/2011/03/amazon-cloud-player.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="88" src="http://www.swaggrabber.com/wp-content/uploads/2011/03/amazon-cloud-player.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There's been a lot of expectation that Apple's iTunes will eventually run "in the cloud", meaning that you would stream songs that you purchase from an iTunes web site rather than download them to your computer and iPod. Google is also supposed to be working on something similar. &amp;nbsp;But Amazon beat them both to it and has recently released their &lt;a href="https://www.amazon.com/clouddrive/learnmore"&gt;Cloud Drive&lt;/a&gt; and &lt;a href="http://www.amazon.com/b/?ie=UTF8&amp;amp;node=2658409011"&gt;Cloud Player&lt;/a&gt;. &amp;nbsp;I've been trying it out quite a bit over the last couple weeks and its great.&lt;br /&gt;&lt;br /&gt;Any MP3 song or album that you purchase from Amazon can now be stored on their server, the Cloud Drive, so that you can stream it to any device that has a Cloud Player. &amp;nbsp;Mainly, this would be your computer or your phone. &amp;nbsp;All music you purchase from them can be stored on the Cloud Drive indefinitely for free. &amp;nbsp;Also, up to 5GB of other music that you did not purchase from them can be uploaded and stored for free. &amp;nbsp;If you purchase even one album from them, they will upgrade you to 20 GB of free storage. &amp;nbsp;It isn't clear to me whether the free 20GB upgrade is for just one year or indefinitely, but I think its just one year. &amp;nbsp;Otherwise, the 20GB storage plan is $20/year (not per month).&lt;br /&gt;&lt;br /&gt;The Cloud Player still lacks some nice features that iTunes has. &amp;nbsp;You can't edit song&amp;nbsp;information&amp;nbsp;once you've upload a song. &amp;nbsp;And you can't rate songs, which I found to be a nice feature in iTunes to quickly highlight the best stuff in a big collection. &amp;nbsp;But the fact that I could immediately listen on my phone to the music that I uploaded via my computer was a big enough plus that I can live without those things.&lt;br /&gt;&lt;br /&gt;I imagine that if you're a heavy Apple user, then you'll probably want to wait for the cloud version of iTunes. &amp;nbsp;But if you use your Amazon account as much as you iTunes account and/or if you have an Android phone rather than an iPhone, then you'll probably want to check out the Cloud Drive and Cloud Player.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-6741921171367783270?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/6741921171367783270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/05/amazon-cloud-player.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6741921171367783270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6741921171367783270'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/05/amazon-cloud-player.html' title='Amazon Cloud Player'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-9197054952646911847</id><published>2011-03-24T14:35:00.000-07:00</published><updated>2011-03-24T14:35:30.056-07:00</updated><title type='text'>Corning concept video</title><content type='html'>Friends of mine sent me links to some technology concept videos today. &amp;nbsp;I liked this one from Corning:&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/9qmwdbhsbVs" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;I also watched &lt;a href="http://www.youtube.com/watch?v=3KnIJoHibiQ"&gt;one from Microsoft&lt;/a&gt;. &amp;nbsp;They're fairly similar.&lt;br /&gt;&lt;br /&gt;I like the idea that your phone becomes your main computer and everything else is just an input/output device that gives you more space to work instead of interacting with the phone itself. &amp;nbsp;Of course, the more we rely on our phones as our main computer, the worse it is when you lose your phone or spill water on it.  But then again, if Internet enabled phones become&amp;nbsp;sufficiently&amp;nbsp;cheap and all of your data is stored in "the cloud", then maybe losing your phone isn't even a real big deal.&lt;br /&gt;&lt;br /&gt;The other bad thing it reminds me of though is how we're adding electricity dependency to every single device that we use. &amp;nbsp;For one thing, that will dramatically increase our energy consumption at a time in the world when we should be working to decrease energy usage. &amp;nbsp;And second, it increases our reliance on electricity to even use simple devices that shouldn't necessarily need power. &amp;nbsp;For example, a normal toilet flushes without electricity, but some modern business toilets don't flush if they lose power. &amp;nbsp;Old phones worked without electricity, but its hard to find one these days that will.  If my house has&amp;nbsp;photo-voltaic windows and the house&amp;nbsp;loses power when they are in dark mode, is my house forced into darkness even in the day??  Losing power isn't all that common, I know, but it certainly happens in the winter in places that get big snow and ice storms, and in cases of large disasters, like earthquakes.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall though, it will be exciting to see if even a few of these devices in these videos become reality.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-9197054952646911847?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/9197054952646911847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/corning-concept-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/9197054952646911847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/9197054952646911847'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/corning-concept-video.html' title='Corning concept video'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/9qmwdbhsbVs/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-3252829573611818401</id><published>2011-03-23T08:43:00.000-07:00</published><updated>2011-03-23T08:43:47.973-07:00</updated><title type='text'>Screen sharing / web conferencing software</title><content type='html'>I've been looking into different options for screen sharing lately. &amp;nbsp;Basically, when I have a phone meeting with one or more people, I would like to be able to share my desktop so that they can see what I'm doing. &amp;nbsp;There are lots of tools out there to do this. &amp;nbsp;Many are geared towards allowing remote control of a computer. &amp;nbsp;I wasn't looking for that, just displaying my screen to others. &amp;nbsp;And I was hoping for minimal software install required by the clients.&lt;br /&gt;&lt;br /&gt;The two free tools that I looked at were &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; and &lt;a href="http://www.crossloop.com/"&gt;CrossLoop&lt;/a&gt;. &amp;nbsp;I tried the screen sharing on Skype with a friend and it worked on and off. &amp;nbsp;That may have been an Internet connection issue, but another friend mentioned that he had problems with it before too. &amp;nbsp;Regardless, the free version of Skype only allows sharing to one person. &amp;nbsp;When we got a third person on the call, the screen sharing turned off. &amp;nbsp;And I'm pretty sure CrossLoop is only a one-to-one sharing solution too. &amp;nbsp;So neither of these solutions is what I wanted.&lt;br /&gt;&lt;br /&gt;The two most well-known solutions for screen sharing to multiple participants are &lt;a href="http://www.webex.com/"&gt;WebEx&lt;/a&gt; and &lt;a href="http://www.gotomeeting.com/"&gt;GoToMeeting&lt;/a&gt;. &amp;nbsp;I've been in several WebEx conferences that worked well. &amp;nbsp;Each of these solutions costs about $50/month though, which is more than I was hoping to spend.&lt;br /&gt;&lt;br /&gt;The in-between solutions I found were &lt;a href="http://www.zoho.com/"&gt;Zoho &lt;/a&gt;and &lt;a href="http://www.yuuguu.com/"&gt;Yuuguu&lt;/a&gt;. &amp;nbsp;Zoho is only $12/month (or $115 for a year), Yuuguu is $19/month (or $79 for a year - HUGE discount). &amp;nbsp;The big difference that I found between them &amp;nbsp;is that Zoho has built in audio conferencing support too. &amp;nbsp;So they provide a number that your participants can call into for audio, and a URL that they can use to view the presentation. &amp;nbsp;Yuuguu did not provide a conference call number. &amp;nbsp;So I went with Zoho. &amp;nbsp;Clients are given the option to view the presentation with Flash, ActiveX control, or a Java plug-in. &amp;nbsp;It's nice for them to have the options. &amp;nbsp;For me, the presenter, the control installation could be better. &amp;nbsp;When I try to start a meeting through the browser, the plug-in installation always fails. &amp;nbsp;But they have an alternate link to download an executable that installs on your desktop. &amp;nbsp;When I start a meeting using the desktop app, instead of through the browser, then it works fine. &amp;nbsp;I've used it a couple times now and didn't hear any complaints from the viewers. &amp;nbsp;So even though the process to start a meeting is not optimal from my end, as long as my participating clients are happy, I'm happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-3252829573611818401?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/3252829573611818401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/screen-sharing-web-conferencing.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3252829573611818401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3252829573611818401'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/screen-sharing-web-conferencing.html' title='Screen sharing / web conferencing software'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-7965388839459714254</id><published>2011-03-04T16:13:00.000-08:00</published><updated>2011-03-04T16:13:49.926-08:00</updated><title type='text'>Microsoft Access Combo Boxes</title><content type='html'>This week I was working on a project in Microsoft Access where I have one combo box whose values are dependent on the choice in the other combo box. &amp;nbsp;Microsoft calls this synchronizing the combo boxes in their article "&lt;a href="http://support.microsoft.com/kb/289670"&gt;How to synchronize two combo boxes on a form&lt;/a&gt;". &amp;nbsp;Their article is good, but even so I had some problems with it so I thought I'd mention them here.&lt;br /&gt;&lt;br /&gt;Even though I thought I'd followed their instructions, the first thing that happened is that I would select a value in the parent combo box but the new values would not appear in the child/dependent combo box. &amp;nbsp;I could see in the debugger that AfterUpdate was getting called and the RowSource of the child combo box was getting set to the right query, but still the combo box ended up empty. &amp;nbsp;The issue was that I hadn't set the RowSourceType property of the child combo box. &amp;nbsp;The RowSourceType property of the child combo box must be set to Table/Query for this to work. &amp;nbsp;I think its easy to miss that. &amp;nbsp;Since the RowSource is being set dynamically, I wasn't paying as much attention to the Properties window and missed setting the RowSourceType to Table/Query.&lt;br /&gt;&lt;br /&gt;The other issue that I had was not really related to the synchronization, but just to combo boxes in general. &amp;nbsp;I learned that its very important to set the following properties correctly based on the query that you're using for your RowSource:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ColumnCount -&amp;nbsp;needs to match the number of fields that you are SELECTing in your RowSource query&lt;/li&gt;&lt;li&gt;BoundColumn - whichever of these columns that you want to be the actual value of the combo box that will be stored in a database field is the bound column. &amp;nbsp;Note that this is 1-based, not 0-based&lt;/li&gt;&lt;li&gt;ColumnWidths - this controls the display of the columns in the combo box. &amp;nbsp;You list the width you want for each column in inches, separated by semi-colons. &amp;nbsp;If your bound column is an AutoNumber key and you don't want it displayed, then list it as 0"&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Microsoft set all these for the parent combo box in their example, but for some reason didn't mention them for the child combo box. &amp;nbsp;You'll probably have two columns in your query, with the first one being the numeric key, and so BoundColumn is 1 and ColumnWidths is 0";1". &amp;nbsp;Or you may just be storing strings, in which case you may just select the string as the only column, also make it the bound column, and just make the ColumnWidth as 1" (or whatever size).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-7965388839459714254?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/7965388839459714254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/microsoft-access-combo-boxes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/7965388839459714254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/7965388839459714254'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/03/microsoft-access-combo-boxes.html' title='Microsoft Access Combo Boxes'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-3204689415657608573</id><published>2011-02-07T18:14:00.000-08:00</published><updated>2011-02-07T18:14:57.395-08:00</updated><title type='text'>CustomValidator - returns false but form submits anyway</title><content type='html'>I think this has bitten me a couple of times now. &amp;nbsp;If you implement a CustomValidator with server side validation in ASP.Net, then you set args.IsValid to true if the validation passes or to false if the validation fails. &amp;nbsp;But even if you return false, the form continues the submit process anyway!&lt;br /&gt;&lt;br /&gt;The trick is that when you set args.IsValid, that sets a flag in the Page class called Page.IsValid, and you still need to check that Page.IsValid flag somewhere in your form processing. &amp;nbsp;For example, I check it in my button click handler and just return from the method if Page.IsValid is false. &amp;nbsp;The error message that you set for your CustomValidator will then be displayed.&lt;br /&gt;&lt;br /&gt;I should mention that the post that got me part of the way to figuring this out was on &lt;a href="http://www.eggheadcafe.com/community/aspnet/7/33770/submit-still-runs-even-when-validation-fails.aspx"&gt;Egghead Cafe&lt;/a&gt;, but it lacked example code and the actual property name. &amp;nbsp;Here is some example code of using this process to limit the file size on an asp:FileUpload control using a CustomValidator with server side validation.&lt;br /&gt;&lt;br /&gt;.aspx file&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:FileUpload runat="server" ID="uplResume" /&amp;gt;&lt;br /&gt;&amp;lt;asp:CustomValidator ID="FileSizeValidator" runat="server" ControlToValidate="uplResume"&lt;br /&gt;ErrorMessage="File size should not be greater than 2 MB." OnServerValidate="FileSizeValidator_ServerValidate"&amp;gt;&amp;lt;/asp:CustomValidator&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;.aspx.cs file&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void FileSizeValidator_ServerValidate(object source, ServerValidateEventArgs args)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int fileSize = uplResume.FileBytes.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (uplResume.FileBytes.Length &amp;gt; 2 * MEGABYTES)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;args.IsValid = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;args.IsValid = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void btnSubmit_Click(object sender, EventArgs e)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!Page.IsValid)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do processing for valid form here&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-3204689415657608573?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/3204689415657608573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/02/customvalidator-returns-false-but-form.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3204689415657608573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3204689415657608573'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/02/customvalidator-returns-false-but-form.html' title='CustomValidator - returns false but form submits anyway'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8642305560458682409</id><published>2011-01-27T10:56:00.000-08:00</published><updated>2011-06-10T11:16:05.658-07:00</updated><title type='text'>VB arrays vs. C# arrays in ASP.Net</title><content type='html'>As many long-time web developers may know, Visual Basic and VB Script used to have 1-based arrays for many years while just about every other language I used -- C, C++, JScript, JavaScript -- had 0-based arrays. &amp;nbsp;I didn't particularly have any strong preference for one over the other, but it was tricky to adjust your mind when switching from one to the other.&lt;br /&gt;&lt;br /&gt;Then when .Net was released, Visual Basic changed to using 0-based arrays. &amp;nbsp;And with ASP.Net, Microsoft switched from using VBScript to using Visual Basic. &amp;nbsp;So now the two main languages used by ASP.Net, C# and Visual Basic, both use 0-based arrays. &amp;nbsp;That's good news in the long run, but I'm sure it caused a lot of developers some big migration headaches.&amp;nbsp;&amp;nbsp;But there is still one annoying difference in the arrays of these languages that caused me some problems in a current ASP.Net application that is using VB.&lt;br /&gt;&lt;br /&gt;The meaning of the boundary specified when you declare a fixed size array in C# versus VB is different. &amp;nbsp;When you declare a fixed size C# array with a boundary of 10, such as:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: Consolas, Courier, monospace; font-style: normal; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; word-break: break-all; word-wrap: break-word;"&gt;int[] myArray= new int[10];&lt;/pre&gt;&lt;br /&gt;then the array has 10 elements, which is what I would expect. &amp;nbsp;Since the array is 0-based, the elements are indexed as myArray[0] through myArray[9]&lt;br /&gt;&lt;br /&gt;When you declare a fixed size VB array with a boundary of 10, such as&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: Consolas, Courier, monospace; font-style: normal; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; word-break: break-all; word-wrap: break-word;"&gt;Dim myArray(10) as Integer&lt;/pre&gt;&lt;br /&gt;then 10 is the index of the last element. &amp;nbsp;So the array actually has 11 elements in it, indexed as myArray(0) through myArray(10)! &amp;nbsp;To me, this is very misleading. &amp;nbsp;So I thought I was filling my array up, but really I had a blank element at the 10th index that was causing problems.&lt;br /&gt;&lt;br /&gt;For a more extensive comparison of VB and C# arrays using code examples, see the&lt;a href="http://www.harding.edu/fmccown/vbnet_csharp_comparison.html#arrays"&gt; array section of this VB.NET and C# comparison&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8642305560458682409?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8642305560458682409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/01/vb-arrays-vs-c-arrays-in-aspnet.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8642305560458682409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8642305560458682409'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2011/01/vb-arrays-vs-c-arrays-in-aspnet.html' title='VB arrays vs. C# arrays in ASP.Net'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8361037497289826209</id><published>2010-10-17T06:13:00.000-07:00</published><updated>2011-08-14T17:31:14.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Everest  application server'/><title type='text'>Everest "Application server does not exist" error</title><content type='html'>This post may only end up being of interest to about 10 people in the world, but hopefully those people find it and it saves them some of the hair-pulling time that I wasted. &amp;nbsp;I've been working on installing Everest's business software, Everest Advanced Application Server, for a client. &amp;nbsp;We were installing both server and client modules on Windows Server 2003. &amp;nbsp;The server module also&amp;nbsp;automatically&amp;nbsp;installs&amp;nbsp;Microsoft&amp;nbsp;SQL Server 2005 Express. &amp;nbsp;After installation, we would open the client and try to log in but would get the "Application server does not exist" error.&lt;br /&gt;&lt;br /&gt;The first thing we were advised by support was to make sure to type in the whole machine name and SQL Server name instead of just trying to use a . dot like they say you can. &amp;nbsp;So for example, server name is "ourserver" and database instance is "ourserver\SQL2005". &amp;nbsp;That didn't fix it, so not sure if that was necessary or not.&lt;br /&gt;&lt;br /&gt;The real fix had to do with the fact that we had set it up to run as an interactive user, meaning the user who is logged on to the machine. &amp;nbsp;This wasn't their recommendation, but this was just a development server, so we didn't think that part mattered much. &amp;nbsp;Turns out it did. &amp;nbsp;Maybe it had to do with the fact that we were only logging in using Remote Desktop and that wasn't recognized as an actual login??? &amp;nbsp;But anyway, the document that finally gave me the right info about how to change that was only available after logging into their knowledge base, so I've pasted the contents below.&lt;br /&gt;&lt;br /&gt;And we were also installing the Everest SDK aka the Everest API and it was giving connection errors. &amp;nbsp;That ended up being the same problem with the same solution. &amp;nbsp;You can't run as interactive user. &amp;nbsp;That is set up in a COM package as described in their API Guide, but the fix is the same procedure as the server one described below, just for the API COM package instead of the main Everest COM package.&lt;br /&gt;&lt;br /&gt;Here is the document from Everest:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Helvetica; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2 style="margin-bottom: 6pt; margin-left: 0in; margin-right: 0in; margin-top: 6pt;"&gt;&lt;span style="color: navy;"&gt;PROBLEM&lt;/span&gt;&lt;/h2&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;While logging into Everest, I receive an error message "Application Server does not exist."&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin-bottom: 13pt; margin-left: 0in; margin-right: 0in; margin-top: 26pt;"&gt;&lt;span style="color: navy;"&gt;Possible Causes&lt;/span&gt;&lt;/h2&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;This error message can occur for the follow known reasons:&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;Application server name is misspelled.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;Application server is not installed in the given application server.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The “Enabled Distributed COM on this computer” property (path: Component Services &amp;gt; My Computer &amp;gt; Properties &amp;gt; Default Properties tab) may not have been selected in either the client, server, or both.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The Client and the Server are on different versions of MDAC. If you do not know how to check this, contact Everest Software Support for assistance.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;If the&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;application server (COM+ components) is configured to use "Interactive User",&amp;nbsp;&lt;/span&gt;&lt;span class="grame"&gt;&lt;span style="font-family: Verdana; font-size: 10pt;"&gt;a windows users&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;must be logged in to the Everest application server.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;If the&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;application server (COM+ components) is configured to use "This User", the user ID or password details are incorrect for the specified windows user in your COM settings.&lt;/span&gt;&lt;/div&gt;&lt;div class="BulletList1" style="margin-bottom: 3.25pt; margin-left: 0.25in; margin-right: 0in; margin-top: 3.25pt; text-indent: -0.25in;"&gt;&lt;span style="color: #333333; font-family: Wingdings; font-size: 6pt; position: relative; top: -1pt;"&gt;n&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;The presence of a virus can also cause COM applications to not automatically start after a system reboot.&lt;/span&gt;&lt;/div&gt;&lt;h2 style="margin-bottom: 13pt; margin-left: 0in; margin-right: 0in; margin-top: 26pt;"&gt;&lt;span style="color: navy;"&gt;Solution 1&lt;/span&gt;&lt;/h2&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;In order to overcome the problem with the last three possible causes listed above, do the following:&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;1&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Go to the server that that has the&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;Application server installed.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;2&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Go to&amp;nbsp;&lt;b&gt;Start &amp;gt; Settings &amp;gt; Control Panel &amp;gt; Administrative Tools&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;3&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Double-click&amp;nbsp;&lt;b&gt;Component Services&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;4&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Expand&amp;nbsp;&lt;b&gt;Component Services &amp;gt; Computers &amp;gt; My Computer &amp;gt; Com+ Applications&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;5&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Right-click&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;and select Shut Down.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;6&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Right-click&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;and select&amp;nbsp;&lt;b&gt;Properties.&lt;/b&gt;&amp;nbsp;Select the&lt;b&gt;Identity&lt;/b&gt;&amp;nbsp;tab. Check if the option is set to&amp;nbsp;&lt;b&gt;Interactive&lt;/b&gt;. If it is, we recommend you select&amp;nbsp;&lt;b&gt;This User&lt;/b&gt;&amp;nbsp;option and specify a valid Windows Account that has Local Administrative rights. This will ensure that the&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;COM+ components start using this account and there is no need to log in to the server after reboot of the server.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;7&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;Click&amp;nbsp;&lt;b&gt;OK&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="NumberedList" style="margin-bottom: 6.5pt; margin-left: 0.25in; margin-right: 0in; margin-top: 6.5pt; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt;"&gt;8&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;(Optional step) To test if the Everest Application Server is working correctly, right-click&amp;nbsp;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;and select&amp;nbsp;&lt;b&gt;Start&lt;/b&gt;. If it does not work correctly, you will receive an error message explaining why it cannot start. If it works correctly, there will be no messages.&lt;/span&gt;&lt;/div&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;If the application service is functioning properly, you should be able to log in to the company.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;Be sure to scan the system for the presence of any Viruses. The presence of a Virus may prevent the DCOMCNFG services from starting automatically each time the system is restarted.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style="margin-bottom: 13pt; margin-left: 0in; margin-right: 0in; margin-top: 26pt;"&gt;&lt;span style="color: navy;"&gt;Solution 2&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-size: small;"&gt;If your server operating system is Windows 2003, refer to knowledge base article 87580 – Installing Everest Advanced Edition on Windows Server 2003 for more information. See the “Common Technical Issues Windows 2003 Server SPI and R2” section, Issue #1 – Application server does not exist.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Everest&lt;/b&gt;&amp;nbsp;is a registered trademark of Everest Software, Inc. All other product names and services referenced herein are trademarks of their respective companies.&lt;/span&gt;&lt;/div&gt;&lt;div class="Paragraph" style="margin-bottom: 0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in;"&gt;&lt;span style="font-size: small;"&gt;Disclaimer:&lt;/span&gt;&lt;/div&gt;&lt;div class="Paragraph" style="margin-bottom: 6.5pt; margin-left: 0in; margin-right: 0in; margin-top: 6.5pt;"&gt;&lt;span style="font-size: small;"&gt;The third-party product that this document confers is created by companies that are independent of Everest software. Everest Software makes no warranty, implied or otherwise, regarding the performance or consistency of this product.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8361037497289826209?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8361037497289826209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/10/everest-application-server-does-not.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8361037497289826209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8361037497289826209'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/10/everest-application-server-does-not.html' title='Everest &quot;Application server does not exist&quot; error'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-445292746666480102</id><published>2010-07-15T19:38:00.000-07:00</published><updated>2010-07-15T19:38:36.899-07:00</updated><title type='text'>Javascript to get parameter from URL query string</title><content type='html'>I needed a Javascript function to get a parameter value form the URL today. &amp;nbsp;I found a couple posts about it but had a hard time getting them to work. &amp;nbsp;First I found &lt;a href="http://www.netlobo.com/url_query_string_javascript.html"&gt;this one using regular expressions.&lt;/a&gt;&amp;nbsp;&amp;nbsp;It didn't work at all for me, no idea why. &amp;nbsp;So then I found &lt;a href="http://java-programming.suite101.com/article.cfm/javascript_query_string_url_parameters_tutorial"&gt;this one that uses the split function several times&lt;/a&gt;. &amp;nbsp;It wasn't quite complete and had a bug (his query_string.split line left out the [1]). &amp;nbsp;But my solution is heavily based on that one.&lt;br /&gt;&lt;br /&gt;So after a lot of trial and error this is the final solution I came up with. &amp;nbsp;I hope its useful to someone. &amp;nbsp;Note that it doesn't unescape special characters.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function getURLParam( name )&lt;br /&gt;        {&lt;br /&gt;            // get query string part of url into its own variable&lt;br /&gt;            var url = window.location.href;&lt;br /&gt;            var query_string = url.split("?");&lt;br /&gt;            &lt;br /&gt;            // make array of all name/value pairs in query string&lt;br /&gt;            var params = query_string[1].split("&amp;amp;");&lt;br /&gt;            &lt;br /&gt;            // loop through the parameters&lt;br /&gt;            var i = 0;&lt;br /&gt;            while (i &amp;lt; params.length) {&lt;br /&gt;                // compare param name against arg passed in&lt;br /&gt;                var param_item = params[i].split("=");&lt;br /&gt;                if (param_item[0] == name) {&lt;br /&gt;                    // if they match, return the value&lt;br /&gt;                    return param_item[1];&lt;br /&gt;                }&lt;br /&gt;                i++;&lt;br /&gt;            }&lt;br /&gt;            return "";&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-445292746666480102?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/445292746666480102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/07/javascript-to-get-parameter-from-url.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/445292746666480102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/445292746666480102'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/07/javascript-to-get-parameter-from-url.html' title='Javascript to get parameter from URL query string'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-5981984269910598891</id><published>2010-06-08T18:29:00.000-07:00</published><updated>2010-06-08T18:29:43.347-07:00</updated><title type='text'>Digitizing old media</title><content type='html'>I was very interested to see &lt;a href="http://lifehacker.com/5557695/the-step+by+step-guide-to-digitizing-your-life"&gt;LifeHacker's post on Digitizing Your Life&lt;/a&gt; today because I've been working on this, to varying degrees, for many years. &amp;nbsp;I think this is a long multi-year project for anyone who was not born in the digital age. &amp;nbsp;If, like me, you were born anytime before 1980 or so, you probably have accumulated lots of letters, cassette tapes, and non-digital photos over your lifetime. &amp;nbsp;Digitizing these things allows you to:&lt;br /&gt;1) have a digital version that can be backed up in multiple locations&lt;br /&gt;2) have less physical material to store in your home, or to move next time you move to a new home&lt;br /&gt;3) in the case of tapes, use your media on new devices as old tape players become obsolete&lt;br /&gt;&lt;br /&gt;Digitizing can take a lot of work. &amp;nbsp;Of course, how much work it takes depends a lot on which media you have the most of and are least willing to throw out. &amp;nbsp;But here are my experiences with digitizing different media.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Audio Cassette Tapes and Vinyl LP's&lt;/span&gt;&lt;br /&gt;I love music, so the thought of losing music that I had on old cassette tapes and records was really hard for me. &amp;nbsp;If I didn't want to just throw them out and lose the music, then the options are basically to buy a replacement on CD or MP3, or record the music to my computer myself using the&lt;a href="http://audacity.sourceforge.net/"&gt; free audio program Audacity&lt;/a&gt;. &amp;nbsp;If it is a common enough album, then you can find it used online for a few dollars, so that's often the best option. &amp;nbsp;But otherwise, you can get a 1/8" mini jack to 1/8" mini jack cable and run it from the headphone jack on a tape or record player or stereo console to the line in jack on your computer, start recording in Audacity, and start playing the album. &amp;nbsp;You'll lose some audio quality, so that is something to consider. &amp;nbsp;And you'll still probably want to split the recording into tracks, which takes some time. &amp;nbsp;So I recommend purchasing a true digital replacement whenever it's affordable.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Video Cassette Tapes&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I'm not as much of a movie lover as a music lover, so this one wasn't as hard for me as the music. &amp;nbsp;Basically the options are the same: see if you can purchase a DVD replacement, digitize it yourself , or just throw it out. &amp;nbsp;Home movies are the hard part because you can't buy them and you probably don't want to throw them out. &amp;nbsp;Computers don't generally have video inputs, so digitizing with your computer will require special hardware and software, like &lt;a href="http://www.amazon.com/gp/product/B001LQO4P4?ie=UTF8&amp;amp;tag=kansascitybac-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001LQO4P4"&gt;Roxio Easy VHS to DVD&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kansascitybac-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001LQO4P4" style="border: none !important; margin: 0px !important;" width="1" /&gt;. &amp;nbsp;I paid a local service to have my home movies converted to DVD.&amp;nbsp;&amp;nbsp;You can probably find one of these services near you for less than $20 per VHS tape.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Letters and Cards&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I've saved a lot of paper letters and cards from family and friends over the pre-email years. &amp;nbsp;I've been carrying them around in a big box from home to home, along with old college papers typed on a typewriter or very old word processor. &amp;nbsp;Letters or papers that are on 8 1/2" by 11" paper that isn't too folded or crumpled can be fed through a scanner with a multi-page document feeder fairly easily. &amp;nbsp;And you can find that kind of scanner in an all-in-one printer for under $100. &amp;nbsp;But the odd-sized letters and cards and other odd-shaped souvenirs will have to be done on the flatbed part of the scanner. &amp;nbsp;Some of them I've just taken a digital picture of, depending on what it is. &amp;nbsp;I'm still working on this project. &amp;nbsp;I just take a stack every couple weeks or so, decide what I can just throw out, and I scan the rest.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Photos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I had a complete under-bed storage box of old photos from the non-digital photo era. &amp;nbsp;And as I mentioned above, 3" by 5" photos probably won't go through a standard scanner's document feeder. &amp;nbsp;So I would place 3 or 4 related photos (slightly overlapped) on the glass of the flatbed scanner at a time. &amp;nbsp;As I mentioned above, I did this over many weeks/months. &amp;nbsp;If you have some free time, you just grab a stack of photos and scan them in, and someday you make it through all of them!&lt;br /&gt;&lt;br /&gt;Of course all of this begs the question, do we really need to keep all these things? &amp;nbsp;I think most people would have a hard time throwing out old photos or home movies. &amp;nbsp;And like I said, music was hard for me to just throw out too. &amp;nbsp;But letters and cards are I think where I could throw out more without scanning them. &amp;nbsp;Oh well, at least I'm happier being a digital pack rat than a paper one :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-5981984269910598891?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/5981984269910598891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/06/digitizing-old-media.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5981984269910598891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5981984269910598891'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/06/digitizing-old-media.html' title='Digitizing old media'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-328104936092183549</id><published>2010-05-10T15:21:00.000-07:00</published><updated>2011-09-05T11:10:31.374-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='footer'/><category scheme='http://www.blogger.com/atom/ns#' term='total'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>Sum total line in footer of ASP.Net gridview</title><content type='html'>A few years ago, I was looking for a solution to sum up a column of numbers in a gridview in ASP.Net and display the total in the footer of the gridview. &amp;nbsp;I found a &lt;a href="http://aspalliance.com/782_CodeSnip_How_to_Display_Sum_Total_in_the_Footer_of_the_GridView_Control"&gt;solution on aspalliance&lt;/a&gt;&amp;nbsp;that worked well for me for these few years. &amp;nbsp;It uses TemplateFields to call one function in the ItemTemplate that adds the values and another function in the FooterTemplate that displays the total. &amp;nbsp;I enhanced it to use a Hashtable so that when I had lots of fields I wanted to total, I didn't have to make a separate variable for each one. &amp;nbsp;I just added a new key to the Hashtable.&lt;br /&gt;&lt;br /&gt;But today I wanted to try to find a solution that was less work, where I could still use BoundFields. &amp;nbsp;I found a &lt;a href="http://msdn.microsoft.com/en-us/library/ms972833.aspx"&gt;good solution on Microsoft.com&lt;/a&gt; using the RowDataBound event. &amp;nbsp;With this solution, you can still use BoundFields, but you have to add code to the function for each column that you want to sum up. &amp;nbsp;I have a grid with over 60 columns (because we hide and show different ones for different scenarios) so I was really hoping to &amp;nbsp;find some way where I didn't have to write code for each field.&lt;br /&gt;&lt;br /&gt;So the solution I came up with is below, in C#. &amp;nbsp;It's very similar to the Microsoft.com solution, but with a couple modifications. &amp;nbsp;First, I'm using Hashtables again, two this time: one for the totals and one for the type of the field -- integer or currency. &amp;nbsp;Second is the automatic check for whether a field is numeric or not, and if its is, what kind of number -- integer or currency. &amp;nbsp;I check this simply by looking for the dollar sign in the text of the cell. &amp;nbsp;Note that when parsing the text to number format, the&amp;nbsp;System.Globalization.NumberStyles.Any parameter is very important because it handles characters like the $ and parentheses for negative numbers in accounting format.&lt;br /&gt;&lt;br /&gt;One drawback of this method is that it will total every numeric field, including zip codes, for example. &amp;nbsp;But it could be easily modified to either list specific columns to total or specific columns to exclude. &amp;nbsp;One other drawback is that it doesn't work for percentage columns. &amp;nbsp;You can't total up different percentage values anyway to get a percentage that is accurate for the total line, but at least with a TemplateField solution, you can divide the appropriate totals to get the correct percentage in the FooterTemplate.&lt;br /&gt;&lt;br /&gt;Listing, in C#:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Hashtable total = new Hashtable();&lt;br /&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Hashtable fieldType = new Hashtable();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;protected void reportGrid_RowDataBound(object sender, GridViewRowEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double result;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string cellText;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e.Row.RowType == DataControlRowType.DataRow)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (i = 0; i &amp;lt; e.Row.Cells.Count; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cellText = e.Row.Cells[i].Text;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = Double.Parse(cellText, System.Globalization.NumberStyles.Any);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if this didn't go to the catch, then field was a number&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if it has a $ in it, save in Hashtable that it is currency field&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this code assumes that the field won't change type from row to row&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cellText.Contains("$"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fieldType[i] = "C";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fieldType[i] = "N0";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (total.ContainsKey(i))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;total[i] = double.Parse(total[i].ToString()) + result;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;total[i] = result;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;catch&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (e.Row.RowType == DataControlRowType.Footer)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (i = 0; i &amp;lt; e.Row.Cells.Count; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// display the value of any Hashtable total field that has a key&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (total.ContainsKey(i))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.Row.Cells[i].Text = String.Format("{0:" + fieldType[i].ToString() + "}", total[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-328104936092183549?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/328104936092183549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/05/sum-total-line-in-footer-of-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/328104936092183549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/328104936092183549'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/05/sum-total-line-in-footer-of-aspnet.html' title='Sum total line in footer of ASP.Net gridview'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-2226093640903570522</id><published>2010-05-04T19:24:00.000-07:00</published><updated>2010-05-04T19:24:40.853-07:00</updated><title type='text'>Microsoft Office Viewer applications</title><content type='html'>It's been a couple months now that I've been going without Microsoft Office or &lt;a href="http://www.openoffice.org/"&gt;Open Office&lt;/a&gt;. &amp;nbsp;I'm creating all my documents in Google Documents. &amp;nbsp;The biggest problem, at first, was viewing Microsoft Office documents that other people sent &amp;nbsp;to me. &amp;nbsp;I would have to upload them to Google Documents in order to view them.&lt;br /&gt;&lt;br /&gt;But then I learned about the free Viewer applications provided by Microsoft for Microsoft Office documents. &amp;nbsp;There is a free &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=048dc840-14e1-467d-8dca-19d2a8fd7485&amp;amp;displaylang=en"&gt;PowerPoint Viewer&lt;/a&gt;, free &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3657ce88-7cfa-457a-9aec-f4f827f20cac&amp;amp;displaylang=en"&gt;Word Viewer&lt;/a&gt;, and free &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1cd6acf9-ce06-4e1c-8dcf-f33f669dbc3a&amp;amp;displaylang=en"&gt;Excel Viewer&lt;/a&gt;. &amp;nbsp;These applications make it very easy to open an Office document that someone sends you without having to buy Office yourself. &amp;nbsp;The PowerPoint viewer and the Word Viewer especially are great, I've had no problems with them.&lt;br /&gt;&lt;br /&gt;I have had problems with the Excel Viewer. &amp;nbsp;First, it does not open comma separated value (CSV) files. &amp;nbsp;I do a lot of database work with exports of database tables to CSV. &amp;nbsp;So for CSV files, I still have to upload them to Google Docs to view them. &amp;nbsp;Also, Excel Viewer does not read HTML files that are saved as .xls files. &amp;nbsp;This probably isn't common for most people, but again, for my work we sometimes export a table to a text file as HTML text wrapped in the HTML &lt;br /&gt;tags. &amp;nbsp;When these files have a .xls extension, Excel opens them fine. &amp;nbsp;Excel Viewer does not. &amp;nbsp;And Google Docs doesn't like those files either. &amp;nbsp;So to get those in to a spreadsheet, I have to:&lt;br /&gt;1) Open the file in a browser&lt;br /&gt;2) Highlight and copy the HTML table&lt;br /&gt;3) Paste into a Google spreadsheet&lt;br /&gt;&lt;br /&gt;However, if the file is very large, Google will not let me paste it into the spreadsheet. &amp;nbsp;It gives me an error like, "You can not paste that much data from the clipboard" (and sometimes it just fails with no error). &amp;nbsp;So then I have to take these additional steps:&lt;br /&gt;&lt;br /&gt;3) (instead of 3 above) Paste the copied table into Notepad, which gives me a tab delimited data file&lt;br /&gt;4) Save that text file temporarily&lt;br /&gt;5) Import the tab delimited file into a Google spreadsheet using the spreadsheet's Import... menu item&lt;br /&gt;&lt;br /&gt;So those are some ways to work around Excel Viewer's limitations and survive without installing Microsoft Office or Open Office. &amp;nbsp;Unfortunately, Google spreadsheets also lack some key features, like Print Preview. &amp;nbsp;So because of the various spreadsheet issues, I still may break down and install Open Office, we'll see.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-2226093640903570522?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/2226093640903570522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/05/microsoft-office-viewer-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2226093640903570522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2226093640903570522'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/05/microsoft-office-viewer-applications.html' title='Microsoft Office Viewer applications'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-658573537987262027</id><published>2010-03-27T09:59:00.000-07:00</published><updated>2010-03-27T09:59:18.334-07:00</updated><title type='text'>Google Documents</title><content type='html'>I'm getting a new computer soon, so I'm using that as motivation to try to upload all of my documents to Google Documents and not purchase a new license of Microsoft Office. &amp;nbsp;Recently Google added the ability to upload any file type to Google Docs. &amp;nbsp;So in addition to all the Microsoft Word and Excel documents I have, I can also upload assorted image and sound files, and even zip files and executables.&lt;br /&gt;&lt;br /&gt;There are some big advantages to storing your documents "in the cloud" instead of on your computer.&lt;br /&gt;1. You can access them from any computer with an Internet connection, anywhere. &amp;nbsp;Not to mention any capable phone.&lt;br /&gt;2. You don't have to worry about losing documents if your computer crashes and you haven't made a recent backup&lt;br /&gt;3. Google Documents is free, so you can avoid buying a Microsoft Office license.&lt;br /&gt;&lt;br /&gt;Some people worry about being able to access your documents if Google goes down, but I consider that less likely than my own computer going down. &lt;br /&gt;&lt;br /&gt;Still, there are some definite disadvantages:&lt;br /&gt;1. You &lt;i&gt;need&lt;/i&gt; an Internet connection to view your documents. &amp;nbsp;This isn't usually a problem unless you're trying to work outside or in some restaurant without wireless.&lt;br /&gt;2. Privacy - Google technically does have access to the contents of your documents, if that bothers you&lt;br /&gt;3. Google Documents lacks many features of Microsoft Office&lt;br /&gt;&lt;br /&gt;So the first two disadvantages I listed aren't that big of a deal to me, but the more I've used Google Docs, the more I've missed a few key features found in Office.&lt;br /&gt;&lt;br /&gt;First off, although Google Documents has its own revision tracking for changes made withing Google Docs, it did not successfully import Microsoft Word's revision tracking last time I tried it. &amp;nbsp;This can be a real problem if you are sent a Word document with revision tracking as you'll have no way to view it. &amp;nbsp;I've read that &lt;a href="http://www.itbusinessnet.com/articles/viewarticle.jsp?id=42970"&gt;Open Office can interpret Word's revision tracking though&lt;/a&gt;. &amp;nbsp;So if that comes up again, I'll plan to install &lt;a href="http://www.openoffice.org/"&gt;Open Office&lt;/a&gt; just for the sake of reading the revisions.&lt;br /&gt;&lt;br /&gt;Second, when typing a regular document, Google Docs does not give you any indication of where the page breaks will be. &amp;nbsp;So let's say you're typing a letter and you want it to fit on one page, there's no way to tell when you've reached a full page while you're typing. &amp;nbsp;The only thing you can do is use Print Preview, which will convert your document to a PDF to show you how it will print. &amp;nbsp;This gets pretty annoying when you're trying to trim out words and lines to see if it gets down to one page and have to keep going to Print Preview over and over. &amp;nbsp;&lt;a href="http://www.google.com/support/forum/p/Google%20Docs/thread?tid=262da4c28c20aa84&amp;amp;hl=en"&gt;Apparently I'm not the only one bothered by this.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the third issue I've found is that the charts in Google spreadsheets are not as robust as the charts in Excel. &amp;nbsp; &amp;nbsp;I've always been pretty impressed with how easy it is to create an Excel chart, and customize it. &amp;nbsp;The first time I made a chart in Google Docs, it took me some time to figure out how to get both the data and labels on there. &amp;nbsp;It seems that the columns have to be adjacent, so I had to make a dummy column of labels. &amp;nbsp;And at least for the pie charts, there weren't as many options for how to label them. &amp;nbsp;But Google's do have a clickable "pop-out" functionality that's pretty nice.&lt;br /&gt;&lt;br /&gt;If you've already made the switch from Microsoft to Google for your documents, let me know how it went! &amp;nbsp;Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-658573537987262027?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/658573537987262027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/google-documents.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/658573537987262027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/658573537987262027'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/google-documents.html' title='Google Documents'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-324195344505043591</id><published>2010-03-12T11:36:00.000-08:00</published><updated>2010-03-12T11:36:22.463-08:00</updated><title type='text'>Meetings - Scheduling and Calendars</title><content type='html'>&lt;div class="MsoNormal"&gt;To many people’s frustration, meetings are an essential part of any office place.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;If your organization is very small, like two people, then meetings may always just be informal turn-your-chair-and-talk meetings.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;But once you need three or more people to be in a room and focused on one topic at the same time, then you’re probably going to have to schedule a meeting &lt;span style="font-family: Wingdings; mso-ascii-font-family: &amp;quot;Times New Roman&amp;quot;; mso-char-type: symbol; mso-hansi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-symbol-font-family: Wingdings;"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;There are a few different web-based tools to help you schedule your meeting around multiple people. &amp;nbsp;One of the best is called &lt;a href="http://www.meetingwizard.com/"&gt;Meeting Wizard&lt;/a&gt;. &amp;nbsp;Meeting Wizard lets the organizer specify multiple possible times for the desired meeting on the site. &amp;nbsp;Then the organizer sends an invitation to each participant asking each one to specify which suggested times they would be able to attend and which ones they wouldn't. &amp;nbsp;After all participants have replied, its easy to view the grid of participants vs. times to find the best time for the meeting. &amp;nbsp;Definitely beats a big long string of emails.&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Once you have scheduled your meeting, you’re going to want to put it on your calendar, which means you need a calendar program.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;Perhaps the most popular calendar product is the Microsoft Outlook calendar, but his the big disadvantage of only being on your desktop computer or work network (unless you synchronize with a handheld device). &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;Outlook also requires a license from Microsoft, which isn't great for small businesses or non-profits.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;Luckily, there &lt;/span&gt;an online option that not only works very well, but is also free!&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;a href="http://calendar.google.com/"&gt;Goggle Calendar&lt;/a&gt;&amp;nbsp;allows you to perform all the tasks vital to any personal calendar application.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;Beyond that, y&lt;/span&gt;ou can set up shared, and public calendars so that you can schedule your own time and share your schedule with whomever you choose.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;You can have it email you event reminders (or text them to your cell phone).&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;And you can even use it to schedule resources, like meeting rooms.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The first thing you’ll have to do is set up a Google calendar account at the link above (if you use GMail, then you already have a Google account, and you’ll find the Calendar link at the top of your Inbox page). &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Once you’ve logged in, you’ll be viewing your personal calendar.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Above the calendar on the right there are tabs to switch between Day, Week, Month, Next 4 Days, and Agenda view.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Let’s use month.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Now click on a day and you should get a bubble pop-up.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;J&lt;/span&gt;ust type something as a test, like “6pm dinner with Eric”.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;That’s it!&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;You can click on the event and then on "edit event details" to add more information if you want, including location and reminder details. &amp;nbsp;Note that this&amp;nbsp;is a &lt;i&gt;personal &lt;/i&gt;event, so nobody can see it but you.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Now let’s talk about shared calendars.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;On the left side, under the "My Calendars", you should see a "Create" link. &amp;nbsp;Click that to make a new calendar to combine with your personal calendar. &amp;nbsp;This will be your shared office calendar.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;So for the name, use “My organization”, whatever it is.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;The “Share with everyone” setting should be set to “Do not share with everyone”.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;In the “Share with specific people” section, enter the email addresses of the people with whom you would like to share the calendar.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Now click “Create Calendar”, and those people will receive invitations.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Now try adding another event.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;You should now have the option of adding the event to your personal calendar or to your organization’s calendar.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Enter your meetings as organization events, and then everyone will see it, and so theoretically nobody should forget to show up! &lt;span style="font-family: Wingdings; mso-ascii-font-family: &amp;quot;Times New Roman&amp;quot;; mso-char-type: symbol; mso-hansi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-symbol-font-family: Wingdings;"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;That’s really all you need, but you can also check out the different reminder settings and using invitations to invite people to events that don't have the flexibility in timing that requires a Meeting Wizard.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;/span&gt;Last, you might want to add some public calendars to your own calendar, like "U.S. Holidays" or the schedule of your favorite sports team.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-324195344505043591?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/324195344505043591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/meetings-scheduling-and-calendars.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/324195344505043591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/324195344505043591'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/meetings-scheduling-and-calendars.html' title='Meetings - Scheduling and Calendars'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-6297382065250357088</id><published>2010-03-01T07:10:00.000-08:00</published><updated>2010-03-01T07:10:18.910-08:00</updated><title type='text'>Hard Disk Drive Space Visualization Tools</title><content type='html'>For a long time I've been using this very old piece of software called &lt;a href="http://www.sixty-five.cc/sm/v1x.php"&gt;SpaceMonger&lt;/a&gt;.  Its a great tool.  It scans your whole hard drive and divides it into blocks to show you which folders are taking the most disk space.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NIUjN2ULz8g/S4vWtjoGaSI/AAAAAAAAA_E/7JNqEHjJxXA/s1600-h/spacemonger-small.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_NIUjN2ULz8g/S4vWtjoGaSI/AAAAAAAAA_E/7JNqEHjJxXA/s320/spacemonger-small.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Today, Lifehacker had a post about &lt;a href="http://lifehacker.com/5482269/disk-space-fan-analyzes-hard-drive-space-with-a-dash-of-eye-candy"&gt;Disk Space Fan&lt;/a&gt;, a tool that does essentially the same thing but instead of using a square grid of blocks, it uses a circular fan.  And its free.  So I was happy to see there was another free option that was more updated than my old SpaceMonger.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_NIUjN2ULz8g/S4vWyEzt8-I/AAAAAAAAA_M/35bv1IccYT8/s1600-h/disk_space_fan1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_NIUjN2ULz8g/S4vWyEzt8-I/AAAAAAAAA_M/35bv1IccYT8/s320/disk_space_fan1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I was about to try it, but in the Disk Space Fan article, they mentioned another free disk visualization tool: &lt;a href="http://sourceforge.net/projects/windirstat/"&gt;WinDirStat&lt;/a&gt;.  WinDirStat is like my old SpaceMonger in that it displays the disk space usage as a series of color coded blocks. So since I'm already comfortable with the block map, I decided to download and try that one.&lt;br /&gt;&lt;br /&gt;WinDirStat adds a couple neat features to my old SpaceMonger.  First it color codes by file extension instead of by folder.  This actually makes the graphic a little harder to interpret, in my opinion, but it does also provide additional interesting data.  And it makes it clear which file types use the most space, like .mp3's or .jpg's.  And the other neat thing is that it has a directory tree view pane, so if you click on a file or folder in the block map, then it scrolls to the file or folder in the tree view and you can see additional statistics there.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_NIUjN2ULz8g/S4vYIoovUCI/AAAAAAAAA_U/0x5s4UNiRRg/s1600-h/windirstat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_NIUjN2ULz8g/S4vYIoovUCI/AAAAAAAAA_U/0x5s4UNiRRg/s320/windirstat.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I was wondering if WinDirStat might have copied SpaceMonger's idea, so I did a Google search for&amp;nbsp;SpaceMonger and found their site. &amp;nbsp;The first interesting thing is that there is a much more modern version of SpaceMonger than I'd been using. &amp;nbsp;Their latest version is multi-tabbed and has some pie charts, so it may even be better than WinDirStat. &amp;nbsp;The catch is that it isn't free, but its only $24.95 and there is a 30-day trial. &amp;nbsp;In regards to whether the idea was copied, I &amp;nbsp;found this interesting passage on their site:&lt;br /&gt;&lt;blockquote&gt;In case you're curious, SpaceMonger's display-layout system is not unique; it uses a technique called &lt;i&gt;treemaps&lt;/i&gt; that were originally developed at the &lt;a href="http://www.umd.edu/"&gt;University of Maryland&lt;/a&gt;'s &lt;a href="http://www.cs.umd.edu/hcil"&gt;Human-Computer Interaction Laboratory&lt;/a&gt; by &lt;a href="http://www.cs.umd.edu/users/ben"&gt;Dr. Ben Schneiderman&lt;/a&gt;. You can learn more about them on his &lt;a href="http://www.cs.umd.edu/hcil/treemaps"&gt;Treemaps Page&lt;/a&gt;.  SpaceMonger doesn't use any of their code, but it uses a similar idea.&lt;/blockquote&gt;If you're using one of these disk space tools or some other one, let me know which one you like best!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-6297382065250357088?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/6297382065250357088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/hard-disk-drive-space-visualization.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6297382065250357088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6297382065250357088'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/03/hard-disk-drive-space-visualization.html' title='Hard Disk Drive Space Visualization Tools'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_NIUjN2ULz8g/S4vWtjoGaSI/AAAAAAAAA_E/7JNqEHjJxXA/s72-c/spacemonger-small.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-3695034944305908146</id><published>2010-02-08T15:37:00.000-08:00</published><updated>2010-02-08T15:37:24.470-08:00</updated><title type='text'>The Kindle</title><content type='html'>I've been learning a lot about the Kindle since my girlfriend got me one for Christmas.  &lt;br /&gt;&lt;br /&gt;At first I wasn't too excited about it.  I like regular books.  No big deal if they get lost, wet, or ruined.  When you're done with one, you can give it to someone else. And you can generally find used books pretty dang cheap, or check them out at the library.  On the other hand, it did appeal to the environmentalist in me -- no wasted paper.  And books can be heavy and bulky when you move.&lt;br /&gt;&lt;br /&gt;I started to get pretty excited about the Kindle though when I found out that it could browse the Web via the 3G network.  Not only that, but the browsing is actually free!  At least its free for now, I read rumors that Amazon may change that later.  They say that the simple browser is meant for sites that are mainly text, such as Wikipedia.  That's fine with me.  And I did get my GMail to open on it.&lt;br /&gt;&lt;br /&gt;Then I started to lose my enthusiasm for the Kindle when I learned that it doesn't support the EPUB format, which apparently is the prevailing standard for e-books.  That's what Sony uses for their reader and that's what Google is using in their massive &lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt; project.   So Sony and Google teamed up to offer an open-source approach to e-books, and Amazon represents the leading giant with the closed proprietary format.&lt;br /&gt;&lt;br /&gt;But my latest swing is back to enthusiastic for the Kindle because of the wonderful volunteers converting books from the EPUB format to the Kindle format(s).  That combined with the fact that book copyrights usually expire 70 years after the author's death means that there are LOTS of public domain books that were converted from EPUB format to a format for the Kindle and are available to download for free on the Kindle!  So I can have a library of classics all stored in my small Kindle at all times.  If you like classics, then that's exciting!  I downloaded seventeen free books yesterday, including a few from a couple of my favorite old authors, H.G. Wells and Jules Verne.&lt;br /&gt;&lt;br /&gt;Add in lots of little neat features like built-in dictionary, ability to search books, and being able to see all your bookmarks and highlights in one list, and it really is a fun new way to read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-3695034944305908146?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/3695034944305908146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/02/kindle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3695034944305908146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/3695034944305908146'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/02/kindle.html' title='The Kindle'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-1442324822808088999</id><published>2010-01-28T14:59:00.000-08:00</published><updated>2010-01-28T15:31:54.666-08:00</updated><title type='text'>Freelancing</title><content type='html'>&lt;a href="http://lifehacker.com/"&gt;Lifehacker&lt;/a&gt;, a tech (and some non-tech) blog about productivity, linked to a good article today on another blog I hadn't heard of, called Freelance Folder. The article was called &lt;a href="http://freelancefolder.com/12-reasons-you-shouldnt-freelance/"&gt;12 reasons you shouldn't freelance.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I agreed with a few of the points.  It's true that you still pretty much have to keep regular business hours if your clients work regular hours.  And if some of your clients have regular business hours and some don't, then you can end up working all hours!&lt;br /&gt;&lt;br /&gt;I also agree that it can be hard to stay motivated at times.  Especially when there are other chores to be done around the house and yard.  So you have to be a pretty disciplined and organized person to make it work.&lt;br /&gt;&lt;br /&gt;One of the things people often ask me as an independent contractor is where I find my contracts.  It's a good question.  I've hardly found any two clients the same way.  Here are all of the different ways I've found clients, roughly in chronological order since I started:&lt;br /&gt;&lt;br /&gt;-- referral from past co-worker&lt;br /&gt;-- searching for part-time jobs/gigs on craigslist &lt;br /&gt;-- referral from friend/family&lt;br /&gt;-- referral from a volunteer project that I worked on&lt;br /&gt;-- referral from an existing client to another organization&lt;br /&gt;-- people finding &lt;a href="http://www.kcwebprogrammers.com"&gt;my website&lt;/a&gt; by just searching on Google&lt;br /&gt;-- referral from an existing client within a large organization to another branch/department within the same organization&lt;br /&gt;&lt;br /&gt;So you can see that most of these are referrals.  What I did, and what I recommend to others, before the referrals started happening are:&lt;br /&gt;&lt;br /&gt;-- Develop your own website.  Link to any sites you've worked on.  Make it an online resume and portfolio.&lt;br /&gt;-- Do some volunteer projects to build your portfolio and make contacts.  If the project is a website, ask if you can put a small link to your own site in the footer of their site.  Most organizations I've worked with are open to that.&lt;br /&gt;-- Search craigslist for part-time gigs, or full-time short-term if you don't have anything going on at all.&lt;br /&gt;-- Get in contact with some recruiters.  I still haven't found any work from a recruiter because they are usually trying to fill full-time positions.  But they occasionally have part-time opportunities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-1442324822808088999?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/1442324822808088999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/01/freelancing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1442324822808088999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/1442324822808088999'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2010/01/freelancing.html' title='Freelancing'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-5566069725041051510</id><published>2009-11-16T12:28:00.001-08:00</published><updated>2009-11-16T12:38:06.230-08:00</updated><title type='text'>Google Voice</title><content type='html'>I've always been a fan of Google tools.  I use GMail, Google Apps (for KC Web Programmers), Calendar, Maps, Blogger (obviously), Groups, etc.  But my new favorite Google tool is.... &lt;a href="http://www.google.com/voice"&gt;Google Voice&lt;/a&gt;.  There are so many great features:&lt;br /&gt;&lt;br /&gt;1) When callers leave voice mail online, it is transcribed automatically (though far from perfectly) and sent to your email and as a text message to your cell phone&lt;br /&gt;&lt;br /&gt;2) Once you have your Google Voice phone number, it means you only have to tell people one phone number from then on because that number will ring any other number you tell it to.&lt;br /&gt;&lt;br /&gt;3) You can create rules based on different callers.  For example, for family ring all my phones and for unknown callers only ring your home phone.&lt;br /&gt;&lt;br /&gt;The only drawback to me is having to tell people that I have a new phone number since I've already switched numbers recently.  But again, this service means it *should* be the last time I'll need to switch.&lt;br /&gt;&lt;br /&gt;Right now the service is invitation only, but I have 1 extra invitation at this point.  Leave me a comment if you want it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-5566069725041051510?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/5566069725041051510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/11/google-voice.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5566069725041051510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5566069725041051510'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/11/google-voice.html' title='Google Voice'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8503864325518318351</id><published>2009-10-03T09:50:00.001-07:00</published><updated>2009-10-03T10:01:46.878-07:00</updated><title type='text'>PHP Hosting</title><content type='html'>For a long time, I've been using a PHP host called &lt;a href="http://www.ez-web-hosting.com/webhosting.htm"&gt;EZ-Web Hosting&lt;/a&gt;.  The price was good, only $6.45 / month if you buy a full year at a time.  And the control panel was standard.&lt;br /&gt;&lt;br /&gt;However, recently my hosted database became corrupted.  The site that uses that database is not one I check regularly, but still the data was very important.  So by the time I noticed the corruption, it had been corrupted for a few months.  I asked them to restore their last good backup and they said they only keep a couple months of backups, so all of their backups were corrupt too.  So the result was that the entire tables were lost.  I had to restore the last backup I made, which was over a year ago.&lt;br /&gt;&lt;br /&gt;So there are two lessons here.  First, make regular backups of your online data.  I think everyone knows they should regularly backup their own computer in case it crashes.  But I, for one, do not expect that the data I have online will be lost.  After all, those companies are supposed to specialize in reliable, redundant systems for hosting your data.  It seems they should have many safeguards against corruption and data loss.  Turns out, even hosting companies can screw up.  So go to your control panels regularly and make backups.&lt;br /&gt;&lt;br /&gt;Second lesson is that you should not use EZ-Web Hosting.  I still believe that no hosting company should lose your data for any reason other than you accidentally erasing it yourself.&lt;br /&gt;&lt;br /&gt;So do people have suggestions for good PHP hosts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8503864325518318351?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8503864325518318351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/10/php-hosting.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8503864325518318351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8503864325518318351'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/10/php-hosting.html' title='PHP Hosting'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-8314160575279948163</id><published>2009-10-03T09:37:00.000-07:00</published><updated>2009-10-03T09:49:40.772-07:00</updated><title type='text'>xtranormal</title><content type='html'>I just learned about this "text-to-movie" site called &lt;a href="http://www.xtranormal.com"&gt;xtranormal.com&lt;/a&gt;.  It's a very cool and easy way to make an animated custom movie.  They provide the animated backdrops and actors, and then you add the script and pick the camera angles.  You can make the actors do little animations and facial expressions too.&lt;br /&gt;&lt;br /&gt;It can all be done online for free.  Or you can pay $5/month for more backdrops and actors.  You can also download a desktop version called State.  State has even more features.  You can make the actors move around.  You can create your own custom camera angles.  And there are more animations, like dancing.  State ran very slow on my Pentium 4, 2.8 GHz laptop with 1.5 GB of RAM.  I don't have a great graphics card on the laptop though.&lt;br /&gt;&lt;br /&gt;Here is a video I made using the online free version.&lt;br /&gt;&lt;object width="445" height="364"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UW3nwhKTJqQ&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UW3nwhKTJqQ&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-8314160575279948163?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/8314160575279948163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/10/xtranormal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8314160575279948163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/8314160575279948163'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/10/xtranormal.html' title='xtranormal'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-6875691560409428472</id><published>2009-07-12T09:10:00.000-07:00</published><updated>2009-07-12T09:21:27.191-07:00</updated><title type='text'>cloud development tools?</title><content type='html'>I spent several hours this week trying to upgrade my MS SQL Server 2005 database on my laptop to MS SQL Server 2008.  First I tried to just install 2008 also, but I got a "versions are incompatible" message.  So I had to uninstall 2005 first, then when I tried to install 2008 from the main installation site, it gave me an error.  So I had to find an alternate installation file...again, many hours.&lt;br /&gt;&lt;br /&gt;The beauty of "cloud computing" is not having to install a bunch of software on the desktop and worry about these kinds of things.  Its now easy to check email, watch videos, and make word processing and spreadsheet documents all in the cloud through your browser.  But when it comes to software development, the tools are pretty specialized.  And for security reasons, you might not want to let Web files be editable in the actual folder they are viewed.  So it seems I'll always need to install my development tools on my machine, which means I can only develop form that machine too, rather than any computer with Internet access.&lt;br /&gt;&lt;br /&gt;*If* anyone reads this :-)  and is a developer, do you have any solutions for this?  I used to work at Devry and they had a system where you could connect to a server that had development tools on it to do labs.  That's not exactly what I'm imagining, but it could work.  But I don't see that available as a product for the public.  Thanks for your thoughts on it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-6875691560409428472?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/6875691560409428472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/07/cloud-development-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6875691560409428472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/6875691560409428472'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/07/cloud-development-tools.html' title='cloud development tools?'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-5830908232140710746</id><published>2009-03-31T12:08:00.000-07:00</published><updated>2009-04-01T07:24:43.755-07:00</updated><title type='text'>Current week in the month - PHP</title><content type='html'>I had this problem to figure out today.  I thought it was pretty tricky, it took me a few tries.  So I thought I'd post it.&lt;br /&gt;&lt;br /&gt;The problem was to figure out what week of the month on the calendar it is based on today's date and a calendar week that starts on Sunday.  So for example, if the 1st of the month is on Friday, the first two days of the month would be week 1, then the 3rd (a Sunday) would be week 2.&lt;br /&gt;&lt;br /&gt;So the final solution is:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ceiling (( todaysDate - dayOfTheWeekPastSunday - 1) / 7) + 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In PHP, todaysDate is obtained by date("d") and dayOfTheWeekPastSunday is date("w").  So in PHP we have:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$currentWeek = ceiling((date("d") - date("w") - 1) / 7) + 1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The reasoning, if you're interested: we know that the week number is going to be at least the integer value, rounded up, of the date divided by 7.  So on the 19th, for example, its always at least the 3rd week.  But it could be one more, the 4th week, depending on which day the month started.  So we're dividing by 7 and rounding up, but we need to adjust for the day of the week too.  If we subtract the number representing the day of the week (0 to 6) from the date, then we will get some result that is the same all week long, because as the date increases by one, the number we're subtracting is also increasing by one.  So the trick is to make that final division problem equal 1 on the first week, 2 in the second, etc..  We also need to subtract 1 from that numerator to make our dates zero-based.  In other words, we want the 7th to get the same division results as dates 1 through 6, so really we're going to treat those dates as the 0th through 6th.  &lt;br /&gt;&lt;br /&gt;So in the first week, when we subtract the day number from the date and subtract one more, we're always going to get a negative number unless the month starts on Sunday, in which case we'll get 0.  So if we round up, we'll always get 0.  When we roll over to the second week, our date goes up one but the number we subtract goes down 6, for a net increase of 7.  So now our division by 7 will give us a number one higher all week long.  Now all that's left to do is add 1 to those division results to get a 1-based week number.&lt;br /&gt;&lt;br /&gt;I hope that helped.  Please feel free to add comments if you like or don't like it or have an even better way.&lt;br /&gt;&lt;br /&gt;Eric&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-5830908232140710746?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/5830908232140710746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/03/current-week-in-month-php.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5830908232140710746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5830908232140710746'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/03/current-week-in-month-php.html' title='Current week in the month - PHP'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-604244999515763338</id><published>2009-02-09T12:05:00.000-08:00</published><updated>2009-02-09T12:06:27.898-08:00</updated><title type='text'>YouSendIt.com</title><content type='html'>I just thought I'd highlight another site that I've been using quite a bit lately.  It's called YouSendIt.com.  It gives you the ability to "email" very large files that wouldn't normally fit in an email.  Most people's email has a maximum attachment size of 20 MB or so.  If you need to send someone a file bigger than that, then YouSendIt will allow you to upload the file to their site and will send an email to the recipient with a link to download it.  &lt;br /&gt;&lt;a href="http://www.yousendit.com/"&gt;http://www.yousendit.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A basic account is free and lets you send files up to 100 MB in size.  The download link will be available to the recipient for one week.  Paid accounts let you send even bigger files and you can store them longer and there are some other added features.  But 100 MB is enough for pretty large audio and video files so the free account has worked well for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-604244999515763338?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/604244999515763338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/02/yousenditcom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/604244999515763338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/604244999515763338'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/02/yousenditcom.html' title='YouSendIt.com'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-2835129789607985942</id><published>2009-01-22T17:42:00.000-08:00</published><updated>2009-01-22T18:01:02.357-08:00</updated><title type='text'>wmiprvse.exe</title><content type='html'>This is probably very boring to most people, but hopefully someone might find it helpful if they have the same issue.  Today one of my client's had multiple (at least 3) computers on their Windows network running very slowly.  They thought it was the Intranet speed, but even non-network operations seemed to be going very slowly on all computers.  I pulled up the Task Manager on one, and a process called wmiprvse.exe was using over 60% of the CPU.  And sure enough, same service was hogging CPU on the other computers too.&lt;br /&gt;&lt;br /&gt;I was worried it was a virus, but after some Google searching, I found some references to failed print jobs.  I've seen similar issues before where failed print jobs cause chaos in Windows, so I thought that was a likely cause.  I checked the printers via Control Panel, and found one with 13 tasks cued up that were 2 days old.  So I deleted all of them, and then that wmiprvse.exe process went down to 0% CPU.  Woot!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-2835129789607985942?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/2835129789607985942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/wmiprvseexe.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2835129789607985942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2835129789607985942'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/wmiprvseexe.html' title='wmiprvse.exe'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-5014152079570275430</id><published>2009-01-15T13:47:00.000-08:00</published><updated>2009-01-15T13:50:32.348-08:00</updated><title type='text'>resizeimage.org</title><content type='html'>Often my clients have images or photos they want to post to their Web site.  But often the image or photo is enormous and needs to be shrunk and/or cropped.  Most ordinary users don't have Photoshop, so the easiest free desktop solution would be Microsoft Paint.  And that isn't a great solution.&lt;br /&gt;&lt;br /&gt;So here's my new favorite productivity site:&lt;br /&gt;&lt;a href="http://resizeimage.org/"&gt;http://resizeimage.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It allows you to upload a picture, crop and resize it online, then download the final result.  I even think its faster than opening Photoshop or Paint, and its way easier to use and show others how to use than Photoshop or Paint too.   Especialy since Crop and Resize is about all the image editing most of us ever need to do anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-5014152079570275430?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/5014152079570275430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/resizeimageorg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5014152079570275430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/5014152079570275430'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/resizeimageorg.html' title='resizeimage.org'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4681758802259224925.post-2716036435166139222</id><published>2009-01-15T13:39:00.000-08:00</published><updated>2009-01-15T13:47:14.238-08:00</updated><title type='text'>Purpose of blog</title><content type='html'>This is my first post of the KC Web Programmers tech blog.  The purpose of this blog is to give me (Eric Barr) a place to post technical links to technical solutions/tools/etc. that I think are very useful.  I learn about a lot of tech things from the &lt;a href="http://www.techcrunch.com"&gt;TechCrunch&lt;/a&gt; blog.  Hopefully this will be more than my highlights of the TechCrunch blog, but it might only be a little more than that :-)&lt;br /&gt;&lt;br /&gt;I may post a solution to something that took me a while to figure out and I'm hoping that by posting it, someone else may find the solution and it will save them some time.&lt;br /&gt;&lt;br /&gt;I hope you find something that is useful to you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4681758802259224925-2716036435166139222?l=kcwebprogrammers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcwebprogrammers.blogspot.com/feeds/2716036435166139222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/purpose-of-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2716036435166139222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4681758802259224925/posts/default/2716036435166139222'/><link rel='alternate' type='text/html' href='http://kcwebprogrammers.blogspot.com/2009/01/purpose-of-blog.html' title='Purpose of blog'/><author><name>Eric Barr</name><uri>https://profiles.google.com/107603693880402305978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-HN0Qgtg4cXs/AAAAAAAAAAI/AAAAAAAAAAA/SDQ7Cz5Ms2U/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
