Monday, 14 November 2011

Dimensions Of A Series Paper Sizes

 

There is a short table of the paper sizes of A series:

Size Height x Width (mm) Height x Width (in)
4A0 2378 x 1682 mm 93.6 x 66.2 in
2A0 1682 x 1189 mm 66.2 x 46.8 in
A0 1189 x 841 mm 46.8 x 33.1 in
A1 841 x 594 mm 33.1 x 23.4 in
A2 594 x 420 mm 23.4 x 16.5 in
A3 420 x 297 mm 16.5 x 11.7 in
A4 297 x 210 mm 11.7 x 8.3 in
A5 210 x 148 mm 8.3 x 5.8 in
A6 148 x 105 mm 5.8 x 4.1 in
A7 105 x 74 mm 4.1 x. 2.9 in
A8 74 x 52 mm 2.9 x 2.0 in
A9 52 x 37 mm 2.0 x 1.5 in
A10 37 x 26 mm 1.5 x 1.0 in

I found it there.

Tuesday, 27 September 2011

Where is the Ajax Control Toolkit Reference?

 

It is so easy to find.

Just go to the sample site (every google search points there), and:

Click on Getting Started tutorial.

Click on Tutorials.

 

And you will find the reference of each controls. And you will see the full reference on server and client side properties, events and methods.

It is easy to find, not?

Not every man should be a computer programmer

 

The question is only that: Why???

 

Code Snippet
  1. catch (Exception ex)
  2. {
  3.     if ((ex.GetType().ToString() == "System.Data.SqlClient.SqlException") && ex.Message.LastIndexOf("Timeout expired") >= 0)
  4.     {
  5.        /// Secret code
  6.     }
  7.     else
  8.         throw ex;
  9. }

Why the hell he doesn’t go and play football instead of programming?

Tuesday, 20 September 2011

Fed up with windows

 

The point is arrived. Enough. I am fed up with windows.

20110920197

But I hope, it will comes back.

Monday, 7 February 2011

Generate RDLC dynamically with unique column headers

I use the great example from Gotreportviewer since about six month that uses Microsoft Reportviewer and my biggest problem is giving columns titles that different to field names.

There is my solution that has an additional property: List<string> Headers that contains column titles with the following restriction:

Number of headers must be equal to number of columns or TableRdlGenerator throws the following exception:
Error creating report: header and field columns must be set and have to be the same count of elements both of them!

The entire solution can be downloaded from my public folder on skydrive.

Sunday, 6 February 2011

jQuery based collapse extender web user control for asp.net

After I have been started to learn jquery I decided to replace my Ajax Control Toolkit controls for a jQuery-based solution.

My control for replace in that week is the CollapsiblePanelExtender. I need a solution that works on partial page postbacks and full page postbacks too and stores collapsed state during postbacks, and, of course I have to be able to change the collapse state on server side so I had to mix server and client side code for the solution.

Note: at the end of the post, I share the zipped full Visual Studio 2010 solution.

The extender needs the following informations:

    • Collapsed: The state if the target control collapsed or not.
    • TargetControlID: The ID of the panel that will be collapsed.
    • ToggleControlID: The ID of the control that we will click on when toggle or collapse.
    • ToggleTextID: The ID of the control that shows different texts on different states.
    • ToggleImageID: The ID of the control that show different images on different states.
    • ExpandedText: Text to show when the control is expanded.
    • CollapsedText: Text to show when the control is collapsed.
    • ExpandedImage: Image to show when the control is expanded.
    • CollapsedImage: Image to show ehen the control is collapsed.

