【问题标题】:VB.NET AddHandler throwing Object reference not setVB.NET AddHandler 抛出未设置对象引用
【发布时间】:2010-03-05 01:05:29
【问题描述】:

我有一个带有 VB.NET 代码隐藏的 ASP.NET 页面。在 ASPX 页面上,我有一个中继器,中继器内有一个 asp:ImageButton,我想捕捉按钮上的点击。据我所知,我必须使用 FindControl 然后处理原始控件的副本:

Codebehind:    
Dim imagebutton1 As ImageButton = repeater.FindControl("btnImage1")
AddHandler imagebutton1.Command, AddressOf ReportTransfer
...
...
Protected Sub ReportTransfer(ByVal sender As ImageButton, ByVal args As CommandEventArgs)
...
End Sub

ASPX 页面:

                <td>
                    <asp:ImageButton runat="server" ID="btnImage1" ImageUrl="~/images/icons/icon_small.png"
                                     CommandArgument="3" />
                </td>
            </tr>
        </ItemTemplate>

它在 AddHandler 行上抛出“对象引用未设置为对象的实例”,我不知道它为什么这样做(我对 VB.NET 有点陌生)

提前谢谢你

【问题讨论】:

标签: asp.net vb.net webforms repeater


【解决方案1】:

您应该处理Repeater 的ItemCommand 事件。在这种情况下,CommandSource 是图像按钮。 CommandArgument 或 CommandName 需要指明您实际想要执行的命令。将 CommandArgument 设置为 3,意味着每个图像按钮将具有相同的值。

repeater.FindControl("btnImage1") 不起作用,因为每个按钮的 id 都会改变。

添加处理程序不正确。

Repeater.ItemCommand 事件;在Repeater控件中单击任何按钮时发生; http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemcommand.aspx

【讨论】:

    【解决方案2】:

    您收到“对象引用未设置为对象的实例”,因为 imagebutton1 为空。确保在添加处理程序之前确实找到了控件。

    AMissico 是对的,您想实际订阅Repeater 的ItemCommand 事件,并使用CommandArgument 来识别用户点击了哪一行。

    【讨论】:

    • 你是对的......我更新了它并记下了你。我脑子有问题,甚至没有考虑问题的背景。
    • 发生了。 :O) 在我上一个网络项目之后,我非常擅长中继器。我不得不嵌套和分组多个中继器。
    • 这很有趣,因为我已经在中继器中使用了一百万次按钮。但是,我太专注于 AddHandler,甚至没有考虑他实际上在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2011-09-22
    相关资源
    最近更新 更多