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

  • 如果我在第一行单击编辑和更新,我会得到:

    你调用的对象是空的。

  • 如果我单击第二行上的编辑和更新,我会从第一行获取值。
有没有什么办法解决这一问题?

4

2 回答 2

1

更改int sd = GridView1.EditIndex;int sd = GridView1.EditIndex + 1;

更好的方法是使用 gridview 的 datakeynames 属性。

在 gridview 上设置datakeyname="id"将允许您检索 Idint Id = Convert.ToInt32(GridView1.DataKeys[Gridview1.EditIndex].Values[0])

与创建对象并将其设置为包含 id 的行中的控件以检索其值相比,这将使用更少的开销。有关实现数据键名的进一步阅读,请参阅链接。

我还建议使用System.Data.SqlClient.SqlCommandSQL 方法并通过参数添加 Id。这将有助于防止注入攻击。

于 2012-05-26T13:19:10.840 回答
0

您使用了错误的 ID。EditIndex 是指您正在编辑的项目的行号。您必须从绑定的实体中获取 ID 并传递它。

我不完全确定你想用你的 SQL 做什么,但这并不重要。SQL 表有一个 ID 字段,看起来该 ID 值已绑定到您的 GridView,可能使用标签。您必须通过使用 RowIndex 来获取该 ID 以传递到您的 SQL 语句,因为您的 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 回答