Mohon bantuan untuk backspace

Started by dhammasiri, 12 April 2010, 12:08:45 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

dhammasiri

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
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

dhammasiri

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
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

Indra

#2
apakah memang perlu melakukan pencarian pada setiap kali TextChanged? apakah tidak lebih baik pencarian dilakukan pada saat OnPressEnter atau Button.OnClick saja?

seniya

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
"Holmes once said not to allow your judgement to be biased by personal qualities, and emotional qualities are antagonistic to clear reasoning."
~ Shinichi Kudo a.k.a Conan Edogawa

dhammasiri

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.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

dhammasiri

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.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

FZ

#6
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]

Code (visual foxpro) Select

* 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


dhammasiri

 [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
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

hatRed


If index = -1 andalso txtfind.text.length > 0  Then
            Dim frm As New XtraMsgVocNot
            frm.ShowDialog()

        Else
            ListBox1.SetSelected(index, True)
        End If
i'm just a mammal with troubled soul



dhammasiri

#9
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.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

hatRed

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 :|
i'm just a mammal with troubled soul



dhammasiri

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.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

syncmetal

Bro, boleh tau gak message errornya seperti apa.
biar letak masalahnya lebih jelas dimana.
_/\_
Sabbe Sankhara Anicca..
Sabbe Sankhara Dukkha..
Sabbe Sankhara Anatta..

dhammasiri

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.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

dhammasiri

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
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai