Wednesday, June 30, 2010

Web designers, stop using splash ads!!!

Have you visited websites and got really annoyed by ads that span almost the whole page and flash suddenly out of nowhere, blocking you from doing anything meaningful on the page? If so, then welcome to the club – the club of disgruntled web users who get frustrated day in day out by such ads (sometimes called splash ads). But surprisingly, many web designers seem completely oblivious to their agony and keep using these ads on the home pages of their websites. Even hugely popular websites like Espnstar (see screenshot below), Cricinfo and Times of India, to name a few, are resorting to the use of these kind of ads.

Espnstar splash ad

I find ads in general to be obtrusive and irritating but as long as they are in the corner of the page and do not hinder your interactions with the “useful” elements on the page, they are bearable. But splash ads go a step further and make it impossible to use the site as long as they are in view. And as can be expected, the “close” button to get rid of this ad is so miniscule and well camouflaged that you will have to strain your eyes to spot it. I have been visiting Espnstar quite frequently these days thanks to the sports bonanza, what with Football world cup, Wimbledon, Natwest series and Formula 1 all happening simultaneously. But my experience on the site has been pretty frustrating thanks to these ads. I hope the web designers out there are listening to this feedback and stop using such ads soon.

Monday, June 7, 2010

Merging and Centering Excel cells from C# using Office Interop

Many a times, we need to generate Excel reports as output from Windows applications. There are now 2 ways to do this:

To be clear, Open XML is the recommended approach for working with Office applications using .Net. However, there are still many systems that rely heavily on Interop for this so in this post, I will be talking using the Interop approach to work with Excel. Specifically, let’s look at how we can merge a collection of cells and center them through .Net.

To accomplish this, we need to perform 3 steps, and they are as easy as they come – each step requires a single line of code in C#. So let’s take a look at the steps involved:

  • Get an Excel range – For folks familiar with Excel interop, they would be aware that for most operations we would need to get our hands on an Excel Range object and then perform the intended operation on the range. Here is how we can create a Range object

Microsoft.Office.Interop.Excel.Range range = excelApp.get_Range(sheet.Cells[startRowIndex, startColumnIndex], sheet.Cells[endRowIndex, endColumnIndex]);

Here, excelApp refers to an instance of Microsoft.Office.Interop.Excel.Application class. The parameters that we need to pass to the get_Range() specify where we want the range to start and where it should end.

  • Merge the cells – Once we have the handle to the range, we can call the Merge() on the range to do just that – merge the cells that form the range into a single cell

(Warning – there might be data loss if multiple cells within the range have different values)

range.Merge(Type.Missing);

  • Center the cells – Finally, we need to set the alignment of the data in the merged cells so that data appears centered horizontally. This can be done again with a single statement as shown below

range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

So there you have it, we can put these 3 steps into a method and use it whenever we want to merge and center cells. One more thing we need to do is add a reference to Microsoft.Office.Interop.Excel.dll and import the same DLL to be able to use the Excel Interop API.

Sunday, June 6, 2010

How to make your Windows form appear “Always on Top”

Most of us would have seen and used the Task Manager which is an integral part of Windows. One key behavior exhibited by the task manager is that if its “Always on top” option is turned on, the window will remain open even if focus is moved to another window. So suppose you have notepad and task manager open and the Always on top option is turned on. Now, even if you have set the focus inside notepad and are able to type in notepad, the foreground form will still appear to be Task manager. It makes sense to have this option in applications like Task manager. For example, suppose you want to see the spikes in memory usage or network bandwidth in real time as you use a particular application. It will be easy to have the application open and use it while Task manager is on top so that the changes are visible in real time. In general, this behavior would seem appropriate for many applications that provide system level information in real time.

Having said that, usage of this option can also make sense for user applications, especially for applications which provide some features that work across multiple other applications. For example, I was recently developing an application that provides a history feature in the Windows clipboard (by default Windows clipboard allows a single item to be maintained on the clipboard so this tool was designed to have multiple items on the clipboard and allow pasting of any item from within those) and works across all Windows applications. I felt it would be great to have the Always on top kind of functionality in the form for this application since it would let users always see what is there in the clipboard currently thereby letting him choose the right text/image to paste. As it turns out, enabling this behavior for your applications is really easy if you are using .Net. All you need to do is set the property named TopMost to True for the form that you want to always appear on top. Something like,

mainForm.TopMost = true;




.Net and hence, Windows will handle the rest of the stuff for you; you don’t need to do anything else. Isn’t that really easy? I guess that’s the power that frameworks make available to developers and help in improving their productivity.

Problem with SSL in SQL Reporting Services

When you do a fresh install of the SQL Server, you get an option to install and configure or only install Reporting Services along with the Database engine. If you choose the install and configure option, the Report Server and Report Manager websites will be created and configured for you by the wizard itself (along with a bunch of other stuff like the databases used by Reporting Services). However, it seems the wizard configures the websites to use SSL and when you try to browse the websites using the default URLs – http://localhost/reports and http://localhost/reportserver, you get this error:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel

Digging deeper, if we look at the RSReportServer.config file which we can find in <installation directory>:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer (this is the location for SQL 2008 R2, for SQL 2008 the folder name should be MSRS10.MSSQLSERVER) , we can find the configuration setting which causes this. Within the <configuration> node, there should be an element as below,

<Add Key="SecureConnectionLevel" Value="2"/>





The value of the SecureConnectionLevel setting can vary from 0-3, with a higher value indicating a greater level of security. In order to avoid using SSL, we need to change the value to 0. After changing this value and saving the config file, if we try hitting the Report manager or Report server site, it should start working. One surprising thing that I found was that there was no way (at least I couldn’t find one) to change this setting from the Reporting Services Configuration Manager. Even though we can add/remove the certificates which will be used by SSL, even if we delete all certificates from the configuration manager, it still doesn’t stop using SSL. But hopefully this post will help you to change it from the config file and get rid of the error.