5

我正在使用 OnItemDataBound 事件来尝试激活中继器中的禁用按钮。很简单,如果事件被触发,我知道中继器中有项目,因此想要启用按钮。我卡住的地方是在功能中投射按钮,以便我可以启用它。中继器代码的相关部分如下:

<asp:Repeater ID="RptEnterHours" runat="server" DataSourceID="SQL_EmployeeGetTimesheet" ClientIDMode="Predictable" OnItemDataBound="RptEnterHours_Bound">
     '.....Irrelevant code.....
     <FooterTemplate>
          <asp:Button Enabled="false" ID="SubmitTimesheets" Text="Submit All Timesheets" OnClick="processTimesheetEntry" runat="server" OnClientClick="checkValues();" />&nbsp;
     </FooterTemplate>
</asp:Repeater>

这是我背后的代码:

Sub RptEnterHours_Bound(Sender As Object, e As RepeaterItemEventArgs)

    'Exposes the Submit All Timesheets button if timesheets are available.
    If (e.Item.ItemType = ListItemType.Item) Or _
        (e.Item.ItemType = ListItemType.AlternatingItem) Then
        Dim sButton As Button = TryCast(Me.FindControl("SubmitTimesheets"), Button)
        sButton.Enabled = True
    End If

End Sub

这和所有其他尝试都产生了可怕的“对象引用未设置为对象的实例”消息。谁能告诉我我做错了什么以及为什么我后面的代码找不到按钮?

4

6 回答 6

3

请试试这个,我相信它会帮助你。

    If e.Item.ItemType = ListItemType.Footer Then
        Dim btn as new button
        btn = CType(e.Item.FindControl("SubmitTimesheets"), Button)
        btn.enabled = true
    End If
于 2012-10-10T18:31:13.213 回答
0

您将其限制为查看项目和交替项目模板。

改变这个:

If (e.Item.ItemType = ListItemType.Item) Or _ 
        (e.Item.ItemType = ListItemType.AlternatingItem) Then 

到:

If (e.Item.ItemType = ListItemType.Footer) Then 
于 2012-08-22T20:01:38.350 回答
0

您要测试 e.Item.ItemType = ListItemType.Footer。Item 和 AlternatingItem 用于实际的数据记录,而不是页脚。因此,对于 Items 和 AlternatingItems,该按钮确实不存在。

然后,您将要添加一个测试以检查 RptEnterHours.DataSource 对象是否有记录。为此,您需要将 RptEnterHours.DataSource 转换为数据源的任何类型。

所以,基本上是这样的。您显然需要更改它以适合您的代码:

Sub RptEnterHours_Bound(Sender As Object, e As RepeaterItemEventArgs)

    'Exposes the Submit All Timesheets button if timesheets are available.
    If (e.Item.ItemType = ListItemType.Footer) Then
        Dim sButton As Button = TryCast(Me.FindControl("SubmitTimesheets"), Button)
        Dim myDataSource = CType(RptEnterHours.DataSource, MyDataSourceType)

        sButton.Enabled = (myDataSource.Count > 0)
    End If

End Sub
于 2012-08-22T20:05:47.887 回答
0

自从我使用 Web 表单以来已经有一段时间了,但我相信问题有两个方面。

当项目类型为 Item 或 AlternatingItem 时,您就知道中继器中有数据。在这些情况下,您可以设置实例级别标志以指示您有项目。

然后,当项目类型为页脚并且您有要启用按钮的项目时。在对@codingkiwi.com 链接的问题的未接受答案中提到了这样做的方法,但我相信问题出在您调用 FindControl 的上下文中。您正在调用 Me.FindControl,它将搜索页面的 1 级子项(或用户控件、控件或 Me 所引用的任何内容)。您想要搜索实际中继器元素的子控件,在本例中为页脚。所以搜索变成了e.Item.FindControl。

应该注意的是,可能有更优雅的方法来检测转发器控件是否具有元素。也许您需要在 OnDataBound 事件中检查的是页脚项,然后查找类似的内容:(我的 VB 可能也有点生疏)

If (Me.RptEnterHours.Items IsNot Null AndAlso Me.RptEnterHours.Items.Any()) Then
于 2012-08-23T02:08:09.967 回答
0

不知道为什么它一开始就没有启用,但这会起作用,因为它会在 Item/AlternatingItem 类型之后为页脚触发:

Private m_bolEnableButton As Boolean = False

Sub RptEnterHours_Bound(Sender As Object, e As RepeaterItemEventArgs)

    'Exposes the Submit All Timesheets button if timesheets are available. 
    If (e.Item.ItemType = ListItemType.Item) Or _
       (e.Item.ItemType = ListItemType.AlternatingItem) Then

        '"if the event is triggered, I know there are items in the repeater and therefore want to enable the button"
        m_bolEnableButton = True

    End If

    If e.Item.ItemType = ListItemType.Footer Then

        If m_bolEnableButton Then

            Dim sButton As Button = TryCast(e.Item.FindControl("SubmitTimesheets"), Button)
            sButton.Enabled = True

        End If

        m_bolEnableButton = False

    End If

End Sub
于 2012-08-23T03:45:10.523 回答
0

您获得 Object null 引用异常的原因是您专注于演员阵容,这不会导致问题。您通常可以安全地隐式转换 FindControl 的结果。在捕获 FindControl 结果之后,您需要明确检查的是空引用。

此外,您应该查找ListItemType.Footer以便可以引用页脚行。

最后,FindControl() 不是递归的。它仅在顶级命名容器中查找控件。在大多数数据绑定控件中,每一行都代表它自己的命名容器,因此您必须在要搜索的行内使用 FindControl。当您使用Me时,它指的是页面。您应该改用 e.Item.FindControl()。

代码:

Dim bRecordsFound as Boolean = False

Sub RptEnterHours_Bound(Sender As Object, e As RepeaterItemEventArgs)
    If (e.Item.ItemType = ListItemType.Item) Or _
            (e.Item.ItemType = ListItemType.AlternatingItem) Then
        bRecordsFound = True
    End If
    If (e.Item.ItemType = ListItemType.Footer) And (bRecordsFound) Then
        Dim sButton As Button = e.Item.FindControl("SubmitTimesheets")
        If sButton IsNot Nothing Then
            sButton.Visible = True
        End If
    End If
End Sub
于 2012-10-08T13:43:37.683 回答