ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 9385|ตอบกลับ: 8

[VB.NET] การจัดอันดับ หรือ Ranking ด้วย Linq และ Dictionary Implement

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6585

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6585



บทความนี้แอดมินไปเจอคำถามอยู่ใน StackOverFlow ตัวแอดมินกลับสนใจมันขึ้นมา ก็เลยลองนำมาคิดดู ... การจัดอันดับ (Ranking) ในที่นี้หมายถึงการที่เรารับชุดข้อมูลใดๆเข้ามา ซึ่งอาจจะไม่ใช่ DataBase ที่สามารถ Query และจัดเรียงข้อมูลก่อนนำมาแสดงผล แต่เป็นแหล่งข้อมูลจากที่อื่น เช่น XML หรือ JSON เพื่อทำการคำนวณหาว่าข้อมูลแต่ละชุด ที่อยู่ในแต่ละแถวนั้นอยู่อันดับที่เท่าไหร่ คำนวณได้ทั้งแบบมากไปหาน้อย หรือ น้อยไปหามาก ... โค้ดตัวอย่างแอดมินนำมาให้ได้ศึกษากัน 2 แบบ แบบแรกคือใช้ Linq ส่วนแบบที่ 2 จะใช้ Dictionary ขอให้ทุกๆท่านลองนำมาเปรียบเทียบดูกันเองล่ะกันครับ ... (หมายเหตุ: ที่ต้องเขียนคำอธิบายโค้ดเป็นภาษาอังกฤษ เพราะแอดมินนำไปโพสต์ที่เว็บต่างประเทศครับ) ...

