0

問題は、次の行からのみ特定の行の値にアクセスできることです。コードは次のとおりです。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int s = GridView1.EditIndex;
            string constr = "con string";
            string statment = "Select Name from tb1 Where [ID] = " + s;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand comm = new SqlCommand(statment, con))
                {
                    con.Open();
                    Label2.Text = comm.ExecuteScalar().ToString();
                    con.Close();
                }
            }
        }

例えば:

                   ID   Name
Edit Delete Select  1   JOhn 
Edit Delete Select  2   SMith

  • 最初の行で編集と更新をクリックすると、次のようになります。

    オブジェクト参照がオブジェクト インスタンスに設定されていません。

  • 2 行目の edit and update をクリックすると、1 行目の値が取得されます。
これを修正する方法はありますか?

4

2 に答える 2

1

int sd = GridView1.EditIndex;に変更int sd = GridView1.EditIndex + 1;

より良い方法は、グリッドビューの datakeynames プロパティを使用することです。

グリッドビューで設定datakeyname="id"すると、IDを取得できますint Id = Convert.ToInt32(GridView1.DataKeys[Gridview1.EditIndex].Values[0])

これは、オブジェクトを作成し、ID を含む行のコントロールに設定してその値を取得するよりも、使用するオーバーヘッドが少なくなります。datakeynames の実装に関する詳細については、リンクを参照してください。

System.Data.SqlClient.SqlCommandSQL メソッドに を使用し、パラメーターを介して ID を追加することもお勧めします。これは、インジェクション攻撃を防ぐのに役立ちます。

于 2012-05-26T13:19:10.840 に答える
0

間違った ID を使用しています。EditIndex は、編集中のアイテムの ROW 番号を参照します。バインドされたエンティティから ID を取得し、代わりにそれを渡す必要があります。

SQL で何をしようとしているのか完全にはわかりませんが、それは問題ではありません。SQL テーブルには ID フィールドがあり、おそらくラベルを使用して、ID 値が GridView にバインドされているようです。SQL テーブルの ID が行インデックスに一致する必要がない場合があるため、RowIndex を使用して SQL ステートメントに渡すことにより、その ID を取得する必要があります。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
  // get the row being updated
  GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];

  // use the FindControl method to retrieve the control holding the ID
  Label lbl = (Label)row.FindControl("lblid");

  // you can find other controls as needed using the same method
  TextBox tb1 = (TextBox)row.FindControl("textbox1");
  TextBox tb2 = (TextBox)row.FindControl("textbox2");

  // perform the SQL update, or whatever using the ID (here's your original code)

  string constr = "con string";          
  string statment = "Select Name from tb1 Where [ID] = " + lbl.Text;          
  using (SqlConnection con = new SqlConnection(constr))          
  {          
    using (SqlCommand comm = new SqlCommand(statment, con))          
    {          
      con.Open();          
      Label2.Text = comm.ExecuteScalar().ToString();          
      con.Close();          
    }          
  } 
}
于 2012-05-26T13:21:17.863 に答える