Словарь делает значение для всех ключей равным самому последнему добавлению ключа/значения

Я пытаюсь добавить некоторые элементы в объект словаря (идентификатор базы данных и пара значений), чтобы пользователь мог подтвердить свой выбор перед фиксацией. У меня есть следующий раздел кода, который добавляет элемент в словарь. После добавления я перебираю Dictionary.Keys и печатаю каждый ключ/значение в список, чтобы пользователь мог его увидеть. Мой объект словаря является общедоступной переменной в моей форме и устанавливается в событии Form_Load.

Dim PickListID As Integer
If txtPercentOfStream <> "" Then
    PickListID = cboCoalTypes
    If Not CoalsInStreamDic.Exists(PickListID) Then
        CoalsInStreamDic.Add PickListID, txtPercentOfStream
    End If
Else
    Exit Sub
End If

Странно то, что всякий раз, когда я добавляю новую пару ключ/значение, значение для нового ключа становится значением для всех существующих ключей в дополнение к новому ключу.

Я запускаю этот небольшой блок до и после взаимодействия со словарем

Dim key As Variant
For Each key In CoalsInStreamDic.Keys
    Debug.Print key & "::" & CoalsInStreamDic.item(key)
Next key
Debug.Print

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

Почему это происходит?


person Brad    schedule 10.07.2012    source источник


Ответы (1)


Проблема в том, что вы не добавляете текст TextBox, а вместо этого TextBox

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

If txtPercentOfStream <> "" Then
    Dim PickListID As Integer, PercentOfStream As Integer
    PercentOfStream = txtPercentOfStream
    PickListID = cboCoalTypes
    If Not CoalsInStreamDic.Exists(PickListID) Then
        CoalsInStreamDic.Add PickListID, PercentOfStream
    End If
Else
    Exit Sub
End If
person Patrick McDonald    schedule 10.07.2012
comment
Ах, это имеет смысл! Единственная проблема заключается в том, что использование txtPercentOfStream.Text дает эту ошибку. Вы не можете ссылаться на свойство или метод для элемента управления, если элемент управления не имеет фокуса. Поэтому я сделал Dim PercentOfStream As Integer, затем PercentOfStream = txtPercentOfStream и добавил PercentOfStream в свой словарь. - person Brad; 10.07.2012
comment
Другой способ сделать это - вместо этого вызвать txtPercentOfStream.Value. Свойство .Text неудобно использовать, и его вызов почти никогда не выполним. - person Brad; 10.07.2012
comment
Извините, только сейчас увидел эти комментарии, я рад, что вы решили свою проблему, и я обновлю свой ответ вашими комментариями. - person Patrick McDonald; 11.07.2012
comment
Спасибо, выглядит хорошо. Я только что сделал еще одно исправление: начальный if сравнивал целое число со строкой, я изменил условие, чтобы посмотреть на текстовое поле, а затем назначить текстовое поле целому числу PercentOfStream - person Brad; 11.07.2012