:: Kunagorn Sirikup :: C# Developer

31/7/56

Convert ข้อมูล Image เป็น Byte[] ด้วย MemoryStream

ฐานข้อมูลส่วนใหญ่จะเก็บข้อมูล รูปภาพ หรือ ไฟล์ต่างๆ โดยการเก็บ Path เพื่ออ้างอิงถึง รูปภาพ หรือ ไฟล์ นั้นๆ ซึ่งมีข้อดีคือฐานข้อมูลมีขนาดไม่ใหญ่ และสามารถแก้ไขข้อมูลได้ง่าย แต่ในบางกรณี รูปภาพหรือไฟล์นั้นๆ อาจมีความสำคัญและจำเป็นต้องเก็บลงฐานข้อมูล ในรูปแบบของ Stream ดังนั้น เมื่อต้องการที่จะบันทึกรูปภาพหรือไฟล์ลงฐานข้อมูล จำเป็นต้อง Convert ให้อยู่ในรูปแบบของ Stream โดยใช้ MemoryStream
MemoryStream ช่วยให้สามารถรับข้อมูลที่เป็น Byte Array หรือข้อมูลอื่นๆผ่าน Stream ซึ่งมีความยืดหยุ่นกว่าการเก็บข้อมูลลง Storage ต่างๆ และสามารถเข้าถึงข้อมูลได้เร็วกว่า disk หรือ network
ก่อนจะสามารถใช้งาน MemoryStream ได้ ต้องอ้างถึง System.IO ก่อน
ตัวอย่าง using
1.อ้างอิงถึง namespace System.IO
using System.IO;
2.เขียน Code ตามตัวอย่างนี้ ในที่นี้ขอยกตัวอย่างเป็น Method สำหรับ Convert ค่ารูปภาพเป็น Byte Array
public byte[] imageToByteArray(System.Drawing.Image pImage)
{
    MemoryStream ms = new MemoryStream();
    pImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
    return  ms.ToArray();
}

สร้าง Paging โดยใช้ LINQ

วันนี้จะมาแนะนำเกี่ยวกับการแบ่งข้ิอมูลออกเป็นหน้า หรือการทำ Paging โดยใช้ LINQ เรื่มแรกกำหนดตัวแปร ดังนี้

var iPageNum = 7;  /// parameter เลขหน้าที่ต้องการดึงข้อมูล
var iPageSize = 10 /// parameter จำนวนข้อมูลที่ต้องการแสดง / หน้า 

Example
var questions = db.Customers
                  .OrderByDescending(f => f.Id)
                  .Skip((iPageNum - 1) * iPageSize)
                  .Take(iPageSize);

** หมายถึงต้องการดึงข้อมูลแบบ Paging จากหน้า 7 โดยแสดงข้อมูลในหน้านั้นจำนวน 10 Rows สมมตว่าข้อมูลมี 100 Rows ระบบจะแสดงข้อมูล Rows ที่  61-70

วิธีการสร้าง DateTime ที่รับจาก Input String

ในกรณีที่ String หรือ TextBox เก็บข้อมูล DateTime ในรูปแบบ dd/MM/yyyy เช่น 26/08/2008 เมื่อนำมา Convert อาจะเกิดข้อผิดพลาดได้ถ้ารูปแบบ Datetime ที่อ้างอิงจาก Regional ของเครื่องมีค่าเป็น MM/dd/yyyy เพราะ MM มีค่าแค่ 12 เดือน แต่ค่าที่รับมาคือ 26 ทำให้ระบบไม่สามารถ Convert ข้อมูล DateTime ได้ ดังนั้น จึงวิธีการแก้ปัญหาโดยการรับข้อมูล DateTime ที่เป็น String แล้วนำมา Split ค่าออกมาเป็น Array ของ String เช่น
string[] dateArr = “26/08/2008″.Split(‘/’); 
จะได้ข้อมูลออกมาเป็น
dateArr[0] = "26"
dateArr[1] = "08"
dateArr[2] = "2008"
ดังนั้น สร้างข้อมูล DateTime โดยกำหนด Parameter ปี เดือน วัน สามารถต่างๆทำได้ ดังนี้
DateTime date = new DateTime(int Year,
                             int Month,
                             int Day,
                             int minute,
                             int second ,
                             int millisecond)
Example Code
string[] dateArr = txtDateTime.ToString().Split('/');
DateTime date = new DateTime(int.Parse(dateArr[2])
                             , int.Parse(dateArr[1])
                             , int.Parse(dateArr[0]), 0, 0, 0);

Website Thumbnail Screenshot

