Pages

Thursday, December 8, 2011

Generate Thumbnail Images and Maintain Aspect Ratio

public class ThumbnailGenerator
    {
        /// <summary>
        /// Generates the thumbnail of given image.
        /// </summary>
        /// <param name="actualImagePath">The actual image path.</param>
        /// <param name="thumbnailPath">The thumbnail path.</param>
        /// <param name="thumbWidth">Width of the thumb.</param>
        /// <param name="thumbHeight">Height of the thumb.</param>
        public static void Generate(string actualImagePath, string thumbnailPath, int thumbWidth, int thumbHeight)
        {
            Image orignalImage = Image.FromFile(actualImagePath);
 
            // Rotating image 360 degrees to discart internal thumbnail image
            orignalImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
            orignalImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
 
            // Here is the basic formula to mantain aspect ratio
            // thumbHeight   imageHeight     
            // ----------- = -----------   
            // thumbWidth    imageWidth 
            //
            // Now lets assume that image width is greater and height is less and calculate the new height
            // So as per formula given above
            int newHeight = orignalImage.Height * thumbWidth / orignalImage.Width;
            int newWidth = thumbWidth;
 
            // New height is greater than our thumbHeight so we need to keep height fixed and calculate the width accordingly
            if (newHeight > thumbHeight)
            {
                newWidth = orignalImage.Width * thumbHeight / orignalImage.Height;
                newHeight = thumbHeight;
            }
 
            //Generate a thumbnail image
            Image thumbImage = orignalImage.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
 
            // Save resized picture
            var qualityEncoder = System.Drawing.Imaging.Encoder.Quality;
            var quality = (long)100; //Image Quality 
            var ratio = new EncoderParameter(qualityEncoder, quality);
            var codecParams = new EncoderParameters(1);
            codecParams.Param[0] = ratio;
            //Right now I am saving JPEG only you can choose other formats as well
            var codecInfo = GetEncoder(ImageFormat.Jpeg);
 
            thumbImage.Save(thumbnailPath, codecInfo, codecParams);
 
            // Dispose unnecessory objects
            orignalImage.Dispose();
            thumbImage.Dispose();
        }
 
        /// <summary>
        /// Gets the encoder for particulat image format.
        /// </summary>
        /// <param name="format">Image format</param>
        /// <returns></returns>
        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }
    }

Call as :
ThumbnailGenerator.Generate(@"C:\images\Picture.jpg", @"C:\images\PictureThumb.jpg", 100, 150);

Print contents of Div using Javascript

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <script language="javascript" type="text/javascript">
        function printDiv(divID) {
            //Get the HTML of div
            var divElements = document.getElementById(divID).innerHTML;
            //Get the HTML of whole page
            var oldPage = document.body.innerHTML;
           
            //Reset the page's HTML with div's HTML only
            document.body.innerHTML = "<html><head><title></title></head><body>" + divElements + "</body>";
           
            //Print Page
            window.print();
           
            //Restore orignal HTML
            document.body.innerHTML = oldPage;
           
            //disable postback on print button
            return false;
        }
    </script>
    <title>Div Printing Test Application by Zeeshan Umar</title>
</head>
<body>
    <form runat="server">
    <asp:Button ID="btnPrint" runat="server" Text="Print" OnClientClick="return printDiv('div_print');" />
    <div id="garbage1">I am not going to be print</div>
    <div id="div_print"><h1 style="color: Red">Only Zeeshan Umar loves Asp.Net will be printed :D</h1></div>
    <div id="garbage2">I am not going to be print</div>
    </form>
</body>

Wednesday, December 7, 2011

Asp.net Cache Sliding Expiration and Absolute Expiration

Asp .Net provides two different ways to expire the cache on the basis of time. Here are two aproaches:-
  1. Sliding Expiration
  2. Absolute Expiration 
