 |
|
[ปรึกษา] เรื่อง Array ใน VB ครับ (ถ้าผมถามมากเกินไปอย่าพึ่งว่าผมนะ) |
|
 |
|
|
 |
 |
|
1.โค๊ดที่เขียนถูกแล้วครับ ลองเอา err ออกมาให้ดู
ปล.กะลังหลงประเด็นรึป่าว สิ่งที่อยากได้มันคือการ convert datatable เป็น array ไม่ใช่เหรอ
กระทู้เก่าเหมือนจะมีคนเีขยนโค๊ดให้ไปแล้วนิ ผมลองใช้ดูก็ใช้ได้อยู่
ลองใช้คำค้น convert datatable to array ดูมีเยอะครับ
https://www.google.co.th/search?q=vb.net+convert+datatable+to+array+&ie=utf-8&oe=utf-8&gws_rd=cr&ei=ySeaVJuaIMOsuQSvr4CoCg
2. => คือ Lambda Expressions
https://www.thaicreate.com/dotnet/forum/113121.html
3.เป็นประเด็นหลักของงานนี้ครับ ตามที่คุณ Furikuri บอกเลย convert datatable เป็น array ง่ายสุด
4. =>2.
ลองดูกระทู้เก่าของคุณดูครับใช้ตัวนั้นแหละ
ใจความสำคัญครับ
1. เราไม่ควรเอาปัญหาหนึ่งมาเพิ่มให้กับอีกปัญหาครับ เหมือนว่าเราแค่ต้องการใช้ datatable แบบ array เราก็ควรมุ่งไปที่การใช้ datatable แบบ array ไม่ใช่ที่ array ไม่งั้นเราก็จะเจอปัญหาดังที่เป็นอยู่ครับ
2. เมื่อเราเจอปัญหาเกี่ยวกับการเขียนโปรแกรมลองใช้วิธีส่งค่าขึ้นมาดูแต่ละขั้นตอนครับง่ายสุดคือ messagebox ค่าต่างๆว่าได้ตามท่เราต้องการไม๊มันจะช่วยให้เราเห็นความผิดพลาดรายย่อยได้
3. การจับประเด็นของปัญหาต้องแยกแยะปัญหาหลักปัญหารองครับแล้วค่อยๆมองทีละปลีกย่อยบางทีปัญหามันอาจจะไม่ใช่ปัญหาตามที่เราให้เป็นก็ได้
4. ถ้าได้ข้อมูลจากเว็บหรือที่อื่นมา แนะนำให้ทำตามเปะๆก่อนอย่าเพิ่งไปดัดแปลงเราจะได้สอบกลับได้ว่าเราทำถูก(ถ้าพูดตามภาษานักวิทย์อย่างผมก็คง Traceability )
แค่นี้ก็สามารถเขียนโปรแกรมต่อได้อย่างราบรื่นแล้วละครับ 5555
ผมเห็นว่าค้างอยู่ที่ปัญหานี้นานเกินก็เลยแนะนำ ไม่ว่ากันนะครับ
|
 |
 |
 |
 |
Date :
2014-12-24 09:57:48 |
By :
lamaka.tor |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ครับผม ตอนนี้ แก้ไป แก้มามันก็ใช้งานได้แล้วครับ...... แล้วก็ได้ความรู้ดีๆอีกเยอะเลย ขอบคุณมากๆครับ
สุดท้าย ผมขอถามอีกข้อว่า สมมติโค้ดประมาณด้านล่างครับ
Plublic Class Form1
Dim a As String = 5
private sub Form1_Load .......
Dim a = 1
End Sub
private sub btn1_Click .......
MsgBox(a)
End Sub
End Class
พอสั่งเปลี่ยนค่า a แล้วค่า a ไม่เปลี่ยนค่าตามครับ สาเหตุนี้เกิดจากอะไร และแก้ไขอย่างไรดีครับ
|
 |
 |
 |
 |
