Member 12561559 Ответов: 2

Что - то странное- моя ошибка или ошибка Microsoft?


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

Я использую VS2017, VB.NET, Winforms и фреймворк 4.8

Я успешно использую этот класс в течение нескольких лет, он использовался как .itemdata для .net для combobox/listboxes и т. д..

Поэтому создайте новый проект winforms, добавьте новый класс и вставьте ниже, перезаписав предварительно сгенерированный код класса.


Public Class Mylist
    Private sName As String
    ' You can also declare this as String,bitmap or almost anything. 
    ' If you change this delcaration you will also need to change the Sub New 
    ' to reflect any change. Also the ItemData Property will need to be updated. 
    Private iID As String

    ' Default empty constructor. 
    Friend Sub New()
        sName = ""
        ' This would need to be changed if you modified the declaration above. 
        iID = ""
    End Sub

    Friend Sub New(ByVal Name As String,
                   ByVal ID As String)

        sName = Name
        iID = ID
    End Sub

    Public Property Name() As String
        Get
            Return sName
        End Get
        Set(ByVal sValue As String)
            sName = sValue
        End Set
    End Property

    ' This is the property that holds the extra data. 
    Public Property ItemData() As String
        Get
            Return iID
        End Get
        Set(ByVal iValue As String)
            iID = iValue
        End Set
    End Property

    ' This is neccessary because the ListBox and ComboBox rely 
    ' on this method when determining the text to display. 
    Public Overrides Function ToString() As String
        Return sName
    End Function

End Class



Падение компонент ComboBox на форму form1, установите его в dropdownlist для

Теперь в подзаголовок Form1_Load вставьте вот это:
(это элемент со значением, равным количеству минут против этого элемента, то есть 1 день равен 1440 минутам) и так далее.

With ComboBox1
    .Items.Add(New Mylist("1 Day only", "1440"))
    .Items.Add(New Mylist("2 Days only", "2880"))
    .Items.Add(New Mylist("4 Days only", "5760"))
    .Items.Add(New Mylist("1 Week only", "10080"))
    .Items.Add(New Mylist("2 Weeks only", "20160"))
    .Items.Add(New Mylist("4 Weeks only", "40320"))
    .Items.Add(New Mylist("2 Months only", "86400"))
    .Items.Add(New Mylist("3 Months only", "129600"))
    .Items.Add(New Mylist("6 Months only", "262800"))
    .Items.Add(New Mylist("1 Year only", "525600"))
    .Items.Add(New Mylist("2 Years only", "1051200"))
    .Items.Add(New Mylist("3 Years only", "1576800‬"))
    .Items.Add(New Mylist("5 Years only", "2628000"))
    .Items.Add(New Mylist("7 Years only", "3679200‬"))
    .Items.Add(New Mylist("10 Years only", "5256000"))
    .Items.Add(New Mylist("Accumulative Indefinitely/Forever", "0"))
End With


и, наконец, вставьте это в ComboBox1_SelectedIndexChanged sub


Dim Mlist As Mylist
       Dim RecID As Int64 = 0

       Mlist = CType(ComboBox1.SelectedItem, Mylist)
       'RecID = Convert.ToInt64(Mlist.ItemData)
       MsgBox(Convert.ToInt64(Mlist.ItemData))
       'MsgBox(Convert.ToInt64(Mlist.ItemData))




Закомментированный код выше, я пытался выяснить, имеет ли этот бит кода комментированный/раскомментированный какое-либо значение, и это не так.



Итак, теперь запустите проект, у вас есть куча элементов под выпадающим списком, выберите один или два из первых элементов, и соответствующие минуты появятся в соответствии с новым классом mylist.

Теперь выберите 1 год... все в порядке, да?
Выберите 2 года... все в порядке, да?
Теперь пропустите и выберите 5 лет - все ок -да
Вернитесь назад и выберите 3 года ... бум !

