แสดงบทความที่มีป้ายกำกับ C# แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ C# แสดงบทความทั้งหมด

วันอังคารที่ 22 ตุลาคม พ.ศ. 2556

User Control เรียก Method จาก Parent Page ด้วย Reflection

สำหรับคนที่เขียนโปรแกรมด้วย User Control อาจประสบปัญหา เมื่อต้องการส่งข้อมูลจากเพจลูก (Child User Control) ไปยังเพจหลัก (Parent Page)  จะไม่สามารถทำได้ หรือใช้วิธีอื่นๆ แทน เช่น ส่ง Session แทน แต่มันมีวิธีอยู่นะ มาดูตัวอย่างเลยดีกว่า

Parent Page Method

public void DisplayMessage(string message)
{
   Response.Write(message);
}

Child User Control Method

protected void btnSend_Click(object sender, EventArgs e)
{
    this.Page.GetType().InvokeMember("DisplayMessage"/*ชื่อ Method ที่เพจหลัก*/, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, new object[] { txtMessage.Text/*Object ที่ต้องการส่งกลับไป*/ });
}

Credit: ASPSnippets

วันอังคารที่ 13 พฤศจิกายน พ.ศ. 2555

Delegate & Event ใน C# เพื่อใช้ในการรับส่งค่าระหว่าง From สามารถนำไปใช้ได้


delegate ซึ่งแปลตรงตัวก็คือ 'ตัวแทน' โดยการทำงานของมันก็ทำหน้าที่เป็นตัวแทนของ method 
ลักษณะการใช้งาน Delegate ซึ่งโดยปกติการเรียกใช้ method นั้นเราต้องระบุชื่อ method ที่เราต้องการใช้งาน แต่แนวคิดในการโปรแกรมแบบ Delegate นั้นต่างออกไป โดยแทนที่เราจะเรียกไปที่ methodที่เราต้องการ ตรงๆแต่กลับเรียกผ่าน Delegate แทน   ซึ่ง Delegate ก็คือตัวแทน method ที่เราต้องการนั่นเอง  โดยผู้เรียก delegate จะไม่รับรู้ว่า method จริงอยู่ที่ส่วนใดของโปรแกรม แค่คิดว่าถ้าเรียกผ่าน Delegate แล้ว Delegate จะต้องมีหน้าที่ทำงานได้ตามที่ผู้เรียกต้องการเท่า
Ex:    ผู้เรียก -------------------------> Delegate -------------------------> Class1.fnc();
การประกาศ Delegate  
delegate void Mydelegate ();
จุดประสงค์ของประโยคด้านบนคือ ประกาศDelegate type ชื่อ Mydelegate ซึ่งไม่มี argument และมี return type เป็น void

 เบื้องหลังการทำงานนั้น compiler จะสร้าง metadata และ class ที่สืบทอดมาจาก MulticastDelegatให้อย่างอัตโนมัติ ซึ่งสามารถแสดงดัง psuedocode 
class Mydelegate : MulticastDelegate
{      
   public Mydelegate(object obj, int ptr)
   { }
   public void Invoke()
   { }
}


เรามาเริ่มเขียน Code  ในการรับส่งข้อมูล  โดยใช้  delegate  เป็น ตัวแทนของ Method By Event กันครับ 
จาก  Flow การทำงานดังกล่าว 
     ผู้เรียก -------------------------> Delegate -------------------------> Class1.fnc();
เราจะทำการสร้าง  From มา 2 From   โดย
ผู้เรียก  ==> FrmSale.cs   (หน้าจอขายเพื่อแสดงรายการสินค้า)
ผู้ถูกเรียก ===> Frm_Find.cs (หน้าจอที่แสดงรายการสินค้า เพื่อ Set กลับมาที่หน้าจอขาย)
Delegate  ===> จะเป็น Object  ที่อยู่ในหน้าจอ   Frm_Find.cs
Class1.fnc() ==>จะเป็น Class ที่ Delegate  Pass  ค่าเข้าไปให้  และ ถูก   FrmSale.cs นำข้อมูลกลับผ่าน Event 