โค้ด Linq Implement ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / Purpose: How to make Ranking in DataGridView with out DataBase.
  8. ' / Microsoft Visual Basic .NET (2010)
  9. ' /
  10. ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------------
  13. Public Class frmRankingDataGrid
  14.     Dim dt As DataTable
  15.     Dim MaxRow As Integer = 9

  16.     Public Sub New()

  17.         ' This call is required by the designer.
  18.         InitializeComponent()

  19.         ' Add any initialization after the InitializeComponent() call.
  20.         Call SetupDGVData()
  21.     End Sub

  22.     ' / --------------------------------------------------------------------------------
  23.     Private Sub btnPopulate_Click(sender As System.Object, e As System.EventArgs) Handles btnProcess.Click
  24.         Call InitGrid()
  25.         Call FillData()
  26.     End Sub

  27.     ' / --------------------------------------------------------------------------------
  28.     '// Initialize DataGridView @Run Time
  29.     Private Sub SetupDGVData()
  30.         With dgvData
  31.             .RowHeadersVisible = False
  32.             .AllowUserToAddRows = False
  33.             .AllowUserToDeleteRows = False
  34.             .AllowUserToResizeRows = False
  35.             .MultiSelect = True
  36.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  37.             .ReadOnly = True
  38.             .Font = New Font("Tahoma", 9)
  39.             .RowHeadersVisible = True
  40.             ' Autosize Column
  41.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  42.             .AutoResizeColumns()
  43.             '// Even-Odd Color
  44.             .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
  45.             ' Adjust Header Styles
  46.             With .ColumnHeadersDefaultCellStyle
  47.                 .BackColor = Color.Navy
  48.                 .ForeColor = Color.Black ' Color.White
  49.                 .Font = New Font("Tahoma", 9, FontStyle.Bold)
  50.             End With
  51.         End With
  52.     End Sub

  53.     Private Sub frmRankingDataGrid_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  54.         Me.Dispose()
  55.         Application.Exit()
  56.     End Sub

  57.     Private Sub frmRankingDataGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  58.         Call InitGrid()
  59.         Call FillData()
  60.     End Sub

  61.     ' / --------------------------------------------------------------------------------
  62.     Private Sub InitGrid()
  63.         dt = New DataTable
  64.         dt.Columns.Add("A", GetType(Double))
  65.         dt.Columns.Add("B", GetType(Double))
  66.         dt.Columns.Add("C", GetType(Double))
  67.         dt.Columns.Add("D", GetType(Double))
  68.         dt.Columns.Add("E", GetType(Double))
  69.         dt.Columns.Add("Average", GetType(Double))
  70.         dt.Columns.Add("Dummy", GetType(Double)) '<-- Visible = False
  71.         dt.Columns.Add("Row") '<-- Visible = False
  72.         dt.Columns.Add("Ranking", GetType(Integer))
  73.         dgvData.DataSource = dt
  74.     End Sub

  75.     ' / --------------------------------------------------------------------------------
  76.     ' / Sample Data
  77.     Private Sub FillData()
  78.         Randomize()
  79.         Dim RandomClass As New Random()
  80.         For i As Integer = 0 To MaxRow
  81.             Dim dr As DataRow = dt.NewRow()
  82.             '// RandomClass.NextDouble(). A double-precision floating point number that is greater than or equal to 0.0, and less than 1.0.
  83.             dr(0) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  84.             dr(1) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  85.             dr(2) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  86.             dr(3) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  87.             dr(4) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  88.             Dim SumCol As Double = 0
  89.             For iCol As Integer = 0 To 4 'MaxCol
  90.                 SumCol = SumCol + dr(iCol)
  91.             Next
  92.             dr(5) = Format(SumCol / 5, "0.00")
  93.             dgvData.DataSource = dt
  94.             '//
  95.             dt.Rows.Add(dr)
  96.         Next
  97.         Try
  98.             '// Create Dictionary with double keys.
  99.             Dim dict As New Dictionary(Of Double, Integer)
  100.             For i As Integer = 0 To MaxRow
  101.                 '// Column index = 6 is dummy to get double value.
  102.                 '// Prevent have some duplicate key.
  103.                 '// Example:
  104.                 '// dgvData.Item(5, i).Value = 44.1 ... but
  105.                 '// CovertDoubleFloat(44.1) = 44.099998474121094
  106.                 dgvData.Item(6, i).Value = CovertDoubleFloat(dgvData.Item(5, i).Value).ToString("G15")
  107.                 dict.Add(dgvData.Item(6, i).Value, i)
  108.             Next
  109.             ' Get list of keys.
  110.             Dim keys As List(Of Double) = dict.Keys.ToList
  111.             ' Sort the keys Accesending. (A -> Z)
  112.             keys.Sort()
  113.             ' Descending Z -> A
  114.             keys.Reverse()
  115.             ' Loop over the sorted keys.
  116.             Dim dVal As Double
  117.             Dim Count As Integer = 0
  118.             For Each dVal In keys
  119.                 'MsgBox(dVal & " - " & dict.Item(dVal))
  120.                 dgvData.Item(6, Count).Value = dVal
  121.                 dgvData.Item(7, Count).Value = dict.Item(dVal)
  122.                 Count += 1
  123.             Next
  124.             '// Hidden column
  125.             dgvData.Columns(6).Visible = False
  126.             dgvData.Columns(7).Visible = False
  127.             '// Change position for Ranking.
  128.             For iSource As Integer = 0 To MaxRow
  129.                 For iDest As Integer = 0 To MaxRow
  130.                     If dgvData.Item(7, iSource).Value = iDest Then
  131.                         dgvData.Item(8, iDest).Value = iSource + 1
  132.                         Exit For
  133.                     End If
  134.                 Next
  135.             Next

  136.         Catch ex As Exception
  137.             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
  138.         End Try
  139.     End Sub

  140.     ' / --------------------------------------------------------------------------------
  141.     '// https://msdn.microsoft.com/en-us/library/kc01y017(v=vs.110).aspx
  142.     Public Function CovertDoubleFloat(ByVal doubleVal As Double) As Double
  143.         Dim singleVal As Single = 0
  144.         ' Double to Single conversion cannot overflow.
  145.         singleVal = System.Convert.ToSingle(doubleVal)
  146.         ' Conversion from Single to Double cannot overflow.
  147.         CovertDoubleFloat = System.Convert.ToDouble(singleVal)
  148.     End Function

  149.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  150.         Me.Close()
  151.     End Sub

  152. End Class
คัดลอกไปที่คลิปบอร์ด

