2013-08-29 2 views
0

У меня есть простой gridview, 2 столбца. Первый столбец - это числовое значение. Второй столбец основан на выбранном значении из выпадающего списка. У меня есть раскрывающийся список, но когда я иду обновлять таблицу, я получаю сообщение об ошибке: Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индексполучить значение в запросе из режима редактирования в gridview

Нарушитель линия 55

Line 53:   { 
Line 54:    string BU = (gvSummary.Rows[e.RowIndex].FindControl("dlBU") as DropDownList).SelectedItem.Value; 
Line 55:    string AnnoNum = gvSummary.DataKeys[e.RowIndex].Value.ToString(); 

и здесь приведен код для веб-формы:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 
using System.Data.SqlClient; 
using System.Web.Security; 
using System.Configuration; 

namespace SHCAnnotation 
{ 
    public partial class WebForm2 : System.Web.UI.Page 
    { 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       this.BindData(); 
      } 
     } 

     protected void EditSummary(object sender, GridViewEditEventArgs e) 
     { 
      gvSummary.EditIndex = e.NewEditIndex; 
      BindData(); 
     } 

     protected void CancelEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
      gvSummary.EditIndex = -1; 
      BindData(); 
     } 

     protected void RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow && gvSummary.EditIndex == e.Row.RowIndex) 
      { 
       DropDownList dlBU = (DropDownList)e.Row.FindControl("dlBU"); 
       string query = "select distinct Unit from vw_KmartBU"; 
       SqlCommand cmd = new SqlCommand(query); 
       dlBU.DataSource = GetData(cmd); 
       dlBU.DataTextField = "Unit"; 
       dlBU.DataValueField = "Unit"; 
       dlBU.DataBind(); 
       //dlBU.Items.FindByValue((e.Row.FindControl("lblBU") as Label).Text).Selected = true; 
      } 
     } 

     protected void UpdateSummary(object sender, GridViewUpdateEventArgs e) 
     { 
      string BU = (gvSummary.Rows[e.RowIndex].FindControl("dlBU") as DropDownList).SelectedItem.Value; 
      string AnnoNum = gvSummary.DataKeys[e.RowIndex].Value.ToString(); 
      string strConnString = ConfigurationManager.ConnectionStrings["SRM_MetricConnectionString"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(strConnString)) 
      { 
       string query = "update vw_GridviewSource set [Business Unit] = @BU where [Annotation Number] = @AnnoNum"; 
       using (SqlCommand cmd = new SqlCommand(query)) 
       { 
        cmd.Connection = con; 
        cmd.Parameters.AddWithValue("@BU", BU); 
        cmd.Parameters.AddWithValue("@AnnoNum", AnnoNum); 


        con.Open(); 
        cmd.ExecuteNonQuery(); 
        con.Close(); 
        Response.Redirect(Request.Url.AbsoluteUri); 
       } 
      } 
     } 




     private void BindData() 
     { 
      string query = "select [Annotation Number], [Business Unit] as Unit from vw_GridviewSource"; 
      SqlCommand cmd = new SqlCommand(query); 
      gvSummary.DataSource = GetData(cmd); 
      gvSummary.DataBind(); 
     } 

     private DataTable GetData(SqlCommand cmd) 
     { 
      string strConnString = ConfigurationManager.ConnectionStrings["SRM_MetricConnectionString"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(strConnString)) 
      { 
       using (SqlDataAdapter sda = new SqlDataAdapter()) 
       { 
        cmd.Connection = con; 
        sda.SelectCommand = cmd; 
        using (DataTable dt = new DataTable()) 
        { 
         sda.Fill(dt); 
         return dt; 
        } 
       } 
      } 
     } 

    } 
} 

Что мне нужно сделать, это получить значение в первой столбец «Номер аннотации» и использовать его в разделе where моего обновления. Поэтому мне нужно было бы обновить vw_GridviewSource set [Business Unit] = 'Accessories', где [Annotation Number] = '123456'

Принадлежности были бы выбором из выпадающего списка, а 123456 - в текстовом поле, когда я выбрана эта строка для редактирования.

ответ

0

Отсутствует ваше gridview DataKeyNames. Он может выглядеть так:

<asp:GridView ID="gvSummary" 
    runat="server" 
    AutoGenerateColumns="False" 
    DataKeyNames="AnnoNum, MyOtherKey1, MyOtherKey2" 
    ... ... ... 

Свойство DataKeyNames представляет собой массив строк. Вы можете найти более подробную информацию: MSDN

+0

Могу ли я указать более одного? У меня есть gridview, который имеет несколько столбцов, которые идентифицируют уникальную строку в базе данных. –

+0

Несомненно, см. Мой обновленный ответ. – afzalulh