เอาละ  เรามาลอง Code ในแต่ละส่วนกัน  มาเริ่มที่   Frm_Find.cs  ก่อนนะครับ 


CODE#:  Frm_Find.cs 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TransForm
{
       public partial class Frm_Find : Form
      {
          // IdentityProduct   คือ Class (Class1.fnc())  ที่ใช้  Delegate  เป็นตัวแทน 
           public delegate void IdentityReturnHandler(object sender, IdentityProduct e);
          // Identitydata เป็น Event ของ Form(Frm_Find)  เพื่อที่จะ Pass Valuse กลับไปยังผู้ที่เรียก
           public event IdentityReturnHandler Identitydata;       

         /// 
         ///  ======> ในส่วนนี้เป็นแค่ตัวอย่างนะครับ  ที่จริงต้อง Return กลับเป็น  DataRow หรือ DataSet
         /// 
         /// 
         /// 
        private void btn_OK_Click(object sender, EventArgs e)
        {
            try
             {
                    string  ls_Name  = txt_Name.Text;
                    Decimal  ld_Price  = Convert.ToDecimal(txt_Price.Text)   
//สังเกตุIdentityProduct ให่ดีนะครับมันจะถูกสร้างเป็น Type Event ใน   ตัว delegate 
                    // เพราะเวลาที่ตัวเรียกใช้  จะเรียกผ่าน Event 
                    IdentityProduct arge = new IdentityProduct( ls_Name, ld_Price);  // ส่งค่าไปยัง Class   IdentityProduct  
                    Identitydata(this, arge);
                    this.Dispose();
             }
            catch { }
         } 
}

   /// 
    ///  เป็น CLASS ที่ทำการส่งค่ากลับไปให้ From Sale โดยที่ตัว Delegate  เป็นตัวแทน โดบ Return  กลับผ่าน Event
    /// 
    public class IdentityProduct : System.EventArgs
    {
        string  ls_Name  = String.Emtry;
        Decimal  ld_Price  =0;        
       
        // เป็น Constructure ของ Class  รับค่าได้อย่างเดียว
        public IdentityProduct( string  Name ,Decimal  Price)
        {
             ls_Name  = Name;
             ld_Price   = Price;
        }


       // เป็น Property ที่จะทำการ Return กลับไปโดย Event 
        public string  Name
        {
            get { return ls_Name; }
        }

        public Decimal  PRICEPRODUCT
        {
            get { return ld_Price; }
        }
    }    
}


CODE#:  FrmSale.cs

มาดูตอนที่เรียกครับ สร้าง From มา 1 From จากนั้นก้อสร้าง ปุ่ม


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TransForm
{
   public partial class FrmSale : Form
    {
     private void btn_Search_Click(object sender, EventArgs e)
        {
              Frm_Find _F = new Frm_Find();
             // บรรทัดล่างนี้จะเป็นการเรียกใช้งานผ่าน Event ที่อยู่ใน From   Frm_Find
            _F.Identitydata+=new Frm_Find.IdentityReturnHandler(_F_Identitydatarow);
            _F.ShowDialog();
        } 
// Methodนี้จะถูกCreate ขึ้นมาตอนที่เราเรียกใช้  Event _F.Identitydata+=new Frm_Find.IdentityReturnHandler   (_F_Identitydatarow);
         void _F_Identitydata(object sender, IdentityProduct e)
        { 
             //  จากนั้น ตัวแปลจาก From ก็ ถูกส่งผ่าน Class  IdentityProduct   ใน Event e  เพราะตอนที่เรา  delegate  เราให้มันเป็น Event 
             Txt_Name.Text  = e.Name;
             Txt_Price.Text   = e.PRICEPRODUCT.Tostring();
        }
    }
}

Credit: WINCOMMON

วันอังคารที่ 3 กรกฎาคม พ.ศ. 2555

เปรียบเทียบ VB.NET VS. C#

