Mohon bantuan untuk Combobox SelectedIndexChanged

Started by dhammasiri, 07 January 2010, 12:18:00 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

dhammasiri

Teman-teman, wah saya lagi menghadapi masalah nih tolong dong.
Saya punya combobox dan combobox itu telah berisi data (Category) dari database. Apa yang saya mau adalah saat saya memilih salah satu category, semua data dari database dalam category yang sama ditampilkan di listbox. Saya telah menggunakan sql command,
"SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"
tapi tidak bisa. Selalu saja ada exception. Apa ada yang bisa membantu? Saya sangat bersyukur kalau ada yang bisa memberikan cara yang lain. Tolong ya karena ini untuk membuat kamus Pali-English.
NB: Saya Pakai VB.Net
Thanks
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

Indra

#1
software yg digunakan apa? errornya apa?

heran, kamus pali-english kok ada data customer?

combobox1.selectedindex mungkin bernilai numerik yaitu index dari combobox1, sementara nilai yg diharapkan oleh SQL adalah string. mungkin bisa coba property lainnya, misalnya combobox1.text

hatRed

selectedindex tuh buat tau indexnya..

tapi kalo emang sengaja... seharusnya gak error...

coba kasih kode lengkap di event itu..

udah coba selectedtext ?
i'm just a mammal with troubled soul



Forte

#3
Quote from: dhammasiri on 07 January 2010, 12:18:00 PM
Teman-teman, wah saya lagi menghadapi masalah nih tolong dong.
Saya punya combobox dan combobox itu telah berisi data (Category) dari database. Apa yang saya mau adalah saat saya memilih salah satu category, semua data dari database dalam category yang sama ditampilkan di listbox. Saya telah menggunakan sql command,
"SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"
tapi tidak bisa. Selalu saja ada exception. Apa ada yang bisa membantu? Saya sangat bersyukur kalau ada yang bisa memberikan cara yang lain. Tolong ya karena ini untuk membuat kamus Pali-English.
NB: Saya Pakai VB.Net
Thanks
setahu gw tetap pake combobox1.value deh..
jadi "select * from <table> where <field> = '"+<combobox1.value>+"'"

tapi jujur saja, saya TIDAK SUKA cara di ATAS.. sintax sql kayak di atas SANGAT BERBAHAYA..
misal kalau ada yang isi combobox dengan yang mengandung ' maka akan kacau

jadi saya sarankan pakailah methode preparation
seperti "select * from <table> where <field> =  [at] nilai"

nantinya  [at] nilai itu yang diinput parameternya.

dulu pernah main VB.NET kalau tidak salah ada addparameter deh di recordset. coba bertanyalah pada F1

gw dari based foxpro seh biasa langsung tembak dengan SQLSTRINGCONNECT, dan SQLEXEC



dipasena

#4
baru tau disini ada thread tuk membahas VB.NET

pake CStr(ComboBox1.SelectedValue) ato CStr(ComboBox1.SelectedText) tergantung bagaimana cara kita menset data untuk ComboBox nya
ComboBox bisa kita binding dengan database, ada 2 property yg bisa di pake
ComboBox1.DisplayMember
ComboBox1.valueMember

CStr() digunakan tuk merubah data dari combobox menjadi string. Klo pake SelectedIndex, yg diambil adalah nilai index dari DisplayMember jadi ""SELECT * FROM Customers WHERE CustomerID = '" & ComboBox1.SelectecIndex & "'"" yang terbaca adalah nilai index nya, bukan nilai dari CustomerID nya

semoga membantu

dhammasiri

Quote from: Indra on 07 January 2010, 12:20:19 PM
software yg digunakan apa? errornya apa?

heran, kamus pali-english kok ada data customer?

combobox1.selectedindex mungkin bernilai numerik yaitu index dari combobox1, sementara nilai yg diharapkan oleh SQL adalah string. mungkin bisa coba property lainnya, misalnya combobox1.text
Ini kan cuma contoh. Jadi, ya saya copy and paste dari contoh aslinya. Kalau punya saya yang asli sih
Select * From Entry Where EntryId = '" & ComboBox1.SelectedIndex & "'
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

dhammasiri

Berikut ini adalah bagaimana saya menampilkan data dari database ke combobox1:
Private Sub DictLoad()
        Dim oDR As SQLite.SQLiteDataAdapter
        Dim strSQL As String
        Dim strConn As String
        Dim oItem As NewDict
        Dim intLoop As Integer
        Dim oTable As DataTable = New DataTable()


        strConn = ConnectStringBuild()

        strSQL = "SELECT DictId, DictLists "
        strSQL &= "FROM Dictionary"

        Try
            oDR = _
             New SQLite.SQLiteDataAdapter(strSQL, strConn)
            oDR.Fill(oTable)

            For intLoop = 0 To oTable.Rows.Count - 1
                oItem = New NewDict()
                With oTable.Rows(intLoop)
                    oItem.Value = _
                     .Item("DictLists").ToString()
                    oItem.ID = CInt(.Item("DictId"))
                End With

                ComboBox1.Items.Add(oItem)
            Next

        Catch oExcept As Exception
            MessageBox.Show(oExcept.Message)

        End Try

    End Sub
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

