如何在Linq查询中使用.FindControl?

时间:2013-04-15 16:32:26

标签: c# linq linq-to-sql

我刚刚开始使用Linq来实现sql。我正在努力将控制变量传递给delete语句。有人可以看看这个并指出我正确的方向吗?

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

2 个答案:

答案 0 :(得分:4)

你的问题在那里:

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

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

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

答案 1 :(得分: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)会失败。

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

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