2009-09-05 20 views
6

Ich habe eine ASP.Net-Seite, die eine Liste von Optionen für den Benutzer anzeigt. Wenn sie aus der Liste auswählen, führt sie einen Post-Back durch und fragt einen SQL-Server ab. Die Ergebnisse werden in einer Listenansicht unter den Optionen in einem Aktualisierungsbereich angezeigt. Im Folgenden ist ein Ausschnitt aus dem ItemTemplate:Warum ist mein CommandArgument leer?

<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" /> 

Die DataItemIndex nicht erscheinen, so mein Command ist leer. Der Objektabsender ist jedoch der Button, der das Objekt anzeigt.

Warum wird das Indexelement nicht im CommandArgument angezeigt?

Könnte es die Post zurück sein? Wenn ja, warum wäre es die Post zurück? Gibt es einen Weg dahin?

Edit: Sorry, von meinen Versuchen, es vorher zu lösen, postete ich schlechten Code, aber es erscheint immer noch nicht.

Auflösung: Ich fand eine andere Arbeit in der Absender des OnCommand ist der Link-Button, der das CommandArgument hat. Ich werde diese Ausgabe als ein Problem mit mehreren Postbacks und Javascript beschreiben.

+0

fast sicher der Postback ... –

Antwort

7

Sie können die <%= %>-Syntax nicht in Eigenschaften eines Tags mit einem runat="server"-Attribut verwenden. Ich bin überrascht, dass der Code sogar läuft. :)

UPDATE:

Sie wahrscheinlich das ItemDataBound Ereignis auf dem Repeater verwendet werden sollen, die Linkbutton finden und die Command Eigenschaft festgelegt.

Nicht sehr elegant, aber hier ist ein VB.NET-Beispiel.

Private Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound 
    Select Case e.Item.ItemType 
     Case ListItemType.Item, ListItemType.AlternatingItem 
     Dim b As LinkButton = e.Item.FindControl("btn") 
     b.CommandArgument = e.Item.ItemIndex 
    End Select 
    End Sub 
+0

Ich habe es in # geändert, aber es wird immer noch nicht im CommandArgument angezeigt. Es löst das ursprüngliche Problem nicht. – kevindaub

+0

Ich habe eine andere Problemumgehung gefunden, aber Ihre Lösung sollte auch funktionieren. – kevindaub

0

Sie richten es nicht

Sie wollen möglicherweise

<%# Container.DataItemIndex %> 

oder

<%= Container.DataItemIndex %> 

:)

0

Versuchen

<asp:LinkButton Text="Save IT" OnCommand="SaveIt" CommandArgument="<%# Container.DataItemIndex %>" runat="server" /> 

Sie haben das # -Zeichen verfehlt.

+0

Sorry, ich postete schlechten Code. Es erscheint immer noch nicht. – kevindaub

0

Diese Seite hat mir wirklich geholfen, mit diesem Problem: http://forums.asp.net/t/1671316.aspx

Das Problem, das ich in lief war, dass ich in dem Commandargument null Argumente übergeben wurde, als ich auf der Taste ein zweites Mal angeklickt. Wie im obigen Post erklärt, liegt das daran, dass das Befehlsargument nur im Databind-Ereignis gesetzt ist. Um dies zu beheben, fügen Sie ein Datenindikator-Ereignis in den page_load-Sub ein

Ex. (VB)

Private Sub BindSelectButtons()  

    'Purpose: bind the data to the select buttons for commandargument to be used 
    Dim i As Integer 
    For i = 0 To gridview1.Rows.Count - 1 
     gridview1.Rows(i).Cells(8).FindControl("btnID").DataBind() 
    Next 
End Sub 

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

    'Rebind select buttons so that the commandargument refreshes 
    BindSelectButtons() 
End Sub 
0

Stellen Sie sicher, dass View State e.Row aktiviert ist.EnableViewState = true;