ตัวอย่าง Code เพื่อสร้างภาพ Thumbnail ของเวบไซต์ที่ต้องการ โดยสามารถกำหนดความกว้าง สูง ได้เองผ่าน Parameter ขั้นตอนการสร้าง ดังนี้

1.สร้าง Class ชื่อ ClassWSThumb เพื่อจัดการในส่วนของการสร้างภาพ Thumbnail รวมถึงการแสดงผลของภาพ เช่น ขนาดความกว้าง สูง ของ ภาพที่ทำการ Capture , ขนาดความกว้าง สูง ของ thumbnail  ตาม Code นี้


using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.IO;

public class ClassWSThumb
{
   public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth,
           int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
   {
        return new WSThumb(Url, BrowserWidth, BrowserHeight,
               ThumbnailWidth, ThumbnailHeight).GetWSThumb();
   }

   private class WSThumb
   {
        public WSThumb(string Url, int BW, int BH, int TW, int TH)
        {
            __Url = Url;
            __BrowserWidth = BW;
            __BrowserHeight = BH;
            __ThumbnailWidth = TW;
            __ThumbnailHeight = TH;
        }

        private Bitmap __Bitmap = null;
        private string __Url = null;
        private int __ThumbnailWidth;
        private int __ThumbnailHeight;
        private int __BrowserWidth;
        private int __BrowserHeight;

        public string Url
        {
            get { return __Url; }
            set { __Url = value; }
        }

        public Bitmap ThumbnailImage
        {
            get { return __Bitmap; }
        }

        public int ThumbnailWidth
        {
            get { return __ThumbnailWidth; }
            set { __ThumbnailWidth = value; }
        }

        public int ThumbnailHeight
        {
            get { return __ThumbnailHeight; }
            set { __ThumbnailHeight = value; }
        }

        public int BrowserWidth
        {
            get { return __BrowserWidth; }
            set { __BrowserWidth = value; }
        }

        public int BrowserHeight
        {
            get { return __BrowserHeight; }
            set { __BrowserHeight = value; }
        }

        public Bitmap GetWSThumb()
        {
            ThreadStart __threadStart = new ThreadStart(_GenerateWSThumb);
            Thread __thread = new Thread(__threadStart);

            __thread.SetApartmentState(ApartmentState.STA);
            __thread.Start();
            __thread.Join();
            return __Bitmap;
        }

        private void _GenerateWSThumb()
        {
            WebBrowser __WebBrowser = new WebBrowser();
            __WebBrowser.ScrollBarsEnabled = false;
            __WebBrowser.Navigate(__Url);
            __WebBrowser.DocumentCompleted +=
              new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
            while (__WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
            __WebBrowser.Dispose();
        }

        private void WebBrowser_DocumentCompleted(object sender,
                     WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser __WebBrowser = (WebBrowser)sender;
            __WebBrowser.ClientSize = new Size(this.__BrowserWidth, this.__BrowserHeight);
            __WebBrowser.ScrollBarsEnabled = false;
            __Bitmap = new Bitmap(__WebBrowser.Bounds.Width, __WebBrowser.Bounds.Height);
            __WebBrowser.BringToFront();
            __WebBrowser.DrawToBitmap(__Bitmap, __WebBrowser.Bounds);

            if (__ThumbnailHeight != 0 && __ThumbnailWidth != 0)
                __Bitmap = (Bitmap)__Bitmap.GetThumbnailImage(
                    __ThumbnailWidth, __ThumbnailHeight, null, IntPtr.Zero);
        }
   }
}

2.สร้างไฟล์ Generic Handler (*.ashx) สำหรับทำหน้าที่รับ Request มาดำเนินการ Process งาน เมื่อเสร็จแล้วก็จะส่ง Response กลับไป ดังนั้นจึงเหมาะกับการทำงานที่มี Process ไม่เยอะ เช่น Upload, Download หรือการรับ AJAX Request ในที่นี้ตั้งชื่อไฟล์ว่า HandlerWSThumb.ashx ตัวอย่าง Code ดังนี้


using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Reflection;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class HandlerWSThumb : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        Bitmap thumb = null;
        string url = null;
        int bw = 800; // ความกว้างของ Border
        int bh = 600; // ความสูงของ Border
        int tw = 0;   // ความกว้างของ Thumbnail
        int th = 0;   // ความสูงของ Thumbnail

        // กำหนดประเภทของไฟล์ สามารถกำหนดเป็นประเภทอื่นได้
        context.Response.ContentType = "image/jpeg";

