2016-11-18 5 views
0

Here is the image of the UI Я начинающий здесь, на asp.net. Я надеялся спросить, знаете ли вы, как решить мою проблему. У меня есть кнопка удаления, которая удаляет отмеченные флажки в моем datagridview. Каждый раз, когда я запускаю код, он дает мне аргумент вне диапазона (индекс за пределами диапазона) в коде int id = Convert.ToInt32(brandgrid.DataKeys[row.RowIndex].Values[0]);?Ошибка ASP.NET GridView DataKeys - Аргумент за пределами диапазона индекса за пределами допустимого диапазона

  foreach (GridViewRow row in brandgrid.Rows) 
      { 

       int id = Convert.ToInt32(brandgrid.DataKeys[row.RowIndex].Values[0]); 

       CheckBox chkdel = (CheckBox)row.FindControl("chkDel"); 
       if(chkdel.Checked) 
        { 
         //int id = Convert.ToInt32(row.Cells[0].Text); 
         SqlCommand cmd = new SqlCommand(); 
         cmd.CommandType = CommandType.StoredProcedure; 
         cmd.CommandText = "usp_Brand_Delete"; 
         cmd.Parameters.AddWithValue("@login", current); 
         cmd.Parameters.AddWithValue("@id", id); 
         cmd.Connection = sqlCon; 

         sqlCon.Open(); 
         cmd.ExecuteNonQuery(); 
         sqlCon.Close(); 
        } 
      } 

     } 
+0

Вы можете оставить 'GridView' на странице ASPX? – Aruna

+0

Jetlag

+0

ли ваш GridView заполнены первым? Вы проверили, случайно ли в нем нет столбцов. Вы отлаживали его? Каковы числа строк и столбцов перед выполнением этой части кода? –

ответ

0

Хорошо, Ваш GridView ниже, это подтверждает, что вы не установили DataKeyNames свойство в GridView и так, его бросали ошибки, как вы сказали выше.

<asp:GridView ID="brandgrid" runat="server" GridLines="None" AllowPaging="True" CssClass="mGrid" ShowHeaderWhenEmpty="True" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" DataSourceID="SqlDataSource1"> 
    <AlternatingRowStyle CssClass="alt"></AlternatingRowStyle> 
    <PagerStyle CssClass="pgr"> 
    </PagerStyle> 
</asp:GridView> 

Из MSDN,

Когда свойство DataKeyNames установлен, то GridView управления автоматически создает объект DataKey для каждой строки в элементе управления. Объект DataKey содержит значения поля или полей , указанные в свойстве DataKeyNames. Объекты DataKey затем добавляются в коллекцию DataKeys элемента управления . Используйте свойство DataKeys для извлечения объекта DataKey для определенной строки данных в элементе управления GridView .

Чтобы получить информацию об этом объекте вам необходимо установить DataKeyNames="<ID column name>" в GridView.

Я добавил DataKeyNames="id" свойство ниже в вашем GridView при условии, что имя столбца - ID, но вы должны его проверить и изменить.

<asp:GridView ID="brandgrid" runat="server" DataKeyNames="id" GridLines="None" AllowPaging="True" CssClass="mGrid" ShowHeaderWhenEmpty="True" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" DataSourceID="SqlDataSource1"> 
    <AlternatingRowStyle CssClass="alt"></AlternatingRowStyle> 
    <PagerStyle CssClass="pgr"> 
    </PagerStyle> 
</asp:GridView> 

изменить Кроме того, ваш код, как показано ниже,

foreach (GridViewRow row in brandgrid.Rows) 
{ 
    if(row.RowType == DataControlRowType.DataRow) 
    { 
      var dataKey = brandgrid.DataKeys[row.RowIndex].Value; 
      if(dataKey != null) 
      { 
       int id = (int)dataKey; 

       CheckBox chkdel = (CheckBox)row.FindControl("chkDel"); 
       if(chkdel.Checked) 
        { 
         //int id = Convert.ToInt32(row.Cells[0].Text); 
         SqlCommand cmd = new SqlCommand(); 
         cmd.CommandType = CommandType.StoredProcedure; 
         cmd.CommandText = "usp_Brand_Delete"; 
         cmd.Parameters.AddWithValue("@login", current); 
         cmd.Parameters.AddWithValue("@id", id); 
         cmd.Connection = sqlCon; 

         sqlCon.Open(); 
         cmd.ExecuteNonQuery(); 
         sqlCon.Close(); 
        } 
      } 

     } 
    } 
+0

Я забыл изменить, у меня нет моего источника данных, я вручную подключил его через код – Jetlag

+0

DataSource в порядке, если вы обработали его в коде. Добавьте «DataKeyNames», как я сказал – Aruna

+0

Im, получая это: DataBinding: «System.Data.DataRowView» не содержит свойства с именем «id». – Jetlag

Смежные вопросы