开发者

VB.NET Array/Hashtable Issue

I am trying to make an array of hashtables. I don't know if this is the best solution, in PHP I would just do a multi-dim array, but it's not so easy in .NET. I am pretty new o VB, so if there is a better solution for this please explain.

I have 2 emails fields for a contact, and a contact can have many. I just want to load in the first two on the edit page for editing, whatever they may be.

Private Sub loadPrimaryContactEmails(ByVal db As CRMDataDataContext, ByVal contactID As Guid)
        Dim q = (From ce In db.ContactEmails Where ce.ContactID = contactID Select ce).Take(2)
        Dim Emails As Array
        Dim count = 0
        For Each email In q
            Emails(count) = New Hashtable
            Emails(count).Add("email", email.Email)
            Emails(count).Add("label", email.Label)
            Emails(count).Add("id", email.ContactEmailID)
            count = count + 1
        Next
        txtPCEmail1.Text = Emails(0).Item("email")
        txtPCEmail1Label.Text = Emails(0).Item("label")
        lblEmail1ID.Text = Emails(0).Item("id")

        txtPCEmail2.Text = Emails(1).Item("email")
        txtPCEmail2Label.Text = Emails(1).Item("label")
        lblEmail2ID.Text = Emails(1).Item("id")
    End Sub

I get the error the first time I try to reference my array:

txtPCEmail1.Text = Emails(0).Item("email")

The error is:

Object variable or With block variable not set.

It builds, so I thought it might work. I can't just loop through my datasource because I have to explicitly set textbox fields. Is there a better way to go about doing this? Or is there a way to make an array of hashtables work?

EDIT - here is the good code: So I went w/ the HybridDictionary...

Private Sub loadPrimaryContactEmails(ByVal db As CRMDataDataContext, ByVal contactID As Guid)
        Dim q = (From ce In db.ContactEmails Where ce.ContactID = contactID Select ce).Take(2)
        Dim Emails As New HybridDictionary()
        Dim count = 1
        For Each email In q
            Emails.Add("email开发者_如何学运维" + NCStr(count), email.Email)
            Emails.Add("label" + NCStr(count), email.Label)
            Emails.Add("id" + NCStr(count), email.ContactEmailID)
            count = count + 1
        Next
        txtPCEmail1.Text = Emails("email1")
        txtPCEmail1Label.Text = Emails("label1")
        lblEmail1ID.Text = Emails("id1")

        txtPCEmail2.Text = Emails("email2")
        txtPCEmail2Label.Text = Emails("label2")
        lblEmail2ID.Text = Emails("id2")
    End Sub

SO yeah, kind of a hack, but I don't feel like I should have to making special methods just to load some data into a dictionary or array or whatever.


Arrays in VB.NET are different than in PHP. You will need to define the size of your array before attempting to set elements of the array.

Better yet, consider using the generic List<T> collection.


Yes Phil is right you haven't specified the Initial Size of the Array.

And as suggested by him Use generic list or I would recommend

"System.Collections.Specialized.StringCollection" Class or "System.Collections.Specialized.HybridDictionary" class


Build the hashtable first and then build the array.

    Dim hash As New Hashtable()
    hash.Add("Header", shortModel)
    hash.Add("SpecInfo", specinfo)
    hash.Add("SerialNumber", serie & "-L")
    hash.Add("SerialNumber2", serie)
    hash.Add("seriel", serie & "-L")
    hash.Add("serie", serie)
    hash.Add("Product", modelBase)
    hash.Add("varBC", bc)
    hash.Add("box_id", boxId.Substring(4).ToString)

    Dim dt As DataTable = DbUtil.GetCursor("SFISM4.PKG_AGENCY.sp_get_print_param", {New OracleParameter("in_serie", "3CE5151ZW4")})
    For Each row As DataRow In dt.Rows
        hash.Add(row("NAME"), row("VALUE"))
    Next


    Dim mArray(hash.Count() - 1, 1) As String
    Dim i As Integer = 0

    For Each row As DictionaryEntry In hash
        mArray(i, 0) = row.Key.ToString()
        mArray(i, 1) = row.Value.ToString()
        i = i + 1
    Next
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