"... เปรียบเทียบ C#.net กับ vb.net
การเลือกระหว่างภาษา C#.Net และ VB.Net มักเป็นข้อที่หลายคนคิดในช่วงวางแผนก่อนที่จะเริ่ม ลงทุนลงแรงเพื่อศึกษาและนำมาใช้ในการพัฒนาระบบขึ้นมา

ข้อเสนอแนะอย่างง่ายที่สุดของไมโครซอฟต์ ก็คือว่าเรามีความชำนาญ มีความคุ้นเคย ชอบพอกับภาษาใดมาก่อน ก็ให้เลือกภาษาที่เป็นแนวเดียวกันนั้น เนื่องจากทุกภาษาใน .Net จะถูกแปลเป็นภาษา Microsoft Intermediate Language (MSIL) โดยเฉพาะสองภาษา ที่จะเปรียบเทียบกันนี้ ถ้าเขียนโค้ด VB.Net อย่างถูกต้องดี รหัส MSIL ที่ได้ ก็แทบจะเหมือนกันเลย ดังนั้น performance ของงานที่ได้ ก็จะไม่แตกต่างกัน นี่เป็นการยกระดับงาน Visual Basic เป็นอย่างมาก แล้วการที่ VB.Net ใช้ Base Class Library ของ .Net framework ร่วมกันกับ C# ก็ทำให้ VB.Net programmer ถือเป็น first-class citizen ไปแล้ว

การเขียนโค้ด VB.Net อย่างถูกต้องดี เช่นมีการใช้ Option Strict Onหรือมีการใช้ DirectCast แทนที่จะใช้ CType เป็นต้น.

รายละเอียดการเปรียบเทียบสองภาษา ในข้อความนี้ รวบรวมประมวลมาจากแหล่งข้อมูลต่างๆ หลายแห่ง ซึ่งอาจจะต้องมีการพูดถึงศัพท์หรือเทคนิคลึกๆ บ้างเพื่อให้ได้ความสมบูรณ์นะครับ

