2013-04-08 3 views
1

Итак, я делаю полный капитальный ремонт. Благодаря вам у меня работали месяцы! Но, как вы сказали, я должен изменить это, чтобы лучше понять. Поэтому я попытался добавить еще 2 окна с чем-то, чтобы проверить. В настоящее время программа тестирует вехи (лет - от 10 лет до 100 лет). Я редактировал код, но я не знаю, какую строку проверить, чтобы перейти от тестирования месяца к году? Таким образом, новое поле списка, которое я добавил, отображает ту же информацию, что и тест месяца, по сравнению с тем, что я пытаюсь выполнить. Так, например: John Doe 4/9/2003 появится в «10» вехе.Импорт данных из текстового файла

Private Sub lbMonth_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbMonth.SelectedIndexChanged 
    If lbMonth.SelectedIndex < 0 Then Return 
    lbPerson.Items.Clear() 
    Dim index As Integer = lbMonth.SelectedIndex 
    For Each ele In Birthdays(index + 1) 
     lbPerson.Items.Add(ele) 
    Next 
End Sub 

Private Sub lbMilestone_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbMilestone.SelectedIndexChanged 
    If lbMilestone.SelectedIndex < 0 Then Return 
    lbPerson2.Items.Clear() 
    Dim index As Integer = lbMilestone.SelectedIndex 
    For Each ele2 In Birthdays2(index) 
     lbPerson2.Items.Add(ele2) 
    Next 
End Sub 

