【问题标题】:How get? Updating table error: Parameter name: index怎么得到?更新表错误:参数名称:索引
【发布时间】:2014-03-14 06:21:38
【问题描述】:

我有两张桌子:

项目总数

ItemID (int)
ItemName (Nvarchar)
ItemNumbers (int)

项目:

ID (int)
ItemName (Nvarchar)
Numbers (int)
ItemID (int)

我在TotalItems 中的Items 为:

ItemID ItemName ItemNumbers 
1001    Item1       200 
1002    Item2       220
1003    Item3       230
1004    Item4       220
1005    Item5       200

我从 TotalItems 中选择 3 个 Items 并将它们添加到 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());

【问题讨论】:

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


    【解决方案1】:

    您的主要问题是您试图访问每一行中选定的单元格,除非用户选择了每个单独的单元格,否则这将不起作用;这就是您收到无效索引异常的原因。

    与其以这种方式遍历行,为什么不直接查看实际的底层数据结构呢?由于您在问题中包含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 的逻辑是什么,除了如果它没有通过验证,它不应该进入该行。

    【讨论】:

    • “a”发生了什么?
    • 我无法准确说出“a”是什么意思,因为我无法确定列在网格中的显示顺序,但我发布的代码应该说明这一点您可以通过字符串名称索引访问行中的任何属性。我已经编辑了帖子以使其更清晰。 @mhshojaei
    【解决方案2】:

    我用过这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2017-08-30
      • 2010-10-08
      • 1970-01-01
      相关资源
      最近更新 更多