C# 你怎么得到的?更新表错误:参数名称:索引

C# 你怎么得到的?更新表错误:参数名称:索引,c#,sql-server,wpf,visual-studio,datagrid,C#,Sql Server,Wpf,Visual Studio,Datagrid,我有两张桌子: 项目总数: 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 23

我有两张桌子:

项目总数

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
ID  ItemName    Numbers     ItemID
1   Item1         2          1001
2   Item2         3          1003
3   Item5         6          1005
我从
TotalItems
中选择3个
Items
,并将它们添加到wpf
DataGrid
中,作为:

ItemID ItemName ItemNumbers 
1001    Item1       200 
1002    Item2       220
1003    Item3       230
1004    Item4       220
1005    Item5       200
ID  ItemName    Numbers     ItemID
1   Item1         2          1001
2   Item2         3          1003
3   Item5         6          1005
我想将它们保存到
项目中
,以便
项目编号
必须更新为:

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 + "'");
    }

b = Convert.ToInt32(gridItem.SelectedCells[3].IsValid.ToString());

您的主要问题是您试图访问每一行中的选定单元格,除非用户选择了每一个单元格,否则将无法工作;这就是为什么会出现无效的索引异常

与其以这种方式循环行,为什么不只查看实际的底层数据结构呢?由于问题中包含了一个
数据表
,请尝试以下操作:

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
    }
}
private void按钮base\u OnClick(对象发送方,路由目标)
{
尝试
{
数据库db=新数据库();
foreach(gridItems.Items.Cast()中的变量行)
{
整数计数;
如果(!int.TryParse(comboBox1.Text,超出计数))
{
//日志错误
}
int b=(int)行[“PropertyNameNotIndex”];
int totalCount=计数-b;
int itemId=(int)行[“itemId”];
db.DoCommand(“update TotalItems set ItemNumber=”+count.ToString()+“'where ItemName=”+row[“ItemName”].ToString()+”;
}
}
捕获(例外情况除外)
{
//处理数据库连接错误等
}
}
请注意,索引是在属性/列名上完成的,这将更易于阅读和维护。我不确定您的逻辑是什么,检查是否有效,只是如果它没有通过验证,就不应该进入行。

我使用了以下方法:

 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");
        }
private void btnSave\u单击(对象发送方,路由目标)
{
对于(int i=0;i
a发生了什么事?我不能确切地说出a代表什么,因为我不能说出列在网格中的显示顺序,但我发布的代码应该说明,通过字符串名称索引可以访问行中的任何属性。我对这篇文章进行了编辑,使之更清楚@mhshojaei