อยากรู้ว่าในหนึ่งเดือนมีกี่สัปดาห์จะทำอย่างไร

 หากว่าเราต้องการหาว่า 

" เดือนนี้มีกี่สัปดาห์ และ แต่ละสัปดาห์เริ่มตั้งแต่ไหนถึงวันไหน เราสามารถทำได้ครับ "

    DateTime dt = new DateTime(2022,10,1);

    System.Globalization.Calendar mycal = CultureInfo.CurrentCulture.Calendar;

    IEnumerable<int> daysInMonth = Enumerable.Range(1, mycal.GetDaysInMonth(dt.Year, dt.Month));

    List<Tuple<DateTime, DateTime>> weeks = daysInMonth.Select(day => new DateTime(dt.Year, dt.Month, day))

                .GroupBy(d => mycal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday))

                .Select(g => new Tuple<DateTime, DateTime>(g.First(), g.Last()))

                .ToList();

    int i = 1;
   foreach (Tuple<DateTime, DateTime> w in weeks)
   {
          string week = "สัปดาหที่ " + i + "( " + String.Format("{0:dd/MM/yyyy} - {1:dd/MM/yyyy}", w.Item1, w.Item2) + ")";
         Console.WriteLine(week);
         i++;
   }


output




การ Export DataGridView to Excel File อย่างง่าย

คราวนี้จะแนะนำเทคนิค การ Export To Excel File โดยใช้  Library ของ Microsoft.Office.Interop.Excel  โดยมีแนวทางดังนี้ 
1. ต้องมี ไฟล์  Microsoft.Office.Interop.Excel.dll
อาจหา download จากอินเตอร์เน็ตได้ครับ หรือ อาจจะเอาจาก C:\Program Files (x86)\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office14 ก็ได้ (ตัวอย่าง)
2. จากนั้นให้นำเข้า Project ของเรา 
3. เตรียมข้อมูลและ set ให้  DataGridView

DataTable table1 = new DataTable();

table1.Columns.Add("Code", typeof(string));
table1.Columns.Add("Name", typeof(string));
table1.Columns.Add("Price", typeof(string));
table1.Columns.Add("CreateDate", typeof(DateTime));

table1.Rows.Add("001", "ผงซักฟอก", 100.0, DateTime.Now);
table1.Rows.Add("002", "มาม่า", 5.5, DateTime.Now);
table1.Rows.Add("003", "น้ำตาลทราย", 30.5, DateTime.Now);
table1.Rows.Add("004", "น้ำปลาแท้", 40.0, DateTime.Now);
table1.Rows.Add("005", "กระดาษชำระ", 15.5, DateTime.Now);

dataGridView1.DataSource = table1;

4. กำหนด Event Click ให้กับปุ่ม [Export]  เขียน Code ดังนี้ 
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook ExcelBook;
Microsoft.Office.Interop.Excel._Worksheet ExcelSheet;

int i = 0;
int j = 0;

//create object of excel
ExcelBook = (Microsoft.Office.Interop.Excel._Workbook)ExcelApp.Workbooks.Add(1);
ExcelSheet = (Microsoft.Office.Interop.Excel._Worksheet)ExcelBook.ActiveSheet;
          
// header
for (i = 1; i <= this.dataGridView1.Columns.Count; i++)
{
     ExcelSheet.Cells[1, i] = this.dataGridView1.Columns[i - 1].HeaderText;
 }

 // data
 for (i = 1; i <= this.dataGridView1.RowCount; i++)
 {
      for (j = 1; j <= dataGridView1.Columns.Count; j++)
      {
          ExcelSheet.Cells[i + 1, j] = dataGridView1.Rows[i - 1].Cells[j - 1].Value;
       }
  }

 ExcelApp.Visible = true;
 ExcelSheet = null;
 ExcelBook = null;
 ExcelApp = null;




5. ทดสอบโดยการกดปุ่ม [Export]


เพียงเท่านี้ครับก็สามารถ Export ข้อมูลออก Excel ได้แล้ว  สามารถนำไปประยุกต์ใช้งานต่อได้ครับ ...

การกำหนดให้ DataGridview มี Column เป็นประเภท CheckBox ผ่าน DataTable

ปกติเราสามารถให้ DataGridview ของเรามี Column เป็นประเภท  Checkbox ได้โดยการกำหนดใน DataGridView Tasks ได้เลย
แต่คราวนี้เราจะมากำหนดโดยใช้ DataTable กันครับ   โดย
     1.   สร้าง DataTable แล้วกำหนด column
DataTable table = new DataTable();

table.Columns.Add("Checked", typeof(bool));
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Code", typeof(string));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Price", typeof(string));
table.Columns.Add("CreateDate", typeof(DateTime));
   โดยกำหนดประเภท Column ใน DataTable

2.  Set ข้อมูลเข้า DataTable
table.Rows.Add(true, 1, "001", "ผงซักฟอก",100.0, DateTime.Now);
table.Rows.Add(true, 2, "002", "มาม่า",5.5, DateTime.Now);
table.Rows.Add(false, 3, "003", "น้ำตาลทราย",30.5, DateTime.Now);
table.Rows.Add(true, 4, "004", "น้ำปลาแท้",40.0, DateTime.Now);
   table.Rows.Add(false, 5, "005", "กระดาษชำระ",15.5, DateTime.Now);