ดูข้อดีของ Visual Basic .Net
- รองรับ Optional argument ซึ่งสำคัญมากที่คุณต้องการใช้งานร่วมกับ ActiveX component หรือการเขียนโค้ดชนกับพวก Office
- ทำตัวไม่ซีเรียสได้ คือยอมรับการทำ late-binding ได้ ถ้าไม่กำหนด Option Strict On การเขียนโค้ดพวกนี้ใช้กับพวก ActiveX อีกนั่นเอง (ผมแนะนำให้หลีกเลี่ยงการเขียนโค้ดแบบ late-binding ใน .Net)
- รองรับการทำ named indexer (การสร้าง property ที่มี argument)
- มีคำสั่ง VB แบบเดิมๆ เช่น Left, Mid, UCase, ... ให้ใช้ง่ายๆ สำหรับผู้ใช้ VB6 มาก่อน (การเรียกใช้ฟังก์ชันแบบเดิมๆ นี้จะมีผลต่อประสิทธิภาพของโปรแกรม)
- มีประโยค With..End With ให้ใช้
- ความเรียบง่าย เช่นการสร้างประโยค Event
- สามารถกำหนดชื่อเมธอดของการ implements interface ที่ต่างจากที่กำหนดไว้ใน interface ได้ (ผมว่าไม่ค่อยได้ประโยชน์เลย ทำให้ยุ่งยากในการค้นหาเสียมากกว่า)
- มีประโยค Catch...When... ทำให้สามารถทำการ filter exception ด้วยเงื่อนไขได้ นอกเหนือจากการ filter ด้วยชนิดของ exception เท่านั้น
- Visual Studio .Net จะทำการ compile โค้ดในลักษณะ background ซึ่งช่วยเป็นข้อดีในโปรเจ็กต์ขนาดเล็ก แต่ถ้าโปรเจ็กต์ขนาดใหญ่มหึมา จะกลับเป็นข้อเสียอย่างมาก (มีฝรั่งหลายคนบ่นว่าต้องถึงกับต้องยอมเปลี่ยนจาก VB.Net มาเป็น C# เลย ในโปรเจ็กต์ที่มีไฟล์มีคลาสเป็นพันๆ)

ข้อดีของ C# .Net
- รองรับ XML documentation คล้ายๆ javadoc คือเอาคอมเม้นต์ในโค้ดมาแปลงเป็นเอกสาร technical manual ได้เลย แต่ใน VB.Net เวอร์ชั่น 2005 (Whidbey) ก็จะรองรับในคุณสมบัตินี้ด้วย
- สามารถทำ operator overloading ได้ (VB.Net 2005 ก็จะทำได้เช่นกัน)
- รองรับ unsigned datatype (VB.Net 2005 ก็จะทำได้เช่นกัน)
- มีประโยค using เพื่อใช้จัดการกับ resource ที่เป็นแบบ unmanaged
- รองรับ unsafe code

สังเกตได้ว่า อะไรที่ใน C# มี ซึ่งเป็นสิ่งที่ซับซ้อน ใน VB.Net เวอร์ชันถัดไป ก็จะมีด้วย แต่มักจะถูกนำมาแสดงในรูปแบบที่ง่ายต่อความเข้าใจ แต่อะไรที่ VB.Net มี มักจะไม่ถูกนำไปเพิ่มให้กับ C# เช่นรูปแบบการสร้าง event ที่เรียบง่าย อย่างประโยค Handles หรือคีย์เวิร์ด My ที่จะมีใน VB.Net Whidbey (คิดว่าใน C# อาจจะไม่มี) หรือ Optional argument (ใน C# แก้ปัญหานี้ด้วยการทำ overloading แต่ก็จะไม่สามารถใช้งานร่วมกับ ActiveX component แบบเดิมได้อยู่ดี)

ถ้าขนาดของโปรเจ็กต์ที่คุณคิดว่าจะต้องทำในอนาคตใหญ่มากๆ ก็ควรจะเลือก C# ไปเสียแต่แรกเลย เว้นแต่จะมีวิธีแก้ปัญหา IDE ที่ช้ามากๆ เมื่อมีไฟล์จำนวนมากของ VB.Net ได้

เขาว่าภาษา VB.Net เป็น 4GL (ภาษา Generation ที่สี่) แต่ภาษา C# ถูกวางเป็น 3GL กว่าๆ คือสูงกว่า 3GL เช่น C++ แต่ไม่ถึง 4GL

ถ้าเอาความอย่างที่ Microsoft วาง position ไว้
ภาษา VB .Net เป็น task-oriented
ภาษา C# .Net เป็น code-focused

ถ้าเอามาสร้าง application ทางธุรกิจ ภาษา VB.Net จะเป็นตัวเลือกที่ยอดเยี่ยมอย่างปฏิเสธไม่ได้ เนื่องจากแทนที่โปรแกรมเมอร์จะไม่ต้องคำนึงถึงเรื่องลึกๆ ที่เรียนกันในวิชาของพวก computer science กันบ่อยๆจึงเรียกว่ามี productivity ดี เพราะเอาเวลามาสร้างงานเลย

แต่นั่นก็เป็นอีกเหตุผลหนึ่งว่า ถ้าใช้ C# ศัพท์แสงในเนื้อภาษาจะเป็นศัพท์แบบที่ใช้ในวงการ computer science เช่น abstract, static เป็นต้น ซึ่งจะจำเป็นถ้าต้องมีการใช้เครื่องมืออย่างพวก Rational Rose หรือ Modeling tools อื่นๆ


สิ่งที่รวบรวมมารวมกับความคิดเห็นเพิ่มเติมบางอย่างนี้เข้าไปมีทั้งด้าน รูปแบบภาษา การใช้งานจริง และแฟกเตอร์อื่นๆ อาจจะมีข้อผิดพลาดบ้าง ถ้ามีก็ช่วยบอกเพื่อปรับปรุงเพิ่มเติมต่อไปนะครับ...


Credit: DevStock