2013-04-15 63 views
-3

我刚刚开始与LINQ到SQL。我正在努力将控制变量传递给delete语句。有人可以看看这个并指向正确的方向吗?如何在Linq查询中使用.FindControl?

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();   
} 
+0

什么是确切的转换错误? –

+4

这与Linq无关,只是分心。将问题简化为FindControl,ToString和int.Parse。 –

+0

也许你可以在你的上下文中详细描述你想要用FindControl做什么? –

回答

4

您的问题是存在的:

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

调用控件的ToString()方法将返回控制类型名称,而不是控制值。您必须将此控件投射到任何类型的控件,然后获取其中的值。让我们假设这是一个文本框:

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

就像一个魅力!我知道我很接近!真棒!谢谢!! – briskovich

0

这条线 -

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

将返回控制的对象类型为字符串。你或许应该把返回Control到要控制的类型,例如:

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)

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

这提出了验证输入的必要性。至少,您应该执行int.TryParse,因为您可能取决于用户对文本框的输入。