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

Web フォームを扱うようになってからしばらく経ちましたが、問題は 2 つあります。

項目タイプが Item または AlternatingItem の場合、リピーターにデータがあることがわかります。そのような場合、インスタンス レベルのフラグを設定して、アイテムがあることを示すことができます。

次に、項目タイプがフッターで、ボタンを有効にしたい項目がある場合。これを行う方法は、@codingkiwi.com によってリンクされた質問に対する受け入れられない回答で言及されていますが、問題は FindControl を呼び出しているコンテキストにあると思います。ページのレベル 1 の子 (またはユーザー コントロール、コントロール、または Me が参照しているもの) を検索する Me.FindControl を呼び出しています。実際のリピーター要素 (この場合はフッター) の子コントロールを検索したいとします。したがって、検索は 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

オブジェクトの null 参照例外が発生する理由は、問題の原因ではないキャストに固執しているためです。通常、FindControl の結果は安全に暗黙的にキャストできます。明示的に確認する必要があるのは、FindControl の結果がキャプチャされた後の null 参照です。

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 に答える
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 に答える