在获取数据键期间超出范围异常

时间:2011-07-06 14:16:49

标签: c# .net asp.net linq gridview

问:

我有一个gridview,我尝试删除一些记录,我将主键存储在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中的每个值.infer LINQ

3 个答案:

答案 0 :(得分:3)

对于名为RowCommand的GridView,在gv_courses事件中,您正在获取索引,然后引用另一个名为gv_moreCourses的GridView来获取密钥。如果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 :(得分:1)

int index = Convert.ToInt32(e.CommandArgument); 

索引将具有Selected Data Key的值,因为它可以具有与0不同的值,因为它将需要DataKey Index gv_moreCourses.DataKeys[DataKey]

您可以直接从e.CommandArgument获取值。它将返回Selected Row Data键值

或者,您可以通过传递DataKey名称来获取它,例如gv_moreCourses.DataKeys["NameofDataKey"].Values;

答案 2 :(得分:1)

错误是否出现在索引表的行上?这似乎是一个索引错误。您是否给出了正确范围内的指数值?可能是程序的其他部分从1开始索引,而这部分需要它们从0开始。

首先看到这一点,但没有更深入地了解你的问题。