hatRed

i'm just a mammal with troubled soul



dipasena



Private Sub get_combo()
        Dim DaCombo As MySqlDataAdapter
        Dim DsCombo As New DataSet
        Dim DtCombo As New DataTable
        Try
            DtCombo.Clear()
            Conn = New MySqlConnection(ConnDBStr.Initial)
            Cmd = New MySqlCommand("select * from tbl_golongan", Conn)
            DaCombo = New MySqlDataAdapter(Cmd)
            DaCombo.Fill(DsCombo, "MasterData")
            DtCombo = DsCombo.Tables("MasterData")

            ComboBox1.DataSource = DtCombo
            ComboBox1.DisplayMember = "deskripsi"
            ComboBox1.ValueMember = "kode"
            Conn.Close()
        Catch ex As Exception
            MsgBox("Data golongan gagal ditampilkan !" & vbCrLf & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub



saya biasa binding data dari db ke combo dengan cara gtu, keuntungan nya lebih praktis n simple, trus kita jg bisa atur 2 data ato lebih
data yang mau ditampilkan di set di displaymember, untuk data kode di set di valuemember

contoh diatas saya pake database mysql, klo pake oracle n sqlserver tinggal di sesuaikan aja...

hatRed

keknya mo pake object buat isi list combonya... (class NewDict)

object oItem itu overide stringnya apa? kalo gak yg muncul malah nama object

i'm just a mammal with troubled soul



dhammasiri

#10
Jujur saya mengikuti cara yang diberikan dalam tutorial di MSDN.
Ini adalah class yang saya pergunakan:

Public Class NewDict
   Private mstrValue As String
   Private mintID As Integer

   Public Sub New()

   End Sub

   Public Sub New(ByVal strValue As String, _
    ByVal intID As Integer)
       mstrValue = strValue
       mintID = intID
   End Sub

   Property Value() As String
       Get
           Return mstrValue
       End Get
       Set(ByVal Value As String)
           mstrValue = Value
       End Set
   End Property

   Property ID() As Integer
       Get
           Return mintID
       End Get
       Set(ByVal Value As Integer)
           mintID = Value
       End Set
   End Property

   Public Overrides Function ToString() As String
       Return mstrValue
   End Function
End Class


Berikut ini adalah cara saya menampilkan data dari database ke combobox:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       DictLoad()
   End Sub
Private Sub DictLoad()
       Dim oDR As SQLite.SQLiteDataAdapter
       Dim strSQL As String
       Dim strConn As String
       Dim oItem As NewDict
       Dim intLoop As Integer
       Dim oTable As DataTable = New DataTable()


       strConn = ConnectStringBuild()

       strSQL = "SELECT DictId, DictLists "
       strSQL &= "FROM Dictionary"

       Try
           oDR = _
            New SQLite.SQLiteDataAdapter(strSQL, strConn)
           oDR.Fill(oTable)

           For intLoop = 0 To oTable.Rows.Count - 1
               oItem = New NewDict()
               With oTable.Rows(intLoop)
                   oItem.Value = _
                    .Item("DictLists").ToString()
                   oItem.ID = CInt(.Item("DictId"))
               End With

               ComboBox1.Items.Add(oItem)
           Next

       Catch oExcept As Exception
           MessageBox.Show(oExcept.Message)

       End Try

   End Sub

Masalah saya di bawah ini:
Ada empat kamus yang ditampilkan dalam combobox1. Pali-English, Concise Pali-english, english-Pali, Pali Proper Names. Jelas ini adalah untuk sementara ini. Ada kemungkinan akan ditambah di masa yang akan datang. Apa yang saya mau adalah saat kita klik salah satu Dictionary dalam combobox1, saya ingin semua entry dari kamus yang sama ditampilkan di listbox1. Nah saya tidak tahu caranya, tolong dong karena semua sudah hampir selesai. Database juga sudah siap, saya hanya butuh beberapa tahap lagi untuk menyiapkan database. Selama ini saya sudah mencari berbagai cara tapi ya, karena saya ini programmer bloon, tidak dapat menyelesaikan masalah ini. Mungkin ada cara lain, saya persilahkan untuk memberikan saran.

Berikut ini adalah bagaimana saya menghandle ComboBox1_SelectedIndexChanged:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
       ListLoad()
   End Sub

Private Sub ListLoad()
       Dim oDR As SQLite.SQLiteDataReader
       Dim strSQL As String
       Dim strConn As String
       Dim oItem As NewDict
       Dim SqlCom As SQLite.SQLiteCommand

       strConn = ConnectStringBuild()
       
       strSQL = "SELECT EntryId, EntryLists "
       strSQL &= "FROM Entry"
       


       Me.ListBox1.Items.Clear()
       Try
           SqlCom = New SQLite.SQLiteCommand()
           With SqlCom
               .Connection = _
                New SQLite.SQLiteConnection(strConn)
               .Connection.Open()
               .CommandText = strSQL
               oDR = _
                .ExecuteReader()
           End With

           ListBox1.Items.Clear()
           Do While oDR.Read()
               oItem = New NewDict()
               With oDR
                   oItem.ID = CInt(.Item("EntryId"))
                   oItem.Value = _
                    .Item("EntryLists").ToString()
               End With

               ListBox1.Items.Add(oItem)
           Loop
           If ListBox1.Items.Count > 0 Then
               ListBox1.SetSelected(0, True)
           End If

       Catch oExcept As Exception
           MessageBox.Show(oExcept.Message)

       End Try


   End Sub
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

hatRed

#11
Quote from: dhammasiri on 08 January 2010, 02:10:20 PM

Public Class NewDict
Implements IDisposable, ICloneable

    Private mstrValue As String
    Private mintID As Integer

    Public Sub New()

    End Sub

    Public Sub New(ByVal strValue As String, _
     ByVal intID As Integer)
        mstrValue = strValue
        mintID = intID
    End Sub

    Property Value() As String
        Get
            Return mstrValue
        End Get
        Set(ByVal Value As String)
            mstrValue = Value
        End Set
    End Property

    Property ID() As Integer
        Get
            Return mintID
        End Get
        Set(ByVal Value As Integer)
            mintID = Value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return mstrValue
    End Function


#Region "ICloneable Support"
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return Me.MemberwiseClone()
        End Function

#End Region

#Region " IDisposable Support "
        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: free other state (managed objects).
                value =  ""

                End If

                ' TODO: free your own state (unmanaged objects).
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

#Region "Destructor"
        Protected Overrides Sub Finalize()
            Me.Dispose(True)
            MyBase.Finalize()
        End Sub

#End Region
End Class




Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DictLoad()
End Sub

Private Sub DictLoad()
        Dim oDR As SQLite.SQLiteDataAdapter
        Dim strSQL As String
        Dim strConn As String
        Dim oItem As NewDict
        Dim intLoop As Integer
        Dim oTable As DataTable = New DataTable()


        strConn = ConnectStringBuild()

        strSQL = "SELECT DictId, DictLists "
        strSQL &= "FROM Dictionary"

        Try
            oDR = _
             New SQLite.SQLiteDataAdapter(strSQL, strConn)
            oDR.Fill(oTable)
             oItem = New NewDict()
            For intLoop = 0 To oTable.Rows.Count - 1
               
                With oTable.Rows(intLoop)
                    oItem.Value = _
                     .Item("DictLists").ToString()
                    oItem.ID = CInt(.Item("DictId"))
                End With

                ComboBox1.Items.Add(oItem)
            Next
            oItem.dispose()

        Catch oExcept As Exception
            MessageBox.Show(oExcept.Message)

        End Try

    End Sub




Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        ListLoad(directcast(combobox1.selecteditem,NewDict).clone)
End Sub

Private Sub ListLoad(selectedDictItem as NewDict)
        Dim oDR As SQLite.SQLiteDataReader
        Dim strSQL As String
        Dim strConn As String
        Dim oItem As NewDict
        Dim SqlCom As SQLite.SQLiteCommand

        strConn = ConnectStringBuild()
       
        strSQL = "SELECT EntryId, EntryLists "
        strSQL &= "FROM Entry WHERE DictID = " & selectedDictItem.ID
       

        Me.ListBox1.Items.Clear()
        Try
            SqlCom = New SQLite.SQLiteCommand()
            With SqlCom
                .Connection = _
                 New SQLite.SQLiteConnection(strConn)
                .Connection.Open()
                .CommandText = strSQL
                oDR = _
                 .ExecuteReader()
            End With

            ListBox1.Items.Clear()
            oItem = New NewDict()
            Do While oDR.Read()
               
                With oDR
                    oItem.ID = CInt(.Item("EntryId"))
                    oItem.Value = _
                     .Item("EntryLists").ToString()
                End With

                ListBox1.Items.Add(oItem)
            Loop
             oItem.dispose
            If ListBox1.Items.Count > 0 Then
                ListBox1.SetSelected(0, True)
            End If

        Catch oExcept As Exception
            MessageBox.Show(oExcept.Message)

        End Try


    End Sub

i'm just a mammal with troubled soul



dhammasiri

#Region " IDisposable Support "
    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not [b]Me.disposedValue[/b] Then
            If disposing Then
                ' TODO: free other state (managed objects).
                value = ""

            End If

            ' TODO: free your own state (unmanaged objects).
            ' TODO: set large fields to null.
        End If
        [b]Me.disposedValue[/b] = True
    End Sub

Me.disposedValue kok dibilang bukan member NewDict. Apa yang harus saya lakukan? Sorry kalau harus merepoti.
Kedamaian dunia tidak akan tercapai bila batin kita tidak damai

hatRed

uppss sorry, maklum cuman copas doank dari source code :P

disposed value, dideklarasikan aja sebagai boolean default false ;D

        Private disposedValue As Boolean = False        ' To detect redundant calls

itu bawaan interface disposable

i'm just a mammal with troubled soul