我有两张桌子:
TotalItems :
ItemID (int)
ItemName (Nvarchar)
ItemNumbers (int)
项目:
ID (int)
ItemName (Nvarchar)
Numbers (int)
ItemID (int)
Items
中的TotalItems
作为:
ItemID ItemName ItemNumbers
1001 Item1 200
1002 Item2 220
1003 Item3 230
1004 Item4 220
1005 Item5 200
我从Items
中选择3 TotalItems
并将其添加到wpf DataGrid
中,其中包括:
ID ItemName Numbers ItemID
1 Item1 2 1001
2 Item2 3 1003
3 Item5 6 1005
我想将它们保存到Items
,以便ItemNumbers
必须更新为:
Item1: 200 - 2 = 198
Item2: 220 - 3 = 217
Item5: 200 - 6 = 194
最后,在TotalItems
中我们必须:
ItemID ItemName ItemNumbers
1001 Item1 198
1002 Item2 217
1003 Item3 230
1004 Item4 220
1005 Item5 194
// snippet for update of TotalItems
for (int i = 0; i < gridItem.Items.Count - 1; i++)
{
DataBase db = new DataBase();
DataTable dt = new DataTable();
string a = gridItem.SelectedCells[2].ToString();
int b=0;
b = Convert.ToInt32(gridItem.SelectedCells[3].IsValid.ToString());
int count, c;
c = int.parse(comboBox1.Text);
count = c-b;
//Updating TotalItems table:
db.DoCommand("update TotalItems set ItemNumbers='" + count.ToString() + "'where ItemName='" + a + "'");
}
我的问题是(指定的参数超出了有效值的范围。
参数名称:index ):
string a = gridItem.SelectedCells[2].ToString();
和
b = Convert.ToInt32(gridItem.SelectedCells[3].IsValid.ToString());
答案 0 :(得分:0)
你的主要问题是你试图访问每一行中的选定单元格,除非用户选择了每个单独的单元格,否则这将无效。这就是为什么你得到一个无效的索引异常。
不是以这种方式循环遍历行,为什么不只看实际的底层数据结构呢?由于您在问题中添加了DataTable
,请尝试以下操作:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
try
{
DataBase db = new DataBase();
foreach (var row in gridItems.Items.Cast<DataRowView>())
{
int count;
if (!int.TryParse(comboBox1.Text, out count))
{
// Log error
}
int b = (int) row["PropertyNameNotIndex"];
int totalCount = count - b;
int itemId = (int) row["ItemId"];
db.DoCommand("update TotalItems set ItemNumbers='" + count.ToString() + "'where ItemName='" + row["ItemName"].ToString() + "'");
}
}
catch (Exception ex)
{
// Handle DB connection errors, etc
}
}
请注意,索引是在属性/列名称上完成的,这将更具可读性和可维护性。我不确定你检查IsValid的逻辑是什么,除非它没有通过验证就不应该进入行。
答案 1 :(得分:0)
我用过这个:
private void btnSave_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < gridItem.Items.Count - 1; i++)
{
DataRowView drv = gridItem.Items[i] as DataRowView;
string a = drv[3].ToString();
dt = db.MySelect("select ItemNumbers from TotalItems where ItemName='" + a + "'");
comboBox1.ItemsSource = dt.DefaultView;
comboBox1.DisplayMemberPath = "ItemNumbers";
comboBox1.SelectedValuePath = "ItemNumbers";
int b = 0;
b = Convert.ToInt32(drv[4]);
int c, count;
int.TryParse(comboBox1.Text, out c);
count = c - b;
db.DoCommand("update TotalItems set ItemNumbers='" + count.ToString() + "' where ItemName='" + a + "'");
}
MessageBox.Show("Inserted");
}