1. Absolute Expiration
Absolute expiration means that your data will be removed from cache after fixed amount of time either it is accessed or not. Generally we use it when we are displaying data which is changing but we can afford to display outdated data in our pages.  Mostly I put all of my dropdown values in cache with Absolute Expiration. Here is how you can code:-


 
DataTable dt = GetDataFromDatabase();
Cache.Insert("AbsoluteCacheKey", dt, null,
DateTime.Now.AddMinutes(1), //Data will expire after 1 minute
System.Web.Caching.Cache.NoSlidingExpiration);

2. Sliding Expiration
Sliding expiration means that your data will be removed from cache if that is not accessed for certain amount of time. Generally we store that data in this cache mode which is accessed many time on certain occasions. For example if you go in account settings section of a site, then you will be frequently accesing account information in that section. But most of the time you wont be using account setting's related data so there is no point of storing that data in cache. In such scenarios sliding expiration should be used. here is how you can save data in cache with sliding expiration:-
DataTable dt = GetDataFromDatabase();
Cache.Insert("SlidingExpiration", data, null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromMinutes(1));//Data will be cached for 1 mins

Hopefully this information will be useful for you

Friday, November 25, 2011

Code for displaying columns of the gridview based on the columns checked in the Listbox.

Here is the code for displaying columns of the gridview based on the columns checked in the Listbox. This will by default display one column in the gridview and one checkbox ticked in checkbox list. On selecting other checkboxes i.e. firstname, last name, age,gender the columns become visible in the gridview.
<div>
<asp:CheckBoxList ID="chkColumns" runat="server">
</asp:CheckBoxList>
<asp:Button ID="btnShow" runat="server" Text="Show" OnClick="btnShow_Click" />
</div>
<a href="javascript:void(0);">Click</a>
<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">
<Columns>
    <asp:BoundField DataField="id" HeaderText="id" />
</Columns>
</asp:GridView>

    public static DataTable dt;// = new DataTable();
    public static ArrayList existing = new ArrayList();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            createtable();
        }
    }
    private void createtable()
        {
            dt = new DataTable();
            dt.Columns.Add("id");
            dt.Columns.Add("firstname");
            dt.Columns.Add("lastname");
            dt.Columns.Add("age");
            dt.Columns.Add("gender");
            object[] d1 = {"1","a","a1","10","M" };
            object[] d2 = { "2", "b", "b1", "20", "F" };
            object[] d3 = { "3", "c", "c1", "30", "M" };
            object[] d4 = { "4", "d", "d1", "40", "F" };
            dt.Rows.Add(d1);
            dt.Rows.Add(d2);
            dt.Rows.Add(d3);
            dt.Rows.Add(d4);
            GridView1.DataSource = dt;
            GridView1.DataBind();
            bindCheckbox();
            AddVisibleColumnsToArray();
            MarkCheckedInArrayForVisibleColumns();
        }
    private void bindCheckbox()
        {
            chkColumns.DataSource = dt.Columns;
            chkColumns.DataBind();
    }
    private void AddVisibleColumnsToArray()
        {
            GetColumnByDBName(GridView1);
        }
        private void MarkCheckedInArrayForVisibleColumns()
        {
            foreach (ListItem item in chkColumns.Items)
            {
                if (existing.Contains(item.Value))
                    item.Selected = true;
            }
        }
    protected void btnShow_Click(object sender, EventArgs e)
        {
            ArrayList arr =new ArrayList();
            HideGridviewColumns(GridView1,arr);
            foreach (ListItem item in chkColumns.Items)
            {
                if (item.Selected)
                {
                    BoundField b = new BoundField();
                    b.DataField = item.Value;
                    b.HeaderText = item.Value;
                    GridView1.Columns.Add(b);
                }
            }
            GridView1.DataSource = dt;
            GridView1.DataBind();
            AddVisibleColumnsToArray();
            MarkCheckedInArrayForVisibleColumns();
    }
    public void GetColumnByDBName(GridView aGridView)
        {
            existing.Clear();
            System.Web.UI.WebControls.BoundField DataColumn;
   
            for (int Index = 0; Index < aGridView.Columns.Count; Index++)
            {
                DataColumn = aGridView.Columns[Index] as System.Web.UI.WebControls.BoundField;
   
                if (DataColumn != null)
                {
                    if (DataColumn.Visible)
                    {
                        if (!existing.Contains(DataColumn.HeaderText))
                            existing.Add(DataColumn.HeaderText);
                    }
                }
            }
        }
   

