2013-04-15 103 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,因爲您可能取決於用戶對文本框的輸入。