Исключение из диапазона просмотра сетки, значение в диапазоне

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть GridView:

 <asp:GridView runat="server" ID="_gv_AllResp" Width="100%"  style="color: White;" DataKeyNames="recordid" 
    Font-Size="10pt" OnDataBound="_gvDataBind_Eve"  AutoGenerateSelectButton="true" OnSelectedIndexChanged="_gv_AllResp_SelectedIndexChanged">
      <RowStyle HorizontalAlign="Center" />
      <HeaderStyle BackColor="#57768f"/>
      <RowStyle BackColor="#dae2e8" ForeColor="Black" />
      <AlternatingRowStyle BackColor="#ffffff" ForeColor="Black" />
</asp:GridView>
  

То, что я связываю с кодом, стоящим за ADO:

 SELECT a.[recordid], [lname]   ', '   [fname] as [name], Convert(char, [datebirth],   101)  as 'DOB', phone1, phone2, phone3, ext FROM [dbo].[Respondent] a
  

Затем у меня есть процедура выбора случайного количества записей из сетки и вставки их в таблицу:

 var rnd = new Random();
        var _rand = Enumerable.Range(0, _RowCount).Select(x => new { val = x, order =  rnd.Next() }).OrderBy(i => i.order).Select(x => x.val).Take(_LockCount).ToArray();

        string _jobnum = _dd_ActJobs.SelectedValue.ToString();

        foreach (var a in _rand)
        {
            int b = Convert.ToInt32(a);
            using (var con = new SqlConnection())
            {
                con.ConnectionString = ConfigurationManager.ConnectionStrings["RM_V1.0CS"].ConnectionString;
                try
                {
                    con.Open();

                    var cmd = new SqlCommand("INS_DemoLockQuery", con) { CommandType = CommandType.StoredProcedure };
                    cmd.Parameters.Add("@jobnum", SqlDbType.NVarChar, 100, "jobnum");
                    cmd.Parameters.Add("@respnum", SqlDbType.NVarChar, 100, "respnum");
                    cmd.Parameters.Add("@name", SqlDbType.NVarChar, 100, "name");
                    cmd.Parameters.Add("@phone", SqlDbType.NVarChar, 100, "phone");
                    cmd.Parameters.Add("@wphone", SqlDbType.NVarChar, 100, "wphone");
                    cmd.Parameters.Add("@wphone_ext", SqlDbType.NVarChar, 100, "wphone_ext");
                    cmd.Parameters.Add("@cellphone", SqlDbType.NVarChar, 100, "cellphone");
                    cmd.Parameters.Add("@quota", SqlDbType.NVarChar, 100, "quota");

                    cmd.Parameters["@jobnum"].Value = _jobnum;
                    //GETTING ERROR HERE 
                    cmd.Parameters["@respnum"].Value = _gv_AllResp.Rows[b].Cells[1].Text.ToString();
                    cmd.Parameters["@name"].Value = _gv_AllResp.Rows[b].Cells[2].Text.ToString();
                    cmd.Parameters["@phone"].Value = _gv_AllResp.Rows[b].Cells[4].Text.ToString().Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@wphone"].Value = _gv_AllResp.Rows[b].Cells[5].Text.ToString().Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@wphone_ext"].Value = _gv_AllResp.Rows[b].Cells[6].Text.ToString().Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@cellphone"].Value = _gv_AllResp.Rows[b].Cells[7].Text.ToString().Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@quota"].Value = _ddActQuota.SelectedValue.ToString();
                    cmd.ExecuteNonQuery();
                    ViewAvailable();
                }
                //catch (Exception ex) { ErrHandler.WriteError(ex.Message); }
                finally { con.Close(); }
            }
        }
  

Я получаю следующее сообщение: «Индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс» В сетке 145 строк, а значение b (номер строки) равно 120, например, для этого конкретного теста. Это находится в диапазоне допустимых строк. Я не понимаю, как это выходит за пределы диапазона индексов.

Трассировка стека

    at System.Collections.ArrayList.get_Item(Int32 index)
   at System.Web.UI.WebControls.GridViewRowCollection.get_Item(Int32 index)
   at Default3._b_selectRepond(Object sender, EventArgs e) in   c:AfocusJobsQuery.aspx.cs:line 668
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at     System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(Str     ing eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean  includeStagesAfterAsyncPoint)
  

Есть предложения? Заранее спасибо Парням / Девушкам

РЕДАКТИРОВАТЬ @ James

Я просто попробовал использовать datakeynames, как вы предложили, и заменил блок вставки на

                     cmd.Parameters["@jobnum"].Value = _jobnum;
                    cmd.Parameters["@respnum"].Value = _gv_AllResp.DataKeys[b]["recordid"].ToString();
                    cmd.Parameters["@name"].Value = _gv_AllResp.DataKeys[b]["Name"].ToString().Replace("amp;nbsp;", "");
                    cmd.Parameters["@phone"].Value = _gv_AllResp.DataKeys[b]["Main"].ToString().Replace("amp;nbsp;", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@wphone"].Value = _gv_AllResp.DataKeys[b]["Work Phone"].ToString().Replace("amp;nbsp;", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@wphone_ext"].Value = _gv_AllResp.DataKeys[b]["ext"].ToString().Replace("amp;nbsp;", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@cellphone"].Value = _gv_AllResp.DataKeys[b]["Cell Phone"].ToString().Replace("amp;nbsp;", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Trim();
                    cmd.Parameters["@quota"].Value = _ddActQuota.SelectedValue;
  

Однако я по-прежнему получаю ту же ошибку, я попытался «заблокировать» 50 записей со 145 строками в сетке, и она прошла цикл 23 раза, а затем выдала ошибку в строке 135 (b = 135) с той же ошибкой «Индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс»

Комментарии:

1. Является ли код, показанный выше, кодом в строке 668 или рядом со строкой query.aspx.cs?

2. Когда вы вызываете этот метод случайного выбора? Заполняется ли сетка при выполнении случайных выборов?

3. Да, есть целый набор критериев, которые должны быть выполнены до выбора. Количество блокировок выбора> = количество строк, количество строк> 0 и т.д… Но все исключения из диапазона возникают в существующих строках, вот что меня смущает.

4. отправьте код для метода selectRepond(). И исправьте опечатку метода 🙂

Ответ №1:

Вы указываете индексы столбцов, начинающиеся с позиции 1 , а 0 не . У вас есть 7 столбцов в вашем выборе, поэтому индексы ваших столбцов должны варьироваться 0-6 .

Я считаю, что это оскорбительная строка:

  _gv_AllResp.Rows[b].Cells[7].Text // = bang!
  

Редактировать

Чтобы полностью устранить проблему, используйте ключи данных для доступа к нужным столбцам:

 <asp:GridView ID="GridView1" runat="server" DataKeyNames="Name, DOB, phone1, phone2, ..." >
  

И в коде-за:

 string name = GridView1.DataKeys[0]["Name"].ToString();
  

Комментарии:

1. Отредактировал мой ответ решением, которое должно полностью устранить проблему.

2. Вы используете индекс строки для извлечения ключей данных, верно? GridView1.DataKeys[rowIndex]["Name"].ToString();

3. Скважина b — это значение диапазона между минимальным и максимальным индексом строки yes … Я предполагаю, что это то, что вы имеете в виду