我有一个使用LINQ数据源的GridView。在我的Page_Load中,我正在做
Using rah As New LinqDataContext(LinqConnectionString)
GridView1.DataSource = From l In rah.Links _
Where l.CategoryID = CategoryDropDown.SelectedValue _
Order By l.Name _
Select l.LinkID, _
l.Name, _
l.URL, _
l.Comment, _
l.QuickLink
GridView1.DataBind()
End Using
到目前为止它似乎工作正常,我可以看到在运行页面时GridView中显示的记录。
GridView中的每一行在最后一列中都有一个删除按钮:
<asp:ButtonField ButtonType="Button" CommandName="del" Text="Delete Link" />
(我还在TemplateField和ItemTemplate中尝试了asp:按钮)
我的问题是,当单击按钮时,它在事件处理程序的第一行代码上失败:
Private Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles GridView1.RowCommand
Dim ID As String = GridView1.DataKeys(e.CommandArgument).Value.ToString
错误是&#34;索引超出范围。必须是非负数且小于集合的大小。&#34;,因此由于某种原因它没有正确传递行索引。
我的GridView代码如下:
<asp:GridView CssClass="Grid" ID="GridView1" runat="server" AutoGenerateColumns="false" DataKeyNames="LinkID" CellPadding="5">
<Columns>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="lblName" runat="server" Text='<%#: Bind("Name")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="URL">
<ItemTemplate>
<asp:HyperLink ID="hyperURL" runat="server" Text='<%#: Bind("URL")%>' NavigateUrl='<%# "../GoToURL.aspx?url=" & Server.UrlEncode(Eval("URL"))%>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Comment">
<ItemTemplate>
<asp:Label ID="lblComment" runat="server" Text='<%#: Bind("Comment")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quick Link">
<ItemTemplate>
<asp:Label ID="lblQuickLink" runat="server" Text='<%# Bind("QuickLink")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:ButtonField ButtonType="Button" CommandName="del" Text="Delete Link" />
</Columns>
</asp:GridView>
帮助表示赞赏!
答案 0 :(得分:0)
您的ButtonField没有设置CommandArgument属性;所以CommandArgument将为空或null,这不在该集合中。我认为DataKeys需要一个整数(因为它是一个数组),命令参数是一个字符串,你也可能遇到类型转换错误?
答案 1 :(得分:0)
感谢您的回复,但我最终搞清楚了问题。这是我在这里没有发布的代码。如果您愿意,可以删除此问题。