Private Birthdays(12) As List(Of String) 
Private Birthdays2(10) As List(Of String) 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    'initialize the Month list 
    lbMonth.Items.Clear() 
    lbMonth.Items.Add("January") 
    lbMonth.Items.Add("February") 
    lbMonth.Items.Add("March") 
    lbMonth.Items.Add("April") 
    lbMonth.Items.Add("May") 
    lbMonth.Items.Add("June") 
    lbMonth.Items.Add("July") 
    lbMonth.Items.Add("August") 
    lbMonth.Items.Add("September") 
    lbMonth.Items.Add("October") 
    lbMonth.Items.Add("November") 
    lbMonth.Items.Add("December") 

    lbMilestone.Items.Clear() 
    lbMilestone.Items.Add("10") 
    lbMilestone.Items.Add("20") 
    lbMilestone.Items.Add("30") 
    lbMilestone.Items.Add("40") 
    lbMilestone.Items.Add("50") 
    lbMilestone.Items.Add("60") 
    lbMilestone.Items.Add("70") 
    lbMilestone.Items.Add("80") 
    lbMilestone.Items.Add("90") 
    lbMilestone.Items.Add("100") 
    'initialize the Lists (Instance required in order to access each list-object) 
    For i As Integer = 0 To 12 
     Birthdays(i) = New List(Of String) 
    Next 

    For j As Integer = 0 To 10 
     Birthdays2(j) = New List(Of String) 
    Next 

    'load some birthdays 
    Dim filename As String = Application.StartupPath + "\Birthday.txt" 
    If Not My.Computer.FileSystem.FileExists(filename) Then Throw New Exception("Filename """ + filename + """ does not exist!") 

    Dim fileContent As String = My.Computer.FileSystem.ReadAllText(filename) 
    Dim lines() As String = Split(fileContent, vbCrLf) 
    For Each ele As String In lines 
     Dim line As String = ele.Trim 
     Dim datePos As Integer = line.LastIndexOf(vbTab) 'find last space between name and date 
     If datePos < 5 Then Continue For 'if full name is less than 5 chars, then it probably not a line with an entry 
     Dim dateString As String = Mid(line, datePos + 2) 'all after that last space is date 
     Dim name As String = Mid(line, 1, datePos).Trim ' all before that last space is name 
     'Dim birthday As Date = Convert.ToDateTime(parts(1).Trim) ' used this conversion before, but lets try the other way 
     Dim birthday As Date 
     Try 
      birthday = DateTime.ParseExact(dateString, "M/d/yyyy", System.Globalization.CultureInfo.GetCultureInfo("en-US")) 
     Catch ex As Exception 
      Continue For 
     End Try 

     Dim month As Integer = birthday.Month 
     Dim year As Integer = CInt(Date.Now.Subtract(birthday).TotalDays/365/10) 
     Birthdays(month).Add(name) 
     Birthdays2(year).Add(name) 
    Next 


End Sub 
+1

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Хорошо, давайте посмотрим .. пожалуйста, переименуйте День рождения2 на соответствующее имя, может быть, что-то с деци и лет или около того. Также оригинал может быть переименован, но я думаю, что все в порядке. 2. Вместо добавления полного блока вам просто нужно добавить 1-2 строки: например, строка ** Dim month as Integer ... ** вы добавите свое определение ** Dim year ... ** прямо под month. Но измените правую сторону: ** = CInt (Date.Now.Subtract (день рождения) .TotalYears/10) **, а затем добавьте команду, чтобы добавить ее во второй список по годам, как вы уже писали. Затем измените новое для каждого итерацию через Birthday2 :) – Amegon

+0

пояснение: после того, как вы правильно разобрали «день рождения», вы можете извлечь любую информацию, даже 5 разных, и заполнить данные в 5 разных местах. Это более полезно, чем чтение всего файла 5 раз (и 5 раз разбора).** # ** Для каждого «итерации» через коллекцию, поэтому независимо от того, что у вас есть, следующие строки кода будут выполняться для каждого отдельного элемента в этой коллекции. ** # ** Поскольку существует массив коллекций, мы используем число для доступа к одной конкретной коллекции. Чтобы показать элемент в списке, просто добавьте его в список.Items.Add (your_item) – Amegon

ответ

0

Создайте новый проект и добавьте 2 списка. Назовите одну из ListBox lbMonth, другой lbPerson

затем вставьте следующий код:

Private Sub lbMonth_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbMonth.SelectedIndexChanged 
    If lbMonth.SelectedIndex < 0 Then Return 
    lbPerson.Items.Clear() 
    Dim index As Integer = lbMonth.SelectedIndex 
    For Each ele In Birthdays(index + 1) 
     lbPerson.Items.Add(ele) 
    Next 
End Sub 

Private Birthdays(12) As List(Of String) 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    'initialize the Month list 
    lbMonth.Items.Clear() 
    lbMonth.Items.Add("January") 
    lbMonth.Items.Add("February") 
    lbMonth.Items.Add("March") 
    lbMonth.Items.Add("April") 
    lbMonth.Items.Add("May") 
    lbMonth.Items.Add("June") 
    lbMonth.Items.Add("July") 
    lbMonth.Items.Add("August") 
    lbMonth.Items.Add("September") 
    lbMonth.Items.Add("October") 
    lbMonth.Items.Add("November") 
    lbMonth.Items.Add("December") 

    'initialize the Lists (Instance required in order to access each list-object) 
    For i As Integer = 0 To 12 
     Birthdays(i) = New List(Of String) 
    Next 

    'load some birthdays 
    Dim filename As String = Application.StartupPath + "\names.txt" 
    If Not My.Computer.FileSystem.FileExists(filename) Then Throw New Exception("Filename """ + filename + """ does not exist!") 

    Dim fileContent As String = My.Computer.FileSystem.ReadAllText(filename) 
    Dim lines() As String = Split(fileContent, vbCrLf) 
    For Each ele As String In lines 
     Dim line As String = ele.Trim 
     Dim datePos As Integer = line.LastIndexOf(" ") 'find last space between name and date 
     If datePos < 5 Then Continue For 'if full name is less than 5 chars, then it probably not a line with an entry 
     Dim dateString As String = Mid(line, datePos + 2) 'all after that last space is date 
     Dim name As String = Mid(line, 1, datePos).Trim ' all before that last space is name 
     'Dim birthday As Date = Convert.ToDateTime(parts(1).Trim) ' used this conversion before, but lets try the other way 
     Dim birthday As Date 
     Try 
      birthday = DateTime.ParseExact(dateString, "M/d/yyyy", System.Globalization.CultureInfo.GetCultureInfo("en-US")) 
     Catch ex As Exception 
      Continue For 
     End Try 
     Dim month As Integer = birthday.Month 
     Birthdays(month).Add(name) 
    Next 

End Sub 

Вы должны переименовать имя файла на день рождения «names.txt» и, возможно, поместить его проецировать/бункером/Debug или где-либо еще, где вы запускаете исполняемый файл программы.

Исключение должно помочь вам найти правильный путь.

Update

и убедитесь, что оба ListBoxes относительны большой (может показать все 12 месяцев).

Проверьте программу. Вы должны увидеть что-то случится, когда вы выбираете месяц 7 или 8 (если вы используете 3 записи, которые вы перечислили)

UPDATE2

Я изменил код, добавив блок try..catch, чтобы исправить исключения , если файл содержит пустые строки/строки с недопустимыми данными в них.

просто замените код в своем проекте.

Также убедитесь, что это «" пробел, а не вкладка, которая используется в текстовом файле. если используются вкладки, а затем заменить

Dim datePos As Integer = line.LastIndexOf(" ") 

с

Dim datePos As Integer = line.LastIndexOf(vbTab) 

удачи на этот раз :) Если она по-прежнему не удается, то мы можем сделать строку, чтобы питались преобразование в функции и протестировать его немного больше, или даже сделать его более вручную, получая все 3 число, а затем создать новую дату с днем, месяцем и годом (каждый в виде целого числа)

Update3

Измененный массив рождения имеет 13 полей (от 0 до 12, 0 не используется больше)

Изменено инициализировать также все 13 полей

Изменены читать из индекса + 1, с января является индекс 0, индекс февраля 1 и т. Д.

+0

Спасибо за работу, но я получаю сообщение об ошибке в этой строке: Dim birthday As Date = DateTime.ParseExact (dateString, "M/d/yyyy", System.Globalization.CultureInfo.GetCultureInfo ("en-US")) «Строка не была признана допустимым DateTime». – Cliff

+0

Хмм, может быть, с линией ** Dim birthday As Date = Convert.ToDateTime (dateString) ** вместо? Вы можете использовать непосредственное окно и ввести следующее: _? Создать Date.ToString («M/d/yyyy») _ и опубликовать свой результат здесь? Это в основном проблема с настройкой форматирования языка и даты (ну, я, кажется, слишком изощрен, чтобы делать это правильно, независимая настройка культуры). После того, как вы решите это, у вас должна быть запущенная программа – Amegon

+0

с новой тусклой дочерней строкой. Теперь я получаю сообщение об ошибке «Строка не была признана действительной DateTime. Неизвестное слово начинается с индекса 0.» Я даже не знаю, что такое ближайшее окно! Ha .. – Cliff

0

Так что давайте изменим следующее (и кстати.хорошая идея использовать дни/365):

Dim month As Integer = birthday.Month 
    Dim year As Integer = CInt(Date.Now.Subtract(birthday).TotalDays/365) 
    Birthdays(month).Add(name) 

вы хотите иметь 10 шагов в год, так разделите года от 10

Dim month As Integer = birthday.Month 
    Dim year As Integer = CInt(Date.Now.Subtract(birthday).TotalDays/365/10) 
    Birthdays(month).Add(name) 

, а также вы должны использовать эту информацию вычисленного года для чего-то. . позволяет заполнить другие поля :)

Dim month As Integer = birthday.Month 
    Dim year As Integer = CInt(Date.Now.Subtract(birthday).TotalDays/365/10) 
    Birthdays(month).Add(name) 
    Birthdays2(year).Add(name) 

Теперь проверка другой части ..

Private Sub lbMilestone_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbMilestone.SelectedIndexChanged 
    If lbMilestone.SelectedIndex < 0 Then Return 
    lbPerson2.Items.Clear() 
    Dim index As Integer = lbMilestone.SelectedIndex 
    For Each ele2 In Birthdays(index + 1) 
     lbPerson2.Items.Add(ele2) 
    Next 
End Sub 

Большинство из них правильно, но вы читали из «старого» списка месяцев

For Each ele2 In Birthdays(index + 1) 

так измените строку

For Each ele2 In Birthdays2(index + 1) 

, а также я думаю, что 10 должно представлять возраст 0-9 лет , поэтому, если щелкнуть первый элемент (индекс = 0), то должны быть возвращены лица от Birthdays2 (0). (= Удалить + 1)

For Each ele2 In Birthdays(index) 

поэтому метод должен выглядеть следующим образом:

Private Sub lbMilestone_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbMilestone.SelectedIndexChanged 
    If lbMilestone.SelectedIndex < 0 Then Return 
    lbPerson2.Items.Clear() 
    Dim index As Integer = lbMilestone.SelectedIndex 
    For Each ele2 In Birthdays(index) 
     lbPerson2.Items.Add(ele2) 
    Next 
End Sub 

Update

Изменить способ использовать другой суб:

 [...] 
     Dim dateString As String = Mid(line, datePos + 2) 'all after that last space is date 
     Dim name As String = Mid(line, 1, datePos).Trim ' all before that last space is name 
     'Dim birthday As Date = Convert.ToDateTime(parts(1).Trim) ' used this conversion before, but lets try the other way 
     AddUser(name, dateString) 
    Next 

End Sub 

a d здесь sub: (вы видите, что это почти 1: 1, за исключением Exit sub, поскольку для выхода из цикла нет цикла, но поскольку метод содержит весь код, выполняемый до конца цикла, exit sub здесь делает то же самое, что и для в предыдущей версии.

Private Sub AddUser(Name As String, dateString As String) 
    Dim birthday As Date 
    Try 
     birthday = DateTime.ParseExact(dateString, "M/d/yyyy", System.Globalization.CultureInfo.GetCultureInfo("en-US")) 
    Catch ex As Exception 
     Exit Sub 
    End Try 

    Dim month As Integer = birthday.Month 
    Birthdays(month).Add(Name) 

    Dim year As Integer = CInt(Date.Now.Subtract(birthday).TotalDays/356/10) 
    Birthdays2(year).Add(Name) 
End Sub 

теперь, когда пользователь вводит новые данные, вам просто нужно вызвать метод

AddUser("new name", "1/2/1934") 

или с переменным

AddUser(tbYour_name_textbox, tbYour_birthday_date_textbox) 
+0

Еще раз спасибо. Это действительно помогает, когда вы ломаете дело. Я снова редактировал свой код .. ха! Но по какой-то причине из-за округления каждый человек находится на одной вехе слишком высоко (поэтому люди, которые должны быть указаны в «10», отображаются в «20» и т. Д.). Dang, я так близко к гвоздю! Кто-то, кто равен 21, должен показать в «30» веху, вместо «20», поскольку 30 - следующая веха. Также я нахожусь в онлайн-режиме кнопки обновления, поэтому, когда пользователь вводит новое имя, программа сможет перезапустить так, чтобы говорить, чтобы показать новое имя в списке. Я дам вам знать, как я разобрался. – Cliff

+0

Я обновил свой ответ, чтобы изменить код для этого. Поскольку вы никогда не хотите писать строки кода, которые делают точно то же самое, мы помещаем часть (которая добавляет имя в список) в другой суб.Таким образом, мы можем вызвать его в том месте, где первоначально был код, а также вызвать код на новом месте (это та часть, на которую пользователь нажимает на добавление, после ввода имени и дня рождения). Если пользовательский cna выбирает день рождения, и это уже дата (вместо строки), затем переместите преобразование datestring обратно в часть sub_load и измените вызывающие параметры для adduser, чтобы принять дату вместо datestring – Amegon

Смежные вопросы