我刚刚开始使用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();
}
答案 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
,因为您可能依赖于文本框的用户输入。