怎么弄?更新表错误:参数名称:索引

时间:2014-02-14 18:35:59

标签: c# sql-server wpf visual-studio datagrid

我有两张桌子:

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());

2 个答案:

答案 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");
        }