-3

我刚开始使用 Linq to sql。我正在努力将控制变量传递到删除语句中。有人可以看看这个并指出我正确的方向吗?

 protected void Delete_Click(object sender, EventArgs e)
{
    NorthwindDataContext db = new NorthwindDataContext();


    foreach (GridViewRow row in GridView1.Rows)
    {
        if (((CheckBox)row.FindControl("CheckBox1")).Checked)
        {
           string prod_id = row.FindControl("lbl_id").ToString();

           Product product = (from p in db.Products 
                                  where p.ProductID == int.Parse(prod_id) // <-- I get conversion errors here!!
                                  select p).Single(); 

           db.Products.DeleteOnSubmit(product);

           db.SubmitChanges();


        }
    }

    ShowProducts();        
}
4

2 回答 2

4

你的问题在那里:

string prod_id = row.FindControl("lbl_id").ToString();

在控件上调用 ToString() 方法将返回控件类型名称,而不是控件值。您必须将此控件转换为任何类型,然后获取其中的值。假设它是一个文本框:

string prod_id = ((TextBox)row.FindControl("lbl_id")).Text;
于 2013-04-15T16:36:36.867 回答
0

这一行——

string prod_id = row.FindControl("lbl_id").ToString();

将控件对象类型作为字符串返回。您可能应该将 returnControl转换为您想要的控件类型,例如:

string prod_id = ((TextBox)row.FindControl("lbl_id")).Text;  

正如其他人所说,问题不在于 Linq,而在于您对该FindControl方法的处理。

所以你可以进一步了解发生了什么 - 假设我们使用TextBox上面的控件......

   Product product = (from p in db.Products 
                      where p.ProductID == int.Parse(prod_id) // <-- I get conversion errors here!!
                      select p).Single(); 

根据当前使用情况,FindControl("lbl_id").ToString()返回

“System.Windows.Forms.TextBox”

显然,这将失败int.Parse(prod_id)

通过更改代码以正确地将控件转换为预期的 TextBox,然后检索 Text 属性 - 例如“1”,您现在可以将字符串“1”解析为正确的整数值。

这带来了验证您的输入的必要性。至少,您应该实施,int.TryParse因为您可能依赖于用户对文本框的输入。

于 2013-04-15T16:39:03.500 回答