2011-12-13 2 views
1

Я использую представление сетки asp.net для загрузки данных из таблицы данных sql. Я могу успешно загрузить данные.asp.net grid view bulk update all cells

Sql Таблица Desgin: 3 cloumns: Местоположение, Firstname, LastName

Расположение является первичным ключом.

Дизайн:

Aspxpage имеет GridView, который имеет две кнопки в нижней части:

  1. Edit
  2. Сохранить

Когда пользователь нажимает кнопку Редактировать все ячейки в GridView становятся редактируемыми, поэтому пользователь может редактировать и сохранять значения.

Проблема возникает с кнопкой сохранения, где я не могу сохранить отредактированные данные обратно в SQL.

Вот код для кнопки сохранения нажмите:

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    int RowIndex=0; 

    GridViewRow row = (GridViewRow)gvres.Rows[RowIndex]; 

    TextBox txtLanguage1 = row.FindControl("txtFName") as TextBox; 
    TextBox txtLanguage2 = row.FindControl("txtLName") as TextBox; 

    SqlConnection myConnection = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand("UPDATE UsersTable SET FirstName = @FirstName, LastName = @LastName WHERE Location = @Location", myConnection); 


    cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text.Trim()); 
    cmd.Parameters.AddWithValue("@LastName", txtLastName.Text.Trim()); 

    myConnection.Open(); 
    cmd.ExecuteNonQuery(); 
    gvusers.EditIndex = -1; 
    DataBind(); 
} 

Исключение: «Необходимо объявить скалярную переменную„@Location“.»

+0

@Location означает, что Insert/Update ожидает, что это поле будет передано/добавлено в ваши cmd.Parameters, где вы добавляете @Location ...? посмотрите на строку, где у вас есть это WHERE Location = @Location ", myConnection); add/declare cmd.Parameters.AddWithValue (" @ Location ", someLocationValue.Trim()); – MethodMan

+0

Переменная RowIndex жестко закодирована до 0, поэтому только первая строка будет обновлена.Если есть только 1 кнопка сохранения для всей сетки, это будет проблемой. –

+0

да, что я нашел сейчас. Идет только по первой строке ... Так как я прохожу через все строки и обновление. – Macnique

ответ

3

Вам нужно добавить параметр к объекту SqlCommand с именем «@Location». Вы указываете, что Location является одним из столбцов в вашей сетке - вы можете либо прочитать значение из столбца (подобно тому, как вы получаете значения первого и последнего имени), либо вы можете указать «Местоположение» в качестве ключа данных , и получить его из свойства DataKeys сетки.

Я бы посмотрел проект ASP.NET Real World Controls на Codeplex. Он позволяет осуществлять массовое редактирование и достаточно интеллектуально, чтобы обновлять только те строки, которые были изменены.

+0

было очень полезно. – Macnique

2
//@Location means that the Insert/Update expects that field to be passed in/added //to your cmd.Parameters where are you adding @Location...? 

// смотреть на линии, где у вас есть это, где Местонахождение = @Location», MyConnection); // Добавляем объявить cmd.Parameters.AddWithValue ("@ Местоположение", someLocationValue.Trim());

2
protected void btnSave_Click(object sender, EventArgs e) 
{ 
    int RowIndex=0; 

    GridViewRow row = (GridViewRow)gvres.Rows[RowIndex]; 

    TextBox txtLanguage1 = row.FindControl("txtFName") as TextBox; 
    TextBox txtLanguage2 = row.FindControl("txtLName") as TextBox; 
    TextBox txtLanguage3 = row.FindControl("txtLocation") as TextBox; 


    SqlConnection myConnection = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand("UPDATE UsersTable SET FirstName = @FirstName, LastName = @LastName WHERE Location = @Location", myConnection); 

cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text.Trim()); 
cmd.Parameters.AddWithValue("@LastName", txtLastName.Text.Trim()); 

cmd.Parameters.AddWithValue ("@ Местоположение", txtLocation.Text.Trim());

myConnection.Open(); 
cmd.ExecuteNonQuery(); 
gvusers.EditIndex = -1; 
DataBind(); 

}