0

これはばかげています。私はこれに5時間以上携わっていますが、なぜ私のおかしなコマンドが適切に実行されないのか理解できません。正しく起動するのは、組み込みコマンドの「編集」と「キャンセル」だけです。

マークアップ

<asp:ListView ID="NewProduct" runat="server" DataSourceID="NewProductSDS" DataKeyNames="ID">
    <ItemTemplate>
        <div>
            <asp:LinkButton ID="accept" runat="server" CommandName="Accept" />
            <asp:LinkButton ID="edit" runat="server" CommandName="Edit" />
            <asp:LinkButton ID="delete" runat="server" CommandName="Reject" />
            <%# Eval("Product")%>
        </div>
    </ItemTemplate>
    <EditItemTemplate>
        <div>
            <asp:LinkButton ID="accept" runat="server" CommandName="Accept" />
            <asp:LinkButton ID="cancel" runat="server" CommandName="Cancel" />
            <asp:TextBox ID="NewProductName_tb" runat="server"></asp:TextBox>
        </div>
    </EditItemTemplate>
</asp:ListView>
<asp:SqlDataSource ID="NewProductSDS" runat="server"
    ConnectionString="<%$ ConnectionStrings:myConnectionString %>"
    SelectCommand="select ID, Product from Products">
</asp:SqlDataSource>

コードビハインド

Protected Sub ItemBind(ByVal sender As Object, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    If e.Item.ItemType = ListViewItemType.DataItem Then
        sender.DataKeys(e.Item.DataItemIndex).Value.ToString() 'get the datakey
        'Display each key as it's created for troubleshooting.
        Label1.Text += "bound: " + sender.DataKeys(e.Item.DataItemIndex).Value.ToString() + "<br />"
    End If
End Sub
Protected Sub ItemClick(ByVal sender As Object, ByVal e As CommandEventArgs) Handles NewProduct.ItemCommand
    'Check if an event fired when a LinkButton is clicked.
    Label1.Text = "Command Event Fired"
    If e.CommandName = "Accept" Then
        Session.Add("PKey", sender.DataKeys(e.CommandArgument).Value.ToString)
        Label1.Text = "Accept key " + Session.Item("PKey")
    ElseIf e.CommandName = "Reject" Then
        Session.Add("PKey", sender.DataKeys(e.CommandArgument).Value.ToString)
        Label1.Text = "Reject key " + Session.Item("PKey")
    End If
End Sub

このガベージをデバッグするために使用しているコードはこれだけです。私が理解できない最も奇妙なことは、すべてのキーが次のように新しいページの読み込みで表示されることです...

bound: 9
bound: 12
bound: 27
bound: 31
bound: 32

次に、組み込みのコマンド(この場合は[編集]または[キャンセル]をクリックすると、ItemCommandイベントハンドラーコードに含まれていないことに注意してください)をクリックすると、このガベージが表示され、バインドする前にクリックが表示されていることがわかります。

Command Event Firedbound: 9
bound: 12
bound: 27
bound: 31
bound: 32

一体何が起こっていても、私が解決しようとしている問題は、私のカスタムコマンドが何らかの理由で認識されていないことです。何か案は?私は答えを高低で検索しましたが、何もありません:(

このすべてのコードを新しいプロジェクトにコピーした場合は、コンパイルする必要があります。私はあなたの助けにこれまでにとても感謝するでしょう。ListView---点火順序について何かを明らかにし、おそらく何が悪いのかを理解することを期待して、コントロールのすべての異常なイベントを処理するためにバインドしようとしています。---:'(

更新:私はそれをやりました笑。興味深いですが、それが私に何か新しいことを教えてくれるかどうかはわかりません。すべてのイベントがバインドされた新しいページの読み込みで発生するものは次のとおりです。

Init
Load
DataBinding
ItemCreated
bound: 9
ItemCreated
bound: 12
ItemCreated
bound: 27
ItemCreated
bound: 31
ItemCreated
bound: 32
DataBound
PreRender
4

1 に答える 1

1

イベントの順序(ItemClick、ItemDataBound)が正しい処理順序であると思います。ItemClickはクライアントから起動され、ページがユーザーに返送される前に、ItemDataBoundが起動されます。

各カスタムボタンに特定のOnClickイベントを追加して、それらが起動するかどうかを確認することをお勧めします。

アップデート:

ItemClickイベント内でも例外が発生している可能性があります。ラベルの設定をセッション操作の上に移動すると、カスタムコードでラベルが更新されていることがわかります。

イベントの本文を例外ハンドラーでラップし、デバッグをステップスルーして、どの例外が発生しているかを確認する必要があります。

作業しているプロパティのいくつかをネイティブタイプにキャストすることで、おそらくより良いサービスが提供されます。例えば:

Dim theListView As ListView

theListView = DirectCast(sender, ListView)

Dim theDataItem As ListViewDataItem

theDataItem = DirectCast(e.Item, ListViewDataItem)

If e.CommandName = "Accept" Then
    Label1.Text = "Accept key " + Session.Item("PKey")
    Session.Add("PKey", theListView.DataKeys(theDataItem.DisplayIndex).Value.ToString)
ElseIf e.CommandName = "Reject" Then
    Label1.Text = "Reject key " + Session.Item("PKey")
    Session.Add("PKey", theListView.DataKeys(theDataItem.DisplayIndex).Value.ToString)
End If
于 2011-11-05T02:10:07.380 に答える