Tuesday, November 22, 2011

Get XML node and node attribute value

XmlDocument webConfig = new XmlDocument();
        webConfig.Load(HttpContext.Current.Server.MapPath(@"~\web.config"));
        XmlNode node = webConfig.SelectSingleNode("/configuration/system.web/authentication/forms");
        node.Attributes["timeout"].Value;

        node.Value;

       

Forms Authentication for folders with different login page

Folder Structure:

Admin(Folder)
--Default.aspx
--Login.aspx
--Web.Config
User(Folder)

--Default.aspx
--Login.aspx
--Web.Config
Default.aspx
Login.aspx
Web.Config


The problem is as follows:
If a visitor try to access a page in Admin folder he must be redirected to login page located in Admin folder, here his username and password will be checked in SQL Server table, if authenticated then he will be redirected to Default page and he can access any page in Admin folder, but not the pages in User folder
Note: login page in Admin folder and login page in User folder are different.
Same scenario is for User folder

Solution:Here are the steps to follow:
1. Put following lines in /Admin/Web.config file<configuration>
 <location path="Login.aspx">
  <system.web>
   <authorization>
    <allow users="?"/>
   </authorization>
  </system.web>
</location>
</configuration>
2. Put following lines in /User/Web.config file
<configuration>
 <location path="Login.aspx">
  <system.web>
   <authorization>
    <allow users="?"/>
   </authorization>
  </system.web>
 </location>
</configuration>
3. Put following lines in Web.config file (root). Here Login.aspx page is placed at the root path (Note: loginUrl here is the Login page located on the root path)
<authentication mode="Forms">
 <forms name="login" timeout="120" slidingExpiration="false" loginUrl="Login.aspx"></forms>
</authentication>
<location path="Admin">
 <system.web>
  <authorization>
 <allow roles="Admin"/>
 <deny users="*"/>
  </authorization>
 </system.web>
</location>
  <location path="User">
    <system.web>
      <authorization>   
        <allow  roles="User"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
  <location path="Default.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
4. Put following code only in the Login.aspx page located on the root path
protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["ReturnUrl"] != null && Request.QueryString["ReturnUrl"].ToString().Length > 0)
        {
            string returnUrl = Request.QueryString["ReturnUrl"].ToString();
            if (returnUrl.ToLower().Contains("/user/"))
            {
                Response.Redirect(string.Format("~/user/Login.aspx?ReturnUrl={0}", returnUrl));
            }
            if (returnUrl.ToLower().Contains("/admin/"))
            {
                Response.Redirect(string.Format("~/admin/Login.aspx?ReturnUrl={0}", returnUrl));
            }
        }
    }
5. On the Login.aspx page under Admin & User folder do the authentication and put following line at the end of button click.HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, createPersistentCookie));

6. And finally put following code for both signOut and redirect accordingly.
 FormsAuthentication.SignOut();
        Response.Redirect("~/admin/Login.aspx");
        or
        FormsAuthentication.SignOut();
        Response.Redirect("~/user/Login.aspx");


Hoping that this might help!       
 


Friday, November 11, 2011

Hide Gridview column

static public void HideGridviewColumns(GridView aGridView,ArrayList arrColumnName)
    {
        System.Web.UI.WebControls.BoundField DataColumn;
        if (arrColumnName.Count > 0)
        {
            for (int Index = 0; Index < aGridView.Columns.Count; Index++)
            {
                DataColumn = aGridView.Columns[Index] as System.Web.UI.WebControls.BoundField;

                if (DataColumn != null)
                {
                    DataColumn.Visible = !arrColumnName.Contains(DataColumn.HeaderText);

                }
            }
        }
        else
        {
            for (int Index = 0; Index < aGridView.Columns.Count; Index++)
            {
                DataColumn = aGridView.Columns[Index] as System.Web.UI.WebControls.BoundField;

                if (DataColumn != null)
                {
                    DataColumn.Visible = false;
                }
            }
        }
    }