        if (context.Request["url"] != null)
        {
            if (context.Request["url"].ToString().ToLower().Contains("http://") ||
                   context.Request["url"].ToString().ToLower().Contains("https://"))
                url = context.Request["url"].ToString();
            else
                url = "http://" + context.Request["url"].ToString();
        }

        if (context.Request["bw"] != null)
            bw = Int32.Parse(context.Request["bw"].ToString());

        if (context.Request["bh"] != null)
            bh = Int32.Parse(context.Request["bh"].ToString());

        if (context.Request["tw"] != null)
            tw = Int32.Parse(context.Request["tw"].ToString());

        if (context.Request["th"] != null)
            th = Int32.Parse(context.Request["th"].ToString());

        // return context bitmap
        thumb = GetWebSiteThumbnail(url, bw, bh);

        if (tw != 0 && th != 0)
            thumb.GetThumbnailImage(tw, th, null, IntPtr.Zero).Save(
                       context.Response.OutputStream, ImageFormat.Jpeg);
        else
            thumb.Save(context.Response.OutputStream, ImageFormat.Jpeg);

        thumb.Dispose();
    }

    public static Bitmap GetWebSiteThumbnail(string Url,
                  int BrowserWidth, int BrowserHeight)
    {
        WebsiteThumbnailImage thumbnailGenerator =
          new WebsiteThumbnailImage(Url, BrowserWidth, BrowserHeight);
        return thumbnailGenerator.GenerateWebSiteThumbnailImage();
    }

    private class WebsiteThumbnailImage
    {
        public WebsiteThumbnailImage(string Url,
               int BrowserWidth, int BrowserHeight)
        {
            this.m_Url = Url;
            this.m_BrowserWidth = BrowserWidth;
            this.m_BrowserHeight = BrowserHeight;
        }

        private string m_Url = null;
        public string Url
        {
            get { return m_Url; }
            set { m_Url = value; }
        }

        private Bitmap m_Bitmap = null;
        public Bitmap ThumbnailImage
        {
            get { return m_Bitmap; }
        }

        private int m_BrowserWidth;
        public int BrowserWidth
        {
            get { return m_BrowserWidth; }
            set { m_BrowserWidth = value; }
        }

        private int m_BrowserHeight;
        public int BrowserHeight
        {
            get { return m_BrowserHeight; }
            set { m_BrowserHeight = value; }
        }

        public Bitmap GenerateWebSiteThumbnailImage()
        {
            Thread m_thread =
              new Thread(new ThreadStart(_GenerateWebSiteThumbnailImage));
            m_thread.SetApartmentState(ApartmentState.STA);
            m_thread.Start();
            m_thread.Join();
            return m_Bitmap;
        }

        private void _GenerateWebSiteThumbnailImage()
        {
            WebBrowser m_WebBrowser = new WebBrowser();
            m_WebBrowser.ScrollBarsEnabled = false;
            m_WebBrowser.Navigate(m_Url);
            m_WebBrowser.DocumentCompleted +=
              new WebBrowserDocumentCompletedEventHandler(
              WebBrowser_DocumentCompleted);
            while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
            m_WebBrowser.Dispose();
        }

        private void WebBrowser_DocumentCompleted(object sender,
                WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser m_WebBrowser = (WebBrowser)sender;
            m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth,
                                      this.m_BrowserHeight);
            m_WebBrowser.ScrollBarsEnabled = false;
            m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width,
                                  m_WebBrowser.Bounds.Height);
            m_WebBrowser.BringToFront();
            m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds);
            //m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(
            //   m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero);
        }
    }

    // Resusable flag
    public bool IsReusable
    {
        get { return false; }
    }
}

3.จากนั้น สามารถเรียกใช้งานโดย Class จะทำหน้าที่จัดการรูปภาพ แล้วคืนออกมาเป็น ImagePath ในที่นี้ยกตัวอย่างสร้าง Method เพื่อ Generate Path ของรูปภาพที่ดึงข้อมูลได้


public string CreateThumbnailPath(string pURL
    , string pBorderWidth
    , string pBorderHeight
    , string pThumbBorder
    , string pThumbHeight)
{
    string path = null;
    try
    {
        path = string.Format("~/HandlerWSThumb.ashx?url={0}&bw={1}&bh={2}&tw={3}&th={4}"
                            , pURL.ToString()
                            , pBorderWidth // ความกว้างของ Border
                            , pBorderHeight // ความสูงของ Border
                            , pThumbBorder // ความกว้างของ Thumbnail
                            , pThumbHeight); // ความสูงของ Thumbnail
    }
    catch (Exception ex)
    {

    }
    return path;
}

Javascript : Enter key press event

