-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() メソッドを呼び出すと、コントロールの値ではなく、コントロールの型名が返されます。このコントロールをそのタイプにキャストしてから、値を取得する必要があります。それが textbox だとしましょう:

string prod_id = ((TextBox)row.FindControl("lbl_id")).Text;
于 2013-04-15T16:36:36.867 に答える
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テキスト ボックスへのユーザー入力に依存する可能性があるため、実装する必要があります。

于 2013-04-15T16:39:03.500 に答える