3.   กำหนดข้อมูลให้กับ DataGridView

dataGridView1.DataSource = table;


เพียงเท่านี้ก็สามารถกำหนดให้ DataGridView ของท่านมี Column เป็นประเภท Checkbox ได้แล้ว  

การรวม DataTable ให้เป็นข้อมูลเดียวกัน

บางครั้งเรามีข้อมูลอยู่ 2 ชุด เราต้องการรวม  2 ชุดเข้าด้วยกัน (ให้เป็นข้อมูลเดียวกัน) เพื่อให้เป็นการไม่เสียเวลาในการทำงานครับ แนวทางที่จะแนะนำมีดังนี้
สมมุติมีข้อมูลอยู่ 2 ชุด  คือ
ชุดที่  1
// datatable 1
DataTable table1 = new DataTable();

table1.Columns.Add("Code", typeof(string));
table1.Columns.Add("Name", typeof(string));
table1.Columns.Add("Price", typeof(string));
table1.Columns.Add("CreateDate", typeof(DateTime));

table1.Rows.Add("001", "ผงซักฟอก", 100.0, DateTime.Now);
table1.Rows.Add("002", "มาม่า", 5.5, DateTime.Now);
ชุดที่  2
// datatable 2
DataTable table2 = new DataTable();

table2.Columns.Add("Code", typeof(string));
table2.Columns.Add("Name", typeof(string));
table2.Columns.Add("Price", typeof(string));
table2.Columns.Add("CreateDate", typeof(DateTime));

table2.Rows.Add("003", "น้ำตาลทราย", 30.5, DateTime.Now);
table2.Rows.Add("004", "น้ำปลาแท้", 40.0, DateTime.Now);
table2.Rows.Add("005", "กระดาษชำระ", 15.5, DateTime.Now);

* บางคนใช้วิธี
foreach(DataRow drw in table2.rows)  เพื่อมาเพิ่มใน  table1  (ซึ่งเป็นวิธีที่ไม่ควรเท่าไหร่นัก)
การรวมข้อมูลเข้าด้วยกันง่าย ๆครับ คือ
// รวม datatable 1 + datatable 2
table1.Merge(table2);
เพียงเท่านี้เราก็จะได้ข้อมูลเป็นชุดเดียวแล้ว สามารถนำไปใช้ได้เลย 

dataGridView1.DataSource = table1;


เทคนิคการตัดข้อความด้วย Split แบบไม่ง้อ System.Text.RegularExpressions

หลายคนยังใช้การตัดข้อความผ่าน  System.Text.RegularExpressions
 เช่น
  string[] arr = Regex.Split(str,",");

  ปัญหาอย่างหนึ่งคือ Library ตัวนี้ไม่สามารถใช้ได้เลยที่เดียวต้องทำการนำเข้าผ่าน  using  หรือ import ก่อน ทำให้เสียเวลาในการเขียนโปรแกรมที่ต้องมาคอย นำเข้า (แต่ถ้านำแล้วก็ไม่ต้องนำเข้าอีก)
                คราวนี้มีแนวทางที่ไม่ต้องง้อ System.Text.RegularExpressions ครับ คือการใช้  Split นั้นเอง ลงดูตัวอย่างด้านล่างนี้

            string str = "ข้อความ 1,ข้อความ 2,ข้อความ 3,ข้อความ 4,ข้อความ 5";
            string[] myArr = str.Split(',');
         
         
            foreach (string list in myArr)
            {
               this.listBox1.Items.Add(list);   
            }



สามารถใช้ได้เลยโดยไม่ต้องใช้  System.Text.RegularExpressions

เปลี่ยน พ.ศ. และ ค.ศ. ด้วย CultureInfo

สำหรับโปรแกรมเมอร์มือใหม่อาจจะเจอกับปัญหาที่ว่า เวลาที่รันโปรแกรมในเครื่องเราสามารถ insert ,update ได้ปรกติ แต่เวลาไปติดตั้งเครื่องลูกค้าแล้วทำไมไม่สามารถ insert หรือ update เข้าในฐานข้อมูลได้หละ   
                ปัญหาอย่างหนึ่งคือรูปแบบวันที่ผิดครับ ระหว่าง พ.ศ. กับ ค.ศ. ซึ่งบางครั้งเครื่องลูกค้าอาจไม่ได้ set รูปแบบวันที่ให้เป็นเหมือนเครื่องของเราจึงทำให้เกิดปัญหาดังที่ได้กล่าวมาข้างต้นนี้
                วันนี้จะมาแนะนำวิธีการเปลี่ยน พ.ศ. และ ค.ศ. ด้วย  CultureInfo  ครับ ซึ่งเป็น Base Class Library ของ .net Framework  เรามาเริ่มต้นกันเลยครับ

         1.       ต้องทำการเรียกใช้ Base Class Library ของ .net Framework ก่อนครับ
using System.Globalization;

2.      จากนั้นก็ใช้ได้แบบง่าย ๆเลย 

label1.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss",new CultureInfo("en-US"));

label2.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss",new CultureInfo("th-TH"));

                                                                                                        
                                                                         



เป็นเทคนิคเล็กๆ น้อย ๆ สำหรับโปรแกรมเมอร์มือเก่าและมือใหม่สามารถนำไปประยุกต์ใช้ได้ครับ...