โค้ด Dictionary Implement ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / Purpose: How to make Ranking in DataGridView with Dictionary.
  8. ' / Microsoft Visual Basic .NET (2010)
  9. ' /
  10. ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------------
  13. Public Class frmRankingDictionary
  14.     Dim dt As DataTable
  15.     Dim MaxRow As Integer = 9

  16.     ' / --------------------------------------------------------------------------------
  17.     Private Sub btnPopulate_Click(sender As System.Object, e As System.EventArgs) Handles btnProcess.Click
  18.         Call InitGrid()
  19.         Call FillData()
  20.     End Sub

  21.     ' / --------------------------------------------------------------------------------
  22.     '// Initialize DataGridView @Run Time
  23.     Private Sub SetupDGVData()
  24.         With dgvData
  25.             .RowHeadersVisible = False
  26.             .AllowUserToAddRows = False
  27.             .AllowUserToDeleteRows = False
  28.             .AllowUserToResizeRows = False
  29.             .MultiSelect = True
  30.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  31.             .ReadOnly = True
  32.             .Font = New Font("Tahoma", 9)
  33.             ' Autosize Column
  34.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  35.             .AutoResizeColumns()
  36.             '// Even-Odd Color
  37.             .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
  38.             ' Adjust Header Styles
  39.             With .ColumnHeadersDefaultCellStyle
  40.                 .BackColor = Color.Navy
  41.                 .ForeColor = Color.Black ' Color.White
  42.                 .Font = New Font("Tahoma", 9, FontStyle.Bold)
  43.             End With
  44.         End With
  45.     End Sub

  46.     ' / --------------------------------------------------------------------------------
  47.     ' / Sample Data
  48.     Private Sub FillData()
  49.         Randomize()
  50.         Dim RandomClass As New Random()
  51.         For i As Integer = 0 To MaxRow
  52.             Dim dr As DataRow = dt.NewRow()
  53.             dr(0) = i + 1
  54.             '// RandomClass.Next(0, 99) Random integer value between 0 - 99.
  55.             '// RandomClass.NextDouble(). A double-precision floating point number that is greater than or equal to 0.0, and less than 1.0.
  56.             dr(1) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  57.             dr(2) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  58.             dr(3) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  59.             dr(4) = RandomClass.Next(0, 99) + Format(RandomClass.NextDouble(), "0.0")
  60.             Dim SumCol As Double = 0
  61.             For iCol As Integer = 1 To 4 'MaxCol
  62.                 SumCol = SumCol + dr(iCol)
  63.             Next
  64.             dr(5) = Format(SumCol / 4, "0.00")
  65.             dgvData.DataSource = dt
  66.             '//
  67.             dt.Rows.Add(dr)
  68.         Next
  69.         Try
  70.             '// Dictionary. This collection allows fast key lookups. A generic type, it can use any types for its keys and values.
  71.             '// Important: Dictionary can't have the duplicate key.
  72.             '//
  73.             '// Create Dictionary with double keys.
  74.             Dim dict As New Dictionary(Of Double, Integer)
  75.             '// Key and Value Pairs for Dummies.
  76.             For i As Integer = 0 To MaxRow
  77.                 '// Column index = 6 is dummy to get double value.
  78.                 dgvData.Item(6, i).Value = dgvData.Item(5, i).Value
  79.                 '// Key, Value
  80.                 dict.Add(dgvData.Item(6, i).Value, i)
  81.             Next
  82.             '/ Get list of keys.
  83.             Dim keys As List(Of Double) = dict.Keys.ToList
  84.             '/ Sort the keys ascending. (A -> Z)
  85.             keys.Sort()
  86.             '/ Descending Z -> A
  87.             keys.Reverse()
  88.             '//
  89.             Dim dVal As Double
  90.             Dim Count As Integer = 0
  91.             '/ Loop over the sorted keys.
  92.             For Each dVal In keys
  93.                 dgvData.Item(6, Count).Value = dVal
  94.                 dgvData.Item(7, Count).Value = dict.Item(dVal)
  95.                 Count += 1
  96.             Next
  97.             '// Hidden column
  98.             dgvData.Columns(6).Visible = False
  99.             dgvData.Columns(7).Visible = False
  100.             '// Change position for Ranking.
  101.             For iSource As Integer = 0 To MaxRow
  102.                 For iDest As Integer = 0 To MaxRow
  103.                     If dgvData.Item(7, iSource).Value = iDest Then
  104.                         dgvData.Item(8, iDest).Value = iSource + 1
  105.                         Exit For
  106.                     End If
  107.                 Next
  108.             Next

  109.         Catch ex As Exception
  110.             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
  111.         End Try
  112.     End Sub

  113.     Private Sub frmRankingDictionary_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  114.         Call SetupDGVData()
  115.         Call InitGrid()
  116.         Call FillData()
  117.     End Sub

  118.     Private Sub InitGrid()
  119.         '//
  120.         dt = New DataTable
  121.         dt.Columns.Add("#Row", GetType(String))
  122.         '// Define input with integer type.
  123.         dt.Columns.Add("A", GetType(Double))
  124.         dt.Columns.Add("B", GetType(Double))
  125.         dt.Columns.Add("C", GetType(Double))
  126.         dt.Columns.Add("D", GetType(Double))
  127.         dt.Columns.Add("Average", GetType(Double))
  128.         dt.Columns.Add("Dummies", GetType(Double)) '<-- Visible = False
  129.         dt.Columns.Add("Row") '<-- Visible = False
  130.         dt.Columns.Add("Ranking", GetType(Integer))
  131.         dgvData.DataSource = dt
  132.     End Sub

  133.     Private Sub frmRankingDictionary_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  134.         Me.Dispose()
  135.         Application.Exit()
  136.     End Sub

  137.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  138.         Me.Close()
  139.     End Sub

  140. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