Date :
2014-12-24 18:33:41 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอโทษครับ ผมพิมพ์ผิด ไม่ได้ประกาศใหม่ครับ ที่จริงจะเป็น a = 1 เลย อันนี้ปัญหาจาก โค้ดจริงๆครับ อต่ผมย่อคำสั่ง Select ลง เพราะยาวมาก
Code
Public Class Form1
Dim objConn As New SqlConnection
Dim strConnString As String
Dim Arr As Integer
Dim Tcode(Arr) As String
Dim Tname(Arr) As String
Dim Tsub(Arr) As String
Dim Tprice(Arr) As String
Private Sub p_product()
Dim objCmd As SqlCommand
Dim strSQL As String
Dim dtAdapter As SqlDataAdapter
Dim dt As New DataTable
Dim i As Integer
Try
strSQL = "SELECT "
strSQL += "* "
strSQL += "FROM t_product"
dtAdapter = New SqlDataAdapter(strSQL, objConn)
dtAdapter.Fill(dt)
Arr = dt.Rows.Count
objCmd = New SqlCommand(strSQL, objConn)
Dim sqlReader As SqlDataReader = objCmd.ExecuteReader()
While sqlReader.Read()
Tcode(i) = sqlReader.Item(0)
Tname(i) = sqlReader.Item(1)
Tsub(i) = sqlReader.Item(2)
Tprice(i) = sqlReader.Item(3)
i += 1
End While
sqlReader.Close()
p_count()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
พอ Run มันจะเกิด Error ว่า Out of... อะไรสักอย่างครับ
|
 |
 |
 |
 |
Date :
2014-12-24 23:18:28 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แนะนำให้ใช้ DataTable ในการเก็บข้อมูลแทน Array นะครับ
|
 |
 |
 |
 |
Date :
2014-12-25 10:18:57 |
By :
deksoke |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
https://www.thaicreate.com/asp.net/asp.net-datalist-control-dataset-datatable-tablerows.html
ให้ลองไปอ่านนี้ดูครับ
ส่วนโค้ดผมแปลงนิดหน่อยก็จะได้ประมาณนี้
Code (VB.NET)
Public Class Form1
Dim objConn As New SqlConnection
Dim strConnString As String
Public Function getProduct() as DataTable
Dim objCmd As SqlCommand
Dim strSQL As String
Dim dtAdapter As SqlDataAdapter
Dim dt As New DataTable
Try
strSQL = "SELECT "
strSQL &= "* "
strSQL &= "FROM t_product"
dtAdapter = New SqlDataAdapter(strSQL, objConn)
dtAdapter.Fill(dt)
return dt
Catch ex As Exception
throw ex
End Try
End Function
ถ้าคุณต้องการให้ค้นหาแบบมีเงือนไขด้วยก็แปลงเอานะครับ
เรียนรู้ด้วยตัวเองจะดีที่สุด (ของแถม)
https://scontent-b-sin.xx.fbcdn.net/hphotos-xfp1/v/t1.0-9/10376726_10152578590951864_5635231080808214756_n.jpg?oh=5f6682abe010928a742ac4c9edab970c&oe=54FBC54F
|
 |
 |
 |
 |
Date :
2014-12-25 11:48:08 |
By :
deksoke |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ
คือยังไม่ได้ลองนะครับ แต่ขอถามก่อน
เวลาผมต้องการนำค่าที่ได้จากการ query ไปใช้ใน Function หรือ Private Sub อื่นต้องทำยังไงครับ
ต้องยัดใส่ตัวแปรก่อนไหม หรือใช้ dt.rows(0)("Table") ได้เลยครับ
ถ้าต้องยัดใส่ ตัวแปรก่อน ในเมื่อมันมีหลายค่า มันก็ต้องใช้ Array อยู่ดี ผมเข้าใจถูกหรือไม่ครับ
เดี๋ยวคืนนี้กลับไปลองดีกว่า
|
 |
 |
 |
 |
Date :
2014-12-25 13:38:46 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คุณสามารถส่ง datarow ไปทั้งแถวเลยก็ได้นะครับ
ในฟังชั่นค์ก็ดึงค่าจาก datarow ตามชื่อคอลัมน์ได้เลย
Code (VB.NET)
function process1(byval datarow_reference as datarow) as boolean
dim dr as datarow = datarow_reference
dim param1 as string
param1 = dr("ProductId")
..........
end function
|
 |
 |
 |
 |
Date :
2014-12-25 14:26:24 |
By :
deksoke |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแล้วแต่ผมเรียกใช้ไม่ถูกอะครับ คือถ้าทำ getProduct() เสร็จแล้วจะเรียกให้ทำงานที่ process1 ต่อ ต้องเขียนอย่างไรครับ ผมใช้ process1() ไม่ได้อ่าา
|
 |
 |
 |
 |