สร้าง Javascript เพื่อกำหนด Attributes ให้กับ Control เมื่อกดปุ่ม Enter แล้วจะเข้าไปทำงานตาม Event ที่กำหนดไว้ ตัวอย่างเช่น หน้าจอมี Control อยู่ 2 อัน คือ TextBox และ Button เมื่อพิมพ์ข้อความที่ TextBox แล้ว พอกดปุ่ม Enter ระบบจะเข้ามาทำงานที่ Event Click ของ Button ดังนั้นจึงต้องกำหนด Javascript ที่ TextBox เพื่อตรวจว่าผู้ใช้ Input ข้อมูลมาเป็น Enter หรือไม่ ตาม Code นี้


private void RegisterJavaScript() 
{
   TextBox1.Attributes.Add("OnKeyPress", "doClick('" + Button1.ClientID + "',event)");
}

Code ในส่วนนี้ต้องเรียกใช้ในส่วนของ PageLoad เพื่อกำหนด Attributes ให้กับ TextBox ทุกครั้งที่มีการโหลด Page ครั้ง 
แรก จากนั้นให้เขียน Javascript เพื่อเรียกใช้งาน function ที่กำหนดไว้ในตอนแรก ตาม Code นี้


<script type="text/javascript">
    function doClick(buttonName,e)
    {
        var key;
         if(window.event)
              key = window.event.keyCode;     //IE
         else
              key = e.which;     //firefox

        if (key == 13)
        {
            //Get the button the user wants to have clicked
            var btn = document.getElementById(buttonName);
            if (btn != null)
            { //If we find the button click it
                btn.click();
                event.keyCode = 0
            }
        }
   }   
</script>

สร้าง Password ด้วย Web.Security.Membership

ในกรณีที่ต้องการสร้าง Random Password เพื่อกำหนดรหัสผ่านชั่วคราวให้ผู้ใช้ สามารถทำได้โดยใช้ Class GeneratePassword  ซึ่งสามารถกำหนดความยาวของรหัสผ่าน รวมถึงจำนวนอักขระพิเศษ ( non-alphanumeric ) ได้

ขั้นตอนการสร้าง
1.กำหนด namespace System.Web.Security เพื่ออ้างอิงถึง library Membership
2.เรียกใช้ System.Web.Security.Membership.GeneratePassword เพื่อสร้างรหัสผ่าน ซึ่งเป็น Static Class สามารถเรียกใช้งานได้เลย ประกอบด้วย Parameter ดังนี้
length – ความยาวของรหัสผ่าน
numberOfNonAlphanumericCharacters – จำนวนอักขระพิเศษ ( @, #, !, %, & ) ที่ต้องการกำหนดในรหัสผ่าน
ตัวอย่าง ในตัวอย่างนี้กำหนดความยาว 8 ตัวอักษร และกำหนดให้มีอักขระพิเศษ 1 ตัวอักษร ดังนี้

Example Code
string temppassword= System.Web.Security.Membership.GeneratePassword(8, 1);

Outout
ตัวอย่างรหัสผ่านที่สร้างได้ >> ?RlpiY=b

ตรวจสอบ Mobile Devices ด้วย JavaScript

วันนี้จะมาแนะนำวิธีง่ายๆในการตรวจสอบว่าผู้ใช้เข้าใช้งานเว็บเพจด้วยอุปกรณ์ใด โดยใช้ javascript ชื่อว่า Navigator userAgent (อ้างอิง) ซึ่งมีหน้าที่คืนค่า user-agent header ของ Browser ที่ถูกส่งไป Server

ตัวอย่างการใช้งาน
<script>
   document.write("User-agent header sent: " + navigator.userAgent);

</script>

outout
mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/28.0.1500.72 safari/537.36

ต่อไปลองมาประยุกต์ใช้โดยการตรวจสอบตอน Page Load ว่าผู้ใช้เข้าใช้งา่นเว็บไซต์เราด้วยอุปกรณ์ใด ในตัวอย่างนี้จะเขียน Code เพื่อตรวจสอบว่าผู้ใช้เข้าใช้งานด้วย iPhone หรือไม่

  <script>
        $(document).ready(function () {
            var deviceIphone = "iphone";

            // Initialize user agent ใหัเป็นตัวเล็กทั้งหมด
            var uagent = navigator.userAgent.toLowerCase();

            // ตรวจสอบว่า user agent เป็นของอุปกรณ์ iPhone หรือไม่
            if (uagent.search(deviceIphone) > -1)
                document.write('Access with iPhone');
            else
                document.write('Access with Other Device');
        });
    </script>