3

กระทู้

17

โพสต์

265

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
265
โพสต์ 2019-1-21 13:07:06 | ดูโพสต์ทั้งหมด

Admin ครับ รบกวนถามหน่อยครับ พอดีจะ ศึกษาเรื่อง Vb2010 With Excel พอมีตัวอย่างให้ศึกษาไหมครับ
ขอบคุณร่วงหน้าครับ

320

กระทู้

512

โพสต์

6585

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6585
 เจ้าของ| โพสต์ 2019-1-21 13:43:53 | ดูโพสต์ทั้งหมด

anuyut1995 ตอบกลับเมื่อ 2019-1-21 13:07
Admin ครับ รบกวนถามหน่อยครับ พอดีจะ ศึกษาเรื่อง Vb2010 With Ex ...

[VB.NET] การนำไฟล์ MS Excel มาทำงานเป็นเหมือนฐานข้อมูล (DataBase Excel) ...
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

3

กระทู้

17

โพสต์

265

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
265
โพสต์ 2019-1-21 15:19:52 | ดูโพสต์ทั้งหมด

Admin ครับ ขอสอบถามอีก นิดดดดด นึงครับ แบบที่ Admin ส่งมาให้ เป็นการ เชื่อมต่อกับ เพิ่ม ขอรบกวน การ ลบ อีกหน่อยได้ไหมครับ
ขอบคุณร่วงหน้าครับ ขอบคุณความรู้ดีๆนะครับ

11

กระทู้

31

โพสต์

437

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

เครดิต
437
โพสต์ 2019-1-21 15:51:42 | ดูโพสต์ทั้งหมด

แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2019-1-21 16:01
anuyut1995 ตอบกลับเมื่อ 2019-1-21 15:19
Admin ครับ ขอสอบถามอีก นิดดดดด นึงครับ แบบที่ Admin ส่งมาใ ...

ท่านลองประยุกต์ดูครับ
โค้ดของอาจารย์ ทำเชื่อมต่อไว้ให้แล้ว มีตัวอย่าง Insert แล้ว
เหลือแค่ท่านลองแค่เปลี่ยน คำสั่ง SQL command เท่านั้น

DELETE FROM [MySheet$] WHERE condition
หรือถ้าต้องการจัดการข้อมูลใน Sheet (Range / Cell value / Formular / Chart)
ผมได้ทำตัวอย่างไว้แล้วที่
[VB.NET] การ Export ข้อมูลจาก Datagridview ไป Excel file (แบบใส่ไข่)
http://www.g2gnet.com/webboard/forum.php?mod=viewthread&tid=80&extra=page%3D3

3

กระทู้

17

โพสต์

265

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
265
โพสต์ 2019-1-21 16:16:01 | ดูโพสต์ทั้งหมด

ผมลองมาหลายวันแล้วก็ยังไม่ได้นะครับ ติดเริ่องการลบ พาชี้ทางให้เด็กเดินหน่อยได้ไหมครับ

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x

11

กระทู้

31

โพสต์

437

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

เครดิต
437
โพสต์ 2019-1-21 17:01:57 | ดูโพสต์ทั้งหมด

anuyut1995 ตอบกลับเมื่อ 2019-1-21 16:16
ผมลองมาหลายวันแล้วก็ยังไม่ได้นะครับ ติดเริ่องการลบ พาชี้ทางให้เด็กเดินหน่อยได้ไหมครับ

ก่อนอื่น ผมต้องขออภัยครับ ที่ไม่ได้หาข้อมูลเพิ่มก่อนตอบ
เบื้องต้นสรุปคร่าว ๆ คือ การเชื่อมต่อไฟล์ Excel ผ่านทาง OLEDBสามารถทำได้เพียง INSERT & UPDATE เท่านั้นไม่สามารถ DELETE ได้



หากต้องการลบแถวต้องวิธีทำผ่านทาง Library Excel interop แทน

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x

3

กระทู้

17

โพสต์

265

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
265
โพสต์ 2019-1-22 07:58:40 | ดูโพสต์ทั้งหมด

พอมีวิธีอื่น บ้างไหมครับ ช่วยแนะนำหน่อยครับ

11

กระทู้

31

โพสต์

437

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

เครดิต
437
โพสต์ 2019-1-22 10:02:38 | ดูโพสต์ทั้งหมด

แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2019-1-22 10:08
anuyut1995 ตอบกลับเมื่อ 2019-1-22 07:58
พอมีวิธีอื่น บ้างไหมครับ ช่วยแนะนำหน่อยครับ

ท่านลองไปดูเนื้อหาของ Library ดังต่อไปนี้ ผมให้ไป 2 ตัว ท่านสามารถเลือกใช้ตัวใดตัวหนึ่งก็ได้ สามารถเข้าถึงจัดการไฟล์ Excel ได้เหมือนกัน
Microsoft.Office.Interop.Excel หรือ EPPlus

การลบแถวโดยตรงเมื่อเข้าถึง Sheet ข้อมูล ผ่าน Library
1. แล้วก็ Loop หาข้อมูล พอเจอข้อมูลก็ลบแถวออก
2. หลังจากลบแถวออก สั่งบันทึกไฟล์อีกครั้ง ก่อนปิดไฟล์ Excel
(ข้อนี้ผมไม่รู้ว่า Performance จะช้าหรือเร็ว ขึ้นอยู่กับข้อมูล)

จากโค้ดข้างล่างนี้ผมลองทำตัวอย่างมาให้ดูในการหา Rows Index ของ Excel ผ่าน DataSet (ที่ได้ทำสำเนาข้อมูลจากไฟล์ Excel มาเก็บใน DataSet)
ท่านสามารถนำไปเขียนต่อยอด โดยการ Loop หรือ ใช้ LinQ (SQL WHERE Clause) ผ่าน DataSet เพื่อเก็บ Rows Index ของ Excel ที่ต้องการลบ
แล้วสั่งการลบผ่าน Library Microsoft.Office.Interop.Excel หรือ EPPlus

จากนี้ท่านคงเห็นแล้วนะครับ สามารถลบได้แต่ Performance สู้ Database โดยตรงไม่ได้ เพราะต้องทำขั้นตอนมากกว่า

ตัวอย่างโค้ดเป็นเพียงการ หา Rows Index จากไฟล์ Excel เท่านั้น
  1. Dim Conn As New OleDbConnection
  2.         Conn.ConnectionString = CreateConnString(MyPath(Application.StartupPath) + "Book1.xls")

  3.         Dim strSQL As String = "SELECT * FROM [MySheet$] "
  4.         Dim DA = New OleDbDataAdapter(strSQL, Conn)

  5.         Try
  6.             Conn.Open()
  7.             Dim DS = New DataSet
  8.             DS.Clear()
  9.             DA.Fill(DS, "MySheet")
  10.             Conn.Close()

  11.             '// Clear screen
  12.             Call ClearScreen()

  13.             Dim msg As String
  14.             msg = String.Empty

  15.             If Not DS.Tables("MySheet").Rows.Count = 0 Then

  16.                 For Each dr As DataRow In DS.Tables(0).Rows

  17.                     msg += dr("MemberID").ToString() & " " _
  18.                            & dr("Firstname").ToString() & " " _
  19.                            & dr("Lastname").ToString() & " " _
  20.                            & dr("MemberShip").ToString() & " " _
  21.                            & DS.Tables(0).Rows.IndexOf(dr) + 2 _
  22.                            & vbNewLine

  23.                 Next

  24.                 MessageBox.Show(msg)

  25.             End If

  26.         Catch ex As Exception
  27.             MsgBox("Error: " & ex.Message)
  28.             Conn.Close()
  29.         End Try
คัดลอกไปที่คลิปบอร์ด


ตัวอย่างโค้ดที่รันออกมา MessageBox ที่ผมวงสีเขียวคือ ค่า Rows Index ที่จะใช้อ้างอิงในการลบแถวผ่าน Library ที่ผมได้ให้ไปครับ


อย่างที่อาจารย์ได้บอกไว้ Excel มันก็สามารถทำฐานข้อมูลได้ แต่มันก็มีข้อจำกัดในการใช้งานเหมือนกัน
MS- Excel สามารถทำได้ในรูปแบบ MS-Word หรือ MS-Access แต่ไม่เก่งเท่า MS-Access ในด้านฐานข้อมูล สุดท้่ายอยู่ที่ท่านจะเลือกใช้อะไรในการเก็บ
ส่วนตัวผมใช้ MS-Excel ในการ Import/Export และสร้าง Report เท่านั้น ส่วนฐานข้อมูลก็ต้องยกหน้าที่ให้ MS-Access หรือ Database ตัวอื่น ๆ

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x

3

กระทู้

17

โพสต์

265

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
265
โพสต์ 2019-1-22 10:36:06 | ดูโพสต์ทั้งหมด

ขอบคุณครับสำหรับความรู้
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-28 03:28 , Processed in 0.952922 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้