Теперь выберите 10 лет ... все в порядке
Теперь выберите 7 лет ... бум !

Какого черта это происходит?


Теперь вы можете сказать - почему бы просто не изменить класс mylist и не сделать идентификаторы int64, в конце концов, эти itemdata-это всего лишь числа.

Ну что ж - продолжайте :)

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

"Запятая, ')' или ожидаемое продолжение допустимого выражения." ошибки плюс "символ недопустим" и угадайте где ??? на отметках 3 года и 5 лет, а не на отметках 6 лет или 10 лет, которые имеют еще более высокие числовые значения

Теперь я знаю, что, вероятно, спал около 18 часов на прошлой неделе, но я не думаю, что схожу с ума - не так ли ? :P

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

Что я уже пробовал:

Изменение класса со string на int64

phil.o

Пожалуйста, дайте определение слову "бум".

Member 12561559

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

phil.o

Пожалуйста, когда вы подробно описываете проблему, используйте точное сообщение об ошибке в первую очередь.

Richard MacCutchan

Действительно ли слишком сложно дать правильное техническое объяснение, включающее точный текст ошибки или исключения?

2 Ответов

Рейтинг:
12

OriginalGriff

Это твоя вина.
Существует "скрытый символ" в строке "3 года" (и, вероятно, некоторые другие) между последним символом и закрывающей двойной кавычкой.
Проверьте сами: перейдите к исходному коду, поместите текстовый курсор в конец строки:

.Items.Add(New Mylist("3 Months only", "129600"))

Курсор оставил один символ. Под этим ), да?
Курсор оставил один символ. Под этим ), да?
Курсор оставил один символ. Под ", Да?
Курсор оставил один символ. Под 0, да? Что значит "нет"? Сделай это еще раз! Ах, на этот раз он ниже нуля!
Попробуйте переместить курсор, и вы увидите, что в конце строки есть символ нулевой ширины.
Удалите это и то, что находится в строке "7 лет", и оно должно работать нормально.


Теперь все, что тебе нужно сделать, это понять, как ты их туда запихнул ... :смеяться:


Member 12561559

Черт возьми ! Я могу только думать, что они пришли от меня, набрав их в windows 10 Calc и copy paste, а затем удалив", " между миллионами и сотнями тысяч. Хороший наблюдательный парень - я думал, что схожу с ума !!!! смеется. Спасибо! Я скоро смогу вернуться в постель.

OriginalGriff

Всегда пожалуйста!

Maciej Los

Потрясающая инспекция.
Родился новый Шерлок Холмс.

OriginalGriff

Я вижу мертвых персонажей ...

Maciej Los

:смеяться:

Рейтинг:
0

phil.o

Итак, очевидно, у вас есть проблема с синтаксическим анализом.
Первое что нужно сделать это правильно разобрать строку:

Dim Mlist As Mylist = CType(ComboBox1.SelectedItem, Mylist)
Dim RecID As Int64
If (Int64.TryParse(Mlist.ItemData, RecID))
   MsgBox(RecID)
Else
   MsgBox(Mlist.ItemData + " could not be properly parsed.")
End If
Convert класс-это просто динозавр, которому удалось выжить до сих пор, но которого следует избегать как можно больше. По крайней мере, для встроенных типов чисел, Parse и TryParse методы должны быть предпочтительными (особенно TryParse когда вы хотите проверить исходную строку).

В качестве примечания, почему бы не использовать правильный тип (Int64) для ItemData собственность? Это не только позволит вам избавиться от кода синтаксического анализа, но и значительно облегчит использование памяти, если вы будете иметь их много в памяти.


Member 12561559

Я начну использовать Parse/Tryparse больше, чем convert - спасибо за headsup - re. Int64 в классе, я действительно сделал это, но это все равно не сработало - какой-то хитрый символ там, который пришел "откуда-то". :S но разбор/tryparse - да - это большой палец от меня Фил

phil.o

Я могу только пальцем вверх вернуться к этому :)