I have a feeling it's just a matter of rearranging a few lines but I can't figure it out myself. The idea behind this section of code is simple.
I have a listview that serves as an item bag, when you gain an item (through the use of another part of the program) it gets put into the listview. The listview has 3 columns: Item Name, Item Quality, and Sell Price. When you click the use button, it's supposed to find the selected item in the database, and assign it to a slot in the equipment screen based on the item class. However, a code layout that I've used before with no problem, is suddenly giving me problems.
Dim DbConnection As New OleDbConnection(DbString)
Dim ItemSelect As New OleDbCommand("SELECT * FROM [Item List] WHERE [Item Name] = ? AND [Item Quality] = ?", DbConnection)
Dim ItemNameParam As New OleDbParameter("?", OleDbType.VarChar)
ItemSelect.Parameters.Add(ItemNameParam)
Dim ItemQualityParam As New OleDbParameter("?", OleDbType.VarChar)
ItemSelect.Parameters.Add(ItemQualityParam)
Dim item As ListViewItem
Dim ItemClass As Integer
Dim itemda As New OleDbDataAdapter(ItemSelect)
Dim itemds As New DataSet
itemda.Fill(itemds, "Item List")
Dim itemdt As DataTable = itemds.Tables("Item List")
Dim itemrow As DataRow
If ItemBagList.SelectedItems.Count > 1 Then
MsgBox("You can only use/equip one item at a time")
ElseIf ItemBagList.SelectedItems.Count = 1 Then
For Each item In ItemBagList.SelectedItems
For Each itemrow In itemdt.Rows
ItemNameParam.Value = item.SubItems(0)
ItemQualityParam.Value = item.SubItems(1)
ItemClass = itemrow("Item Class")
If ItemClass = 2 Or ItemClass = 22 Then
EquipItems.HelmetEquip.Text = ItemNameParam.Value
EquipItems.HelmetQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 3 Or ItemClass = 23 Then
EquipItems.ArmorEquip.Text = ItemNameParam.Value
EquipItems.ArmorQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 4 Or ItemClass = 24 Then
EquipItems.LeggingsEquip.Text = ItemNameParam.Value
EquipItems.LeggingsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 5 Or ItemClass = 25 Then
EquipItems.BootsEquip.Text = ItemNameParam.Value
EquipItems.BootsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 6 Or ItemClass = 26 Then
EquipItems.GauntletsEquip.Text = ItemNameParam.Value
EquipItems.GauntletsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 29 Then
If EquipItems.RRingEquip.Text = "None" Then
EquipItems.RRingEquip.Text = ItemNameParam.Value
EquipItems.RRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf EquipItems.RRingEquip.Text <> "None" And EquipItems.LRingEquip.Text = "None" Then
EquipItems.LRingEquip.Text = ItemNameParam.Value
EquipItems.LRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf EquipItems.RRingEquip.Text <> "None" And EquipItems.LRingEquip.Text <> "None" Then
Dim RingEquip As DialogResult = MessageBox.Show("Click Yes to equip to right hand, click No to equip to left hand", _
"Important Query", MessageBoxButtons.YesNoCancel)
If RingEquip = DialogResult.Yes Then
EquipItems.RRingEquip.Text = ItemNameParam.Value
EquipItems.RRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf RingEquip = DialogResult.No Then
EquipItems.LRingEquip.Text = ItemNameParam.Value
EquipItems.LRingQuality.SelectedItem = ItemQualityParam.Value
End If
End If
ElseIf ItemClass = 30 Then
EquipItems.NecklaceEquip.Text = ItemNameParam.Value
EquipItems.NecklaceQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 31 Then
EquipItems.EarringEquip.Text = ItemNameParam.Value
EquipItems.EarringQuality.SelectedItem = ItemQualityParam
ElseIf ItemClass = 8 Or ItemClass = 10 Or ItemClass = 11 Or ItemClass = 13 Or ItemClass = 16 Or ItemClass = 17 Or ItemClass = 18 Then
Dim WepEquip As DialogResult = MessageBox.Show("Click Yes to equip to right hand, click No to equip to left hand", _
"Important Query", MessageBoxButtons.YesNoCancel)
If WepEquip = DialogResult.Yes Then
EquipItems.RWeaponEquip.Text = ItemNameParam.Value
ElseIf WepEquip = DialogResult.No Then
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
ElseIf WepEquip = DialogResult.Cancel Then
End If
ElseIf ItemClass = 9 Or ItemClass = 12 Or ItemClass = 14 Or ItemClass = 15 Then
EquipItems.RWeaponEquip.Text = ItemNameParam.Value
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
EquipItems.RWeaponQuality.Text = ItemQualityParam.Value
EquipItems.LWeaponQuality.Text = ItemQualityParam.Value
ElseIf ItemClass = 19 Or ItemClass = 20 Or ItemClass = 21 Then
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
EquipItems.LWeaponQuality.SelectedItem = ItemQualityParam
Else
For Each i As ListViewItem In ItemBagList.SelectedItems
i.Remove()
Next
End If
Next
Next
End If
When I run the debugger it points to the data adapter .Fill command and says that @ItemName has no default value. The only way it works is if the value is assigned before the .Fill command, but I can't put the values up there because item has no value up there. And I can't move the .Fill command down to the value call because dt needs to be filled before I can call on its rows. I am sure the answer is staring me in the face but I just don't see it.
EDIT: I found a way to fix the original problem but it generates another problem. I moved the da, ds, and dt calls inside the first For Each and moved the parameter value calls to the first For Each, so now the data adapter can see the values. However, it doesn't seem capable of comprehending the value.
Dim DbConnection As New OleDbConnection(DbString)
'creates the datatable for the Item List
Dim ItemSelect As New OleDbCommand("SELECT * FROM [Item List] WHERE [Item Name] = ? AND [Item Quality] = ?", DbConnection)
If ItemBagList.SelectedItems.Count > 1 Then
MsgBox("You can only use/equip one item at a time")
ElseIf ItemBagList.SelectedItems.Count = 1 Then
For Each item In ItemBagList.SelectedItems
Dim ItemNameParam As New OleDbParameter("?", OleDbType.VarChar)
ItemSelect.Parameters.Add(ItemNameParam)
Dim ItemQualityParam As New OleDbParameter("?", OleDbType.VarChar)
ItemSelect.Parameters.Add(ItemQualityParam)
ItemNameParam.Value = item.SubItems(0)
ItemQualityParam.Value = item.SubItems(1)
Dim ItemClass As Integer
Dim itemda As New OleDbDataAdapter(ItemSelect)
Dim itemds As New DataSet
itemda.Fill(itemds, "Item List")
Dim itemdt As DataTable = itemds.Tables("Item List")
Dim itemrow As DataRow
For Each itemrow In itemdt.Rows
ItemClass = itemrow("Item Class")
If ItemClass = 2 Or ItemClass = 22 Then
EquipItems.HelmetEquip.Text = ItemNameParam.Value
EquipItems.HelmetQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 3 Or ItemClass = 23 Then
EquipItems.ArmorEquip.Text = ItemNameParam.Value
EquipItems.ArmorQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 4 Or ItemClass = 24 Then
EquipItems.LeggingsEquip.Text = ItemNameParam.Value
EquipItems.LeggingsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 5 Or ItemClass = 25 Then
EquipItems.BootsEquip.Text = ItemNameParam.Value
EquipItems.BootsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 6 Or ItemClass = 26 Then
EquipItems.GauntletsEquip.Text = ItemNameParam.Value
EquipItems.GauntletsQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 29 Then
If EquipItems.RRingEquip.Text = "None" Then
EquipItems.RRingEquip.Text = ItemNameParam.Value
EquipItems.RRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf EquipItems.RRingEquip.Text <> "None" And EquipItems.LRingEquip.Text = "None" Then
EquipItems.LRingEquip.Text = ItemNameParam.Value
EquipItems.LRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf EquipItems.RRingEquip.Text <> "None" And EquipItems.LRingEquip.Text <> "None" Then
Dim RingEquip As DialogResult = MessageBox.Show("Click Yes to equip to right hand, click No to equip to left hand", _
"Important Query", MessageBoxButtons.YesNoCancel)
If RingEquip = DialogResult.Yes Then
EquipItems.RRingEquip.Text = ItemNameParam.Value
EquipItems.RRingQuality.SelectedItem = ItemQualityParam.Value
ElseIf RingEquip = DialogResult.No Then
EquipItems.LRingEquip.Text = ItemNameParam.Value
EquipItems.LRingQuality.SelectedItem = ItemQualityParam.Value
End If
End If
ElseIf ItemClass = 30 Then
EquipItems.NecklaceEquip.Text = ItemNameParam.Value
EquipItems.NecklaceQuality.SelectedItem = ItemQualityParam.Value
ElseIf ItemClass = 31 Then
EquipItems.EarringEquip.Text = ItemNameParam.Value
EquipItems.EarringQuality.SelectedItem = ItemQualityParam
ElseIf ItemClass = 8 Or ItemClass = 10 Or ItemClass = 11 Or ItemClass = 13 Or ItemClass = 16 Or ItemClass = 17 Or ItemClass = 18 Then
Dim WepEquip As DialogResult = MessageBox.Show("Click Yes to equip to right hand, click No to equip to left hand", _
"Important Query", MessageBoxButtons.YesNoCancel)
If WepEquip = DialogResult.Yes Then
EquipItems.RWeaponEquip.Text = ItemNameParam.Value
ElseIf WepEquip = DialogResult.No Then
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
ElseIf WepEquip = DialogResult.Cancel Then
End If
ElseIf ItemClass = 9 Or ItemClass = 12 Or ItemClass = 14 Or ItemClass = 15 Then
EquipItems.RWeaponEquip.Text = ItemNameParam.Value
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
EquipItems.RWeaponQuality.Text = ItemQualityParam.Value
EquipItems.LWeaponQuality.Text = ItemQualityParam.Value
ElseIf ItemClass = 19 Or ItemClass = 20 Or ItemClass = 21 Then
EquipItems.LWeaponEquip.Text = ItemNameParam.Value
EquipItems.LWeaponQuality.SelectedItem = ItemQualityParam
Else
For Each i As ListViewItem In ItemBagList.SelectedItems
i.Remove()
Next
End If
Next
Next
End If