2010-11-27 3 views
1

Я пытаюсь создать массив хэш-таблиц. Я не знаю, является ли это лучшим решением, в PHP я бы просто сделал многомерный массив, но в .NET это не так просто. Я довольно новый o VB, поэтому, если есть лучшее решение для этого, пожалуйста, объясните.VB.NET Array/Hashtable Issue

У меня есть два поля электронной почты для контакта, и у контакта может быть много. Я просто хочу загрузить в первых двух на странице редактирования для редактирования, какими бы они ни были.

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 

Я получаю ошибку в первый раз, когда я пытаюсь ссылаться на мой массив:

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

Ошибка является:

Object variable or With block variable not set. 

Он строит, так что я думал, что это может сработать. Я не могу просто пропустить свой источник данных, потому что я должен явно устанавливать поля текстового поля. Есть ли лучший способ сделать это? Или есть способ сделать массив hashtables работать?

EDIT - вот хороший код: Так что я пошел ж/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 да, своего рода хак, но я не чувствую, что я должен сделать специальные методы просто загрузить некоторые данные в словарь или массив или что угодно.

ответ

1

Да Фил прав, вы не указали начальный размер массива.

И как предложил ему использовать общий список, или я бы рекомендовал

«System.Collections.Specialized.StringCollection» Класс или «System.Collections.Specialized.HybridDictionary» класс

+0

Мне нравится hybridDictionary ... Я отправлю код в редактировании сообщения – KacieHouser 2010-11-28 00:12:51

2

Массивы в VB.NET отличаются от PHP. Вам нужно будет определить размер вашего массива до, пытающегося установить элементы массива.

Еще лучше, рассмотрите общую коллекцию List<T>.

0

Построить Хеш первый и затем постройте массив.

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