Date :
2014-12-26 09:19:28 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองเอาโค๊ดบ้านๆของผมไปใช้ดูครับ
เริ่มจาก สร้าง class Product ขึ้นมาเพื่อสะดวกต่อการเก็บค่า
Code (VB.NET)
'สร้าง class Product ขึ้นมาเพื่อสะดวกต่อการเก็บค่า
Public Class product
Public Tcode As String
Public Tname As String
Public Tsub As String
Public Tprice As String
End Class
โค้ดใน form1 ครับ
Code (VB.NET)
Imports System.Data.SqlClient
Public Class Form1
'function สร้าง list product
Private Function p_product() As List(Of product)
Dim lstpdt As List(Of product) = New List(Of product)()
Dim objConn As Data.SqlClient.SqlConnection = New SqlConnection()
Dim strSQL As String = "SELECT * FROM t_product"
Dim dtAdapter As SqlDataAdapter
Dim ds = New System.Data.DataSet()
dtAdapter = New SqlDataAdapter(strSQL, objConn)
dtAdapter.Fill(ds)
If ds.Tables(0).Rows.Count > 0 Then
lstpdt = New List(Of product)(ds.Tables(0).Rows.Count - 1)
For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
Dim pct As New product()
pct.Tcode = ds.Tables(0).Rows(i)(0)
pct.Tname = ds.Tables(0).Rows(i)(1)
pct.Tprice = ds.Tables(0).Rows(i)(2)
pct.Tsub = ds.Tables(0).Rows(i)(3)
lstpdt.Add(pct)
Next
End If
Return lstpdt
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'การเอาไปใช้งาน
Dim listProduct As List(Of product) = p_product()
MessageBox.Show(listProduct(2).Tcode) 'ประมาณนี้
End Sub
End Class
|
 |
 |
 |
 |
Date :
2014-12-26 10:03:55 |
By :
lamaka.tor |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
1, 2, 3, 4, ...,
คำคน/คำคม มันแตกต่างกัน ต่างกันตรงไหนล่ะ
นั่นคือตรรกะการคิด บางคนคิดหนึ่งได้ร้อยก็พึงพอใจแล้ว
แต่บางคนคิดน้อยได้มากกว่าพันคิดเขายังคิดว่าได้น้อยเกินไป(มา)
หน้าฮี
|
 |
 |
 |
 |
Date :
2015-01-03 21:38:14 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คนเราถ้า ตรรกะการคิด มันแตกต่างกัน มันยังมีประโยชน์
แต่ถ้าคนเรา ตรรกะการคิดมันตรงกัน มันมีประโยชน์ลดน้อยลง(ไร้ประโยชน์)
|
 |
 |
 |
 |
Date :
2015-01-03 21:43:44 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมไม่เข้าใจว่า ผมสามารถเอา
ds.Tables(0).Rows.Count มาใช้ได้เลยหรอ ในเมื่อมันอยู่คนละ Class
และ listProduct(2).Tcode ผมลอง listProduct(2).Tcode.Count เพื่อจะเอาค่าที่อยู่ในนั้นทั้งมามาวนลูปใน For หรือใช้่ While แตามันก็ไม่ได้
คือผมรู้แล้วละครับว่าต้องใช้ For เพื่อวนลูป แต่จากตัวอย่างที่ให้มา ถ้าผมต้องการจะหัดใช้ ArrayList แล้วจากตัวอย่างข้างบน ถ้าผมต้องการวนลูปให้มันแสดงค่าทั้งหมดที่ Query มาจะต้องทำยังไงครับ.
หรือต้องเอาตัวแปร lstpdt มาใช้ แต่ในเมื่อมันอยู่คนละ Class กันอีกนั่นแหละ ผมจะดึงเอามาใช้ยังไง โดนไม่ต้องไปประกาศตัวแปรไว้นอก Class
|
 |
 |
 |
 |
Date :
2015-01-04 20:17:46 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ทำได้แล้วครับ ผมคิดเยอะไปเอง ขอบคุณมากครับ สำหรับทุกๆความเห็น และคำตอบ
|
 |
 |
 |
 |
Date :
2015-01-04 21:14:14 |
By :
tatalas |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|