tags:

views:

130

answers:

2

I have a simple application to store address details and edit them. I have been away from VB for a few years now and need to refreash my knowledge while working to a tight deadline. I have a general Sub responsible for displaying a form where user can add contact details (by pressing button add) and edit them (by pressing button edit). This sub is stored in a class Contact. The way it is supposed to work is that there is a list with all the contacts and when new contact is added a new entry is displayed. If user wants to edit given entry he or she selects it and presses edit button

Public Sub Display()
    Dim C As New Contact
    C.Cont = InputBox("Enter a title for this contact.")
    C.Fname = frmAddCont.txtFName.Text
    C.Surname = frmAddCont.txtSName.Text
    C.Address = frmAddCont.txtAddress.Text
    frmStart.lstContact.Items.Add(C.Cont.ToString)
End Sub

I call it from the form responsible for adding new contacts by

Dim C As New Contact
C.Display()

and it works just fine. However when I try to do something similar using the edit button I get errors - "Unable to cast object of type 'System.String' to type 'AddressBook.Contact'."

Dim C As Contact
If lstContact.SelectedItem IsNot Nothing Then
    C = lstContact.SelectedItem()
    C.Display()
End If

I think it may be something simple however I wasn't able to fix it and given short time I have I decided to ask for help here.

I have updated my class with advice from other members and here is the final version (there are some problems however). When I click on the edit button it displays only the input box for the title of the contact and actually adds another entry in the list with previous data for first name, second name etc.

Public Class Contact 
        Public Contact As String 
        Public Fname As String 
        Public Surname As String 
        Public Address As String 
        Private myCont As String 
        Public Property Cont() 
            Get 
                Return myCont 
            End Get 
            Set(ByVal value) 
                myCont = Value 
            End Set 
        End Property 
        Public Overrides Function ToString() As String 
            Return Me.Cont 
        End Function 
        Sub NewContact() 
            FName = frmAddCont.txtFName.ToString 
            frmStart.lstContact.Items.Add(FName) 
            frmAddCont.Hide() 
        End Sub 
        Public Sub Display() 
            Dim C As New Contact 
            C.Cont = InputBox("Enter a title for this contact.") 
            C.Fname = frmAddCont.txtFName.Text 
            C.Surname = frmAddCont.txtSName.Text 
            C.Address = frmAddCont.txtAddress.Text 
            'frmStart.lstContact.Items.Add(C.Cont.ToString) 
            frmStart.lstContact.Items.Add(C)     

        End Sub 
End Class 
A: 

Since you didn't post all of your code, I'll give you my best guess which is:

lstContact seems like it is bound to an IEnumerable of strings instead of IEnumerable of Contacts.

Therefore, when you get lstContact.SelectedItem() it is returning a string instead of a Contact (and throwing an error when trying to cast string as Contact).

It'd be more helpful if you could post the code bit that binds lstContact to a data source.

Justin Niessner
+1  A: 

You're doing

frmStart.lstContact.Items.Add(C.Cont.ToString)

That is, you are adding strings to lstContact. Of course lstContact.SelectedItem() is a string!

John Saunders
+1 you got it in while I was still typing :)
egrunin