C# 获取数据键期间发生超出范围异常

C# 获取数据键期间发生超出范围异常,c#,.net,asp.net,linq,gridview,C#,.net,Asp.net,Linq,Gridview,问: 我有一个gridview,我试图删除一些记录,我将主键存储在DataKeyNames中 我的问题分为两部分: 1-以下代码例外,我不知道原因: protected void gv_courses_RowCommand(object sender, GridViewCommandEventArgs e) { try { int index = Convert.ToInt32(e.CommandA

问:

我有一个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" />
DataKeyNames=“权限\代码、选择\代码、注释\标题、课程”

例外情况是:在这一行
gv_moreCourses.DataKeys[index]

System.ArgumentOutOfRangeException

2-如果我解决了第一个问题,如何访问
键中的每个值
。首选
LINQ

int index = Convert.ToInt32(e.CommandArgument); 
索引将具有所选数据键的值,就像它可以具有与
0
不同的值一样,因为它需要数据键索引
gv\u更多课程。数据键[DataKey]

您可以直接从
e.CommandArgument
获取值。它将返回选定的行数据键值

或者,您可以通过传递数据键名称的名称来获取它,例如
gv_moreCourses.DataKeys[“NameofDataKey”]。值

索引将具有所选数据键的值,就像它可以具有与
0
不同的值一样,因为它需要数据键索引
gv\u更多课程。数据键[DataKey]

您可以直接从
e.CommandArgument
获取值。它将返回选定的行数据键值


或者,您可以通过传递数据键名称的名称来获取它,例如
gv_moreCourses.DataKeys[“NameofDataKey”]。值

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


我第一次看到这一点时就想到了,但没有深入研究您的问题。

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


我在第一次查看时就想到了这一点,但没有深入研究您的问题。

对于名为
gv_courses
的GridView,在
RowCommand
事件中,您正在获取索引,然后引用另一个名为
gv_more courses
的GridView来获取密钥。如果
gv_课程
的行数多于
gv_moreCourses
(或
gv_moreCourses
没有定义的键),则单击第二个网格上不存在的后一行索引之一会出错。你是不是想让那个人说这个

ICollection keys = gv_courses.DataKeys[index].Values;
                      ^^^^ remove "more"
Edit数据键.Values的返回类型实际上是
System.Collections.Specialized.iorderedictionary
,它包含索引器和属性
.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

在名为
gv_课程
的GridView的
row命令
事件中,您获取索引,然后引用另一个名为
gv_课程
的GridView来获取密钥。如果
gv_课程
的行数多于
gv_moreCourses
(或
gv_moreCourses
没有定义的键),则单击第二个网格上不存在的后一行索引之一会出错。你是不是想让那个人说这个

ICollection keys = gv_courses.DataKeys[index].Values;
                      ^^^^ remove "more"
Edit数据键.Values的返回类型实际上是
System.Collections.Specialized.iorderedictionary
,它包含索引器和属性
.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

你没有完成的那个例外被抛出。确保强制索引在您的特定范围内。当我跟踪时,我会得到正确的
索引
。将抛出您未完成的例外项。确保强制索引在您的特定范围内。当我跟踪时,我将获得正确的
索引。嗯,我从中获得所选行的索引,但我想从数据库中获取要删除的主键。CommandArgument将返回您正在查找的内容。只需调试它。
intindex=Convert.ToInt32(e.CommandArgument)。没有任何问题,下一个问题。嗯,我从中获取所选行的索引,但我想获取要从数据库中删除的主键。CommandArgument将返回您正在查找的内容。只需调试它。
intindex=Convert.ToInt32(e.CommandArgument)。没有任何问题,下一个问题。太好了,你解决了我的第一个问题,然后是如何获取我密钥集合中的每个密钥。LINQ。非常感谢。请回答我问题的第二部分。这是复制和粘贴的缺点,我为我的gridview
gv_moreCourses
编写代码,然后粘贴它,忘记编辑这一行。太好了,你解决了我的第一个问题,然后解决了如何获取密钥集合中的每个密钥。LINQ.非常感谢。请回答我问题的第二部分。这是复制和粘贴的缺点,我为我的gridview
gv_moreCourses
编写代码,然后粘贴它,忘记编辑这一行。