Исключение вне диапазона при получении ключей данных - PullRequest
0 голосов
/ 06 июля 2011

Q:

У меня есть сетка, и я пытаюсь удалить какую-то запись, я храню свои первичные ключи в DataKeyNames.

мой вопрос состоит из двух частей:

1-следующий код делает исключение, я не знаю причину:

 protected void gv_courses_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);
                ICollection keys = gv_moreCourses.DataKeys[index].Values;
                //////the rest of the code.
            }

            catch (Exception ee)
            {
                string message = ee.Message;
            }

         }

мой aspx:

 DataKeyNames="permission_code,lect_code,note_title,iscourse"

 <asp:ImageButton ID="btn_Delete" runat="server" CausesValidation="False" ImageUrl="~/Images/Symbols-Delete-icon.png"
                                                                                    CommandArgument='<%#((GridViewRow)Container).RowIndex%>' CommandName="deleteCourse" />

Исключение: в этой строкеgv_moreCourses.DataKeys[index];

System.ArgumentOutOfRangeException

2 - Если я решу первую проблему, как получить доступ к каждому значению в моем keys .prefer LINQ.

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Похоже, что в событии RowCommand для GridView с именем gv_courses вы берете индекс и затем ссылаетесь на другой GridView с именем gv_moreCourses, чтобы получить ключ.Если gv_courses содержит больше строк, чем gv_moreCourses (или gv_moreCourses не имеет определенного ключа), вы получите ошибку, нажав на один из последних индексов строк, которых нет во второй таблице.Вы намеревались сказать это вместо этого?

ICollection keys = gv_courses.DataKeys[index].Values;
                      ^^^^ remove "more"

Редактировать Тип возврата DataKeys.Values на самом деле System.Collections.Specialized.IOrderedDictionary, который содержит индексатор и свойства .Keys и .Values для легкого доступа к содержимому ключа:

IOrderedDictionary keys = gv_courses.DataKeys[index].Values;
^^^^ change ICollection to IOrderedDictionary

keys[0]  ...  // permission_code
keys[1]  ...  // lect_code
keys[2]  ...  // note_title
keys[3]  ...  // iscourse
1 голос
/ 06 июля 2011

Ошибка появляется на строке, где вы индексируете таблицу?Это похоже на ошибку индексации.Вы даете значения индекса из правильного диапазона?Может случиться так, что ваша другая часть программы начинает индексы с 1, и эти части нуждаются в том, чтобы они начинались с 0.

Это пришло мне в голову с первого взгляда, не рассматривая вашу проблему более глубоко.

1 голос
/ 06 июля 2011
int index = Convert.ToInt32(e.CommandArgument); 

Индекс будет иметь значение выбранного ключа данных, так как он может иметь значение, отличное от 0, так как для него потребуется DataKey Index gv_moreCourses.DataKeys[DataKey]

Вы можете напрямую получить значение из e.CommandArgument. Возвращает значение ключа Выбранные данные строки

ИЛИ, вы можете получить его, передав имя DataKey Name, например, gv_moreCourses.DataKeys["NameofDataKey"].Values;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...