The code behind of the web user control:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace JQueryCollapse
{
    public partial class jQueryToggleExtender : System.Web.UI.UserControl
    {
        #region properties
        /// <summary>
        /// Defines if the panel to collapse is collapsed or not.
        /// </summary>
        public bool Collapsed
        {
            get
            {
                return hfCollapsed.Value == "1" ? true : false;
            }
            set { hfCollapsed.Value = (value ? 1 : 0).ToString(); }
        }

        protected string _TargetControlID;
        /// <summary>
        /// A conntrol to collapse and expand
        /// </summary>
        public string TargetControlID
        {
            protected get
            {
                return GetClientID(_TargetControlID);
            }
            set
            {
                _TargetControlID = value;
            }
        }

        protected string _ToggleControlID;
        /// <summary>
        /// A control to toggle.
        /// </summary>
        public string ToggleControlID
        {
            protected get
            {
                return GetClientID(_ToggleControlID);
            }
            set
            {
                _ToggleControlID = value;
            }
        }

        protected string _ToggleTextID;
        /// <summary>
        /// ID for toggle text control.
        /// </summary>
        public string ToggleTextID
        {
            protected get
            {
                return GetClientID(_ToggleTextID);
            }
            set
            {
                _ToggleTextID = value;
            }
        }

        protected string _ToggleImageID;
        /// <summary>
        /// ID for toggle image control
        /// </summary>
        public string ToggleImageID
        {
            protected get
            {
                return GetClientID(_ToggleImageID);
            }
            set
            {
                _ToggleImageID = value;
            }
        }

        /// <summary>
        /// Text to show when expanded
        /// </summary>
        public string ExpandedText { get; set; }
        /// <summary>
        /// Text to show when collapsed
        /// </summary>
        public string CollapsedText { get; set; }
        /// <summary>
        /// Image to show when expanded
        /// </summary>
        public string ExpandedImage { get; set; }
        /// <summary>
        /// Image to show when collapsed
        /// </summary>
        public string CollapsedImage { get; set; }
        #endregion

        /// <summary>
        /// Get a ClientID for a control by ID
        /// </summary>
        /// <param name="id">Id of the control</param>
        /// <returns></returns>
        protected string GetClientID(string id)
        {
            Control c = ControlUtils.FindControlRecursive(this.Page, id);

            return null != c ? c.ClientID : null;
        }
    }
}

In the markup we need to include our javascript files. For getting this work on partial page and full page postbacks and any other cases we rendering script block in InlineScripts as shown in my previous post before. We store collapsed state in a simple asp.net hiddenfield because we can reach it’s value on server and client side too.
Based on these the markup for the web user control is:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="jQueryToggleExtender.ascx.cs"Inherits="JQueryCollapse.jQueryToggleExtender" %>
<asp:ScriptManagerProxy runat="server" ID="smp">
    <Scripts>
        <asp:ScriptReference Path="~/js/jquery-1.4.4.min.js" />
        <asp:ScriptReference Path="~/js/jquery-ui-1.8.8.custom.min.js" />
    </Scripts>
</asp:ScriptManagerProxy>
<wc:InlineScript runat="server" ID="inlineScripts">
    <script type="text/javascript">
        function pageLoad() {
            var collapsed = $get('<%= hfCollapsed.ClientID %>');

            $('#<%= ToggleControlID %>').click(
                function () {
                    if (collapsed.value == 1) {
                        $('#<%= ToggleImageID %>').attr('src', '<%= ExpandedImage %>');
                        $('#<%= ToggleTextID %>').text('<%= ExpandedText %>');
                    }
                    else {
                        $('#<%= ToggleImageID %>').attr('src', '<%= CollapsedImage %>');
                        $('#<%= ToggleTextID %>').text('<%= CollapsedText %>');
                    }

                    $('#<%= TargetControlID %>').toggle('blind', {}, 500);
                    collapsed.value = 1 - collapsed.value;
                });

            if (collapsed.value == 1) {
                $('#<%= TargetControlID %>').hide();
                $('#<%= ToggleTextID %>').text('<%= CollapsedText %>').html();
                $('#<%= ToggleImageID %>').attr('src', '<%= CollapsedImage %>');
            } else {
                $('#<%= ToggleTextID %>').text('<%= ExpandedText %>').html();
                $('#<%= ToggleImageID %>').attr('src', '<%= ExpandedImage %>');
            }
        }
    </script>
