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
,并将它们添加到wpfDataGrid
中,作为: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