วันพฤหัสบดีที่ 28 พฤษภาคม พ.ศ. 2552

การเขียนและอ่านข้อมูลใน Excel โดยใช้ C#

ในตัวอย่างนี้จะสร้างเอกสารไฟล์ Excel แล้วใส่ข้อมูลลงไป หลังจากนั้นจะอ่านข้อมูลในเอกสาร Excel แล้วแสดงข้อความเป็น MessageBox

เตรียมการ
1. เปิด Project ใหม่แล้ววางปุ่มบนฟอร์ม
2. ใส่ Code ต่อไปนี้

private void button1_Click(object sender, EventArgs e)
{
   //ช่วงที่ 1 เตรียมสร้างเอกสาร
   object missing = System.Reflection.Missing.Value;
   Excel.Application exApp = new Excel.ApplicationClass();
   exApp.Visible = true;

   Excel.Workbook exBook = exApp.Workbooks.Add(missing);
   Excel.Worksheet exSheet = (Excel.Worksheet)exBook.Sheets["Sheet1"];
   exSheet.Name = "Example";

   //ช่วงที่ 2 เขียนข้อมูลลงไฟล์ Excel
   exSheet.Cells[1, 1] = "TEST";
   exSheet.Cells[1, 2] = "ABCD";

   //ช่วงที่ 3 อ่านข้อมูลจากเอกสาร Excel สามารถเขียนได้สองแบบ
   MessageBox.Show((string)((Excel.Range)exSheet.Cells[1,2]).Text);
   MessageBox.Show(exSheet.get_Range("A1", "A1").Value2.ToString());

}

3. ทดสอบโปรแกรม

วันพุธที่ 25 มีนาคม พ.ศ. 2552

การแก้ปัญหาเรื่องรูปแบบวันใน .Net

ปัญหาพบบ่อยในการจัดการวันเวลาที่พบคือ
1. ปัญหา พ.ศ. กับ ค.ศ.
2. รูปแบบวันที่ระหว่างฐานข้อมูลกับตัว Windows ไม่ตรงกัน เช่น ใน MySQL รูปแบบ Default คือ yyyy-mm-dd ส่วนใน Windows คือ dd/mm/yyyy (ขึ้นอยู่กับการกำหนดค่าใน windows)

สำหรับการแก้ปัญหาในเรื่องดังกล่าวทำได้โดย

ปัญหา พ.ศ. กับ ค.ศ.
ปัญหานี้แก้โดยกำหนด CultureInfo ให้เป็นรูปแบบที่ต้องการเช่น หากต้องการเปลี่ยนรูปแบบให้เป็น ค.ศ ก็ให้กำหนดค่าเป็น "en-US"
ตัวอย่าง Code

using System.Globalization;
.....

DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
Console.WriteLine(DateTime.Now.ToString(myDTFI));

ปัญหารูปแบบวันไม่ตรงตามที่ต้องการ
ปัญหานี้แก้โดยกำหนดรูปแบบวันตามที่ต้องการในขณะแปลงเป็นข้อความ
ตัวอย่าง Code

Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd", myDTFI));

จากตัวอย่างข้างต้น เมื่อใช้รวมกัน จะพิมพ์ข้อความออกมาในรูปแบบดังนี้
เช่น วันที่ 16 มกราคม พ.ศ. 2552 วันนี้พิมพ์ออกมาจะได้

2009-01-16

วันอาทิตย์ที่ 15 มีนาคม พ.ศ. 2552

เทคนิคการควบคุมคอนโทลหลายๆ ตัวในเวลาเดียวกัน

เวลาจะ Disable หรือ Enable คอนโทลในฟอร์ม จะใช้ควบคุมผ่าน Property ที่ชื่อว่า Enable โดยการสั่งงานไปยังคอนโทลแต่ละตัวโดยตรง แต่หากในฟอร์มนั้นมีคอนโทลเยอะๆ การเขียนโปรแกรมเพื่อที่จะปิดเปิดหลายๆ ตัวในเวลาเดียวกันเป็นเรื่องที่ลำบากพอสมควร ยิ่งหากมีการปรับเปลี่ยนคอนโทลภายในฟอร์มในขณะทำงานจริงด้วยแล้วยิ่งปวดหัวใหญ่
เทคนิคง่ายๆ ที่ใช้ควบคุมฟอร์มคือการใช้ Property ที่ชื่อว่า tag ซึ่งอยู่ภายในคอนโทลทุกตัวแล้ว มีขั้นตอนดังนี้

1. กำหนดค่าภายใน tag ที่เราต้องการควบคุม เช่น ใส่คำว่า lock ลงใน Property นั้น
2. ทำการควบคุมคอนโทลโดยใช้เงื่อนไขตรวจสอบว่า tag นั้นเป็น string ที่มีค่าตามที่เรากำหนดไว้รึเปล่า ในที่นี้กำหนดค่าคือ lock โดยใช้ code ควบคุมดังนี้

foreach(Control ctrl in this.Controls)
{
    if((ctrl.Tag as string) == "lock")
    {
        ctrl.Enabled = true;
    }
}


หรืออาจจะเขียนเป็นฟังก์ชั่นไว้ใช้ก็สะดวกดี เช่น

private void disableForm(bool status)
{
    foreach(Control ctrl in this.Controls)
    {
        if(ctrl.Tag as string) == "lock")
        {
            ctrl.Enabled = status;
        }
    }
}