Teman-teman,
Digital Universal Buddhist Dictionary yang saya design sudah mendekati tahap akhir tetapi saya mendapatkan masalah baru setelah masalah slow loading di listbox terselesaikan. Masalah yang saya hadapi adalah kalau saya ingin mendelet huruf terakhir dalam seacrhbox, messegebox selalu muncul. Saya sudah mutar-mutar mencari solusi lewat Mbah Google tetapi tidak ketemu. Saya melihat caranya adalah dengan keypress event handler tetapi tidak ada yang cocok. Saya berharap teman-teman ada yang bisa membantu.
Berikut ini ada kodenya:
Private Sub txtfind_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtfind.TextChanged
Dim combo As String = ComboBox1.SelectedItem
Dim find As String = txtfind.Text
sql = "SELECT * FROM Entry WHERE Entrylists LIKE '" + CStr(find) + "%' and DictLists LIKE '" + CStr(combo) + "%'"
Call listLoad()
If txtfind.TextLength = -1 Then
txtfind.Focus()
End If
Dim curItem As String = txtfind.Text.ToString()
Dim index As Integer = ListBox1.FindString(curItem)
' If the item was not found in ListBox 2 display a message box, otherwise select it in ListBox2.
If index = -1 Then
Dim frm As New XtraMsgVocNot
frm.ShowDialog()
Else
ListBox1.SetSelected(index, True)
End If
End Sub
Private Sub txtfind_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtfind.TextChanged
Dim combo As String = ComboBox1.SelectedItem
Dim find As String = txtfind.Text
sql = "SELECT * FROM Entry WHERE Entrylists LIKE '" + CStr(find) + "%' and DictLists LIKE '" + CStr(combo) + "%'"
Call listLoad()
Dim curItem As String = txtfind.Text.ToString()
Dim index As Integer = ListBox1.FindString(curItem)
' If the item was not found in ListBox 2 display a message box, otherwise select it in ListBox2.
If index = -1 Then
Dim frm As New XtraMsgVocNot
frm.ShowDialog()
Else
ListBox1.SetSelected(index, True)
End If
End Sub
Yang saya bold seharusnya tidak diikutkan karena itu adalah percobaan.
If txtfind.TextLength = -1 Then
txtfind.Focus()
End If
apakah memang perlu melakukan pencarian pada setiap kali TextChanged? apakah tidak lebih baik pencarian dilakukan pada saat OnPressEnter atau Button.OnClick saja?
Sepertinya masalahnya terletak di query sql-nya: "select * from tb where kondisi like '%str%'". Jika str = '' (blank/kosong) atau length(str) = 0,maka hasil query-nya akan blank (kalau tidak error) karena like '%%' itu tidak bisa dijalankan (sintaks salah).
Mungkin lebih baik dibuat:
If str = blank maka sql = "select * from tb" (ambil semua data)
Else
sql = "select * from tb where kondisi like '%str%'"
Setelah itu baru dilakukan eksekusi query utk pencarian data.
Maaf,cuma pakai psedocode,gak pakai sintaks vb.net karena basic saya bukan di vb.net.
Semoga bisa membantu
Saya melihat cara ini lebih cepat dalam pencarian. Kalau menggunakan OnPressEnter atau Button.OnClick kita harus klik button lebih dahulu atau press enter. Tetapi dengan cara yang ada di atas, begitu kita mengetik suatu huruf, apabila huruf itu ada di dalam database, huruf itu akan langsung ditampilkan di lixbox. Ini semacam autocomplate listbox begitu atau tidak tahu apa teknical termnya.
Quote from: seniya on 12 April 2010, 11:01:14 PM
Sepertinya masalahnya terletak di query sql-nya: "select * from tb where kondisi like '%str%'". Jika str = '' (blank/kosong) atau length(str) = 0,maka hasil query-nya akan blank (kalau tidak error) karena like '%%' itu tidak bisa dijalankan (sintaks salah).
Mungkin lebih baik dibuat:
If str = blank maka sql = "select * from tb" (ambil semua data)
Else
sql = "select * from tb where kondisi like '%str%'"
Setelah itu baru dilakukan eksekusi query utk pencarian data.
Maaf,cuma pakai psedocode,gak pakai sintaks vb.net karena basic saya bukan di vb.net.
Semoga bisa membantu
Cara yang saya bold akan menimbulkan slow loading di listbox karena entrynya cukup bayak.
IMO.. ada beberapa metoda
jika ngotot tetep mo pake codingan di atas, maka kenapa gak coba pake try catch error ?
kalau gw seh prefer ubah method sql, bukan pake "%"+..+"%" tapi pake metoda preparation
ini cara di foxpro, pake method preparation.. di VB.NET ada juga.. coba cari buku2 VB.. (yang inggris aja) gw pernah baca.. ada koq penggunaan method preparation.. kalau gak salah pake [at]
* Product
IF LOWER(GETWORDNUM(mjudul,1,"/"))="product"
TEXT TO sqlcmd TEXTMERGE NOSHOW PRETEXT 3
SELECT kode_barang,kode_barcode,nama_barang,product.merk_barang,merk.nama_merk,merk.merk_departemen,departemen.nama_departemen,
satuan_kecil,harga_jual_kecil,satuan_medium,ekivalensi_medium,harga_jual_medium,satuan_besar,ekivalensi_besar,harga_jual_besar,
stok_min,stok_max,product.tanggal,product.author,product.jam,product.status from product
left join merk on product.merk_barang = merk.kode_merk left join departemen on merk.merk_departemen=departemen.kode_departemen
where <<nilcbo>> like ?niltxt order by kode_barang asc
ENDTEXT
ENDIF
IF !EMPTY(sqlcmd)
sqlopen(sqlcmd,this.tabelgrid," ")
ENDIF
[at] Forte: Apakah yang dimaksud adalah store procedure? Kalau yang dimaksud adalah store procedure, sqlite tidak mendukung store procedure.
Maaf nih, jujur saja saya tidak banyak mengerti istilah-istilah teknik. Saya hanya tabrak sana, tabrak sini dan jadi hahaha
If index = -1 andalso txtfind.text.length > 0 Then
Dim frm As New XtraMsgVocNot
frm.ShowDialog()
Else
ListBox1.SetSelected(index, True)
End If
Quote from: hatRed on 13 April 2010, 09:08:13 AM
If index = -1 andalso txtfind.text.length > 0 Then
Dim frm As New XtraMsgVocNot
frm.ShowDialog()
Else
ListBox1.SetSelected(index, True)
End If
Metode ini sudah hampir bisa menghindari pemanggilan msgbox tetapi masih memanggil listload [Call listLoad()]. Bagaimana caranya biar listboxnya juga tidak terpanggil? Maunya saya, kalau txtfind.text.length > 0 then do nothing. Tetapi saya sulit menemukan kodenya.
Sorry ya saya selalu merepoti.
Quote
Dim find As String = txtfind.Text
sql = "SELECT * FROM Entry WHERE Entrylists LIKE '" + CStr(find) + "%' and DictLists LIKE '" + CStr(combo) + "%'"
if txtfind.text.length > 0 then Call listLoad()
If txtfind.TextLength = -1 Then
txtfind.Focus()
End If
itu yg diitalic buat apa yah ???
mank bisa yah panjang text sampe minus :|
Quote from: hatRed on 13 April 2010, 10:09:43 AM
Quote
Dim find As String = txtfind.Text
sql = "SELECT * FROM Entry WHERE Entrylists LIKE '" + CStr(find) + "%' and DictLists LIKE '" + CStr(combo) + "%'"
if txtfind.text.length > 0 then Call listLoad()
If txtfind.TextLength = -1 Then
txtfind.Focus()
End If
itu yg diitalic buat apa yah ???
mank bisa yah panjang text sampe minus :|
Sorry, kan saya selalu melakukan percobaan. so, saya pikir dengan cara itu akan dapat teratasi, tetapi nyatanya tidak.
Bro, boleh tau gak message errornya seperti apa.
biar letak masalahnya lebih jelas dimana.
_/\_
Quote from: syncmetal on 13 April 2010, 10:29:58 AM
Bro, boleh tau gak message errornya seperti apa.
biar letak masalahnya lebih jelas dimana.
_/\_
Saya kirim PM bro. Mohon dicek.
Sudah dibantu oleh bro syncmetal. Berikut adalah solusinya. Sorry bro ga bisa kirim pm krn pm bro lagi penuh. Sekali lagi a lot of thanks. Saya akan publish kamusnya segera setelah selesai.
Private Sub txtfind_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtfind.TextChanged
Dim combo As String = ComboBox1.SelectedItem
if textbox1.text<>"" then
Dim find As String = txtfind.Text
sql = "SELECT * FROM Entry WHERE Entrylists LIKE '" + CStr(find) + "%' and DictLists LIKE '" + CStr(combo) + "%'"
Call listLoad()
If txtfind.TextLength = -1 Then
txtfind.Focus()
End If
Dim curItem As String = txtfind.Text.ToString()
Dim index As Integer = ListBox1.FindString(curItem)
' If the item was not found in ListBox 2 display a message box, otherwise select it in ListBox2.
If index = -1 Then
Dim frm As New XtraMsgVocNot
frm.ShowDialog()
Else
ListBox1.SetSelected(index, True)
End If
else
listbox1.items.clear()
end if
end sub
hehe... iya baru nyadar klo messagenya penuh. :o
ok bro sama2. ;D
programnya keren. 8)