</wc:InlineScript>
<asp:HiddenField runat="server" ID="hfCollapsed" />

We have to register our control in the web.config before using:

<?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
    <system.web>
        <pages>
            <controls>
                <!--Registering inline script-->
                <add tagPrefix="wc" assembly="JQueryCollapse" namespace="JQueryCollapse.WebServerControls" />
                <!--Registering toggle extender-->
                <add tagPrefix="wuc" tagName="Toggle" src="~/WebUserControls/jQueryToggleExtender/jQueryToggleExtender.ascx" />
            </controls>
        </pages>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

</configuration>

A simple example page for testing:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="JQueryCollapse.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>jquery toggle for asp.net</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel runat="server" ID="upMain">
        <ContentTemplate>
            <asp:Button runat="server" ID="btnClickMe" Text="ClickMe" />
            <a id="hrefToggle" href="#" runat="server">
                <asp:Panel ID="pnToggle" runat="server" Width="100%" BackColor="Azure">
                    <asp:ImageButton runat="server" ID="imgCollapse" AlternateText="Click here to collapse or expand" />
                    <asp:Label runat="server" ID="lblCollapse"></asp:Label>
                </asp:Panel>
            </a>
            <asp:Panel runat="server" ID="pnContent">
                Hello
            </asp:Panel>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button runat="server" ID="btnPb" Text="Postback" />
    <br />
    <asp:Button runat="server" ID="btnCollapse" OnClick="btnCollapse_Click" Text="Toggle" />
    <%--ToggleControlExtender--%>
    <wuc:Toggle runat="server" ID="tTest" TargetControlID="pnContent" ToggleControlID="hrefToggle"
        ToggleImageID="imgCollapse" ToggleTextID="lblCollapse" ExpandedText="Click here to collapse"
        ExpandedImage="Images/collapse.gif" CollapsedText="Click here to expand" CollapsedImage="Images/expand.gif"
        Collapsed="true"></wuc:Toggle>
    </form>
</body>
</html>

And the code behind of the page:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace JQueryCollapse
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        /// <summary>
        /// Toggle the extender
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnCollapse_Click(object sender, EventArgs e)
        {
            tTest.Collapsed = !tTest.Collapsed;
        }
    }
}

 

And at last the full source code of the solution can be downloaded my public folder on skydrive.

Monday, 31 January 2011

Asp.net web server control for rendering script blocks

There are many ways to add script block to our asp.net pages. This is a very simple problem until we had got a complex project with custom controls, partial page rendering, updatepanels and dynamically loaded controls.
We have to add script blocks different ways if we asynchrony post backs or full page post backs.
The other problem is when the script block don’t have to load at the first page load, it depends on some logic dynamically.

After many trying I use this solution since about half year and it works at any case.

The simple and easy to use source code is:

public class InlineScript : Control
    {
        protected override void Render(HtmlTextWriter writer)
        {
            StringBuilder sb = new StringBuilder();
            base.Render(new HtmlTextWriter(new StringWriter(sb)));

            string script = sb.ToString();

            ScriptManager sm = ScriptManager.GetCurrent(Page);
            if (!(null == sm))
            {
                if (sm.IsInAsyncPostBack)
                {
                    ScriptManager.RegisterStartupScript(this, typeof(InlineScript), UniqueID, script, false);
                }
                else
                {
                    base.Render(writer);
                }
            }
            else
            {
                this.Page.ClientScript.RegisterStartupScript(this.GetType(), this.ID, sb.ToString());
            }
        }
    }

After registering into web.config, we can use it easily everywhere on our program:

<wc:InlineScript ID="isTest" runat="server">
    <script type="text/javascript">
        function pageLoad() {
            alert('hi');
        }
    </script>
</wc:InlineScript>