2009-06-03 6 views
3

Ich habe ein ASP.NET GridView Steuerelement mit zwei asp:CommandField Spalten, die beide den Befehl Auswählen verwenden, um verschiedene Aufgaben auszuführen. Wie kann ich unterscheiden, welche Spalte im Ereignis OnRowCommand ausgewählt wurde, wenn beide "Select" zurückgeben, wenn ich die CommandName-Eigenschaft des Objekts GridViewCommandEventArgs überprüfe?GridView-Steuerelement mit zwei asp: Befehlsspalten mit demselben Befehl

Hier ist meine Quellcode:

ASPX Seite:

<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false" OnRowCommand="MyGridView_OnRowCommand"> 
    <Columns> 
     <asp:CommandField ButtonType="Link" ShowSelectButton="true" SelectText="Click Me!" /> 
     <asp:CommandField ButtonType="Link" ShowSelectButton="true" SelectText="No Click Me!" /> 
    </Columns> 
</asp:GridView> 

-Code hinter:

protected void MyGridView_OnRowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    string x = e.CommandName //returns "Select" for both asp:CommandField columns 
} 

Antwort

4

eine Schaltfläche Spalte Verwenden Sie stattdessen auf diese Weise Sie die spezifischen Befehlsnamen angeben und

<asp:ButtonField ButtonType="Link" Text="Click Me" CommandName="MyCommand1" /> 
<asp:ButtonField ButtonType="Link" Text="No Click Me" CommandName="MyCommand2" /> 

Dann können Sie Maßnahmen ergreifen, basierend auf e.CommandName

+0

Ich habe versucht, die CommandName-Eigenschaft und erhielt den folgenden Fehler: Typ 'System.Web.UI.WebControls.CommandField' hat keine öffentliche Eigenschaft mit dem Namen 'CommandName' –

+0

Sie müssen es dynamisch erstellen, um dies zu tun. – Eric

+0

schau dir die Antwort an, die ich oben gegeben habe. – Eric

0

Verwenden Sie die GridViewCommandEventArgs .CommandArgument Eigenschaft!

+0

Die CommandArgument-Eigenschaft gibt den Index der ausgewählten Zeile zurück. Ich muss wissen, welches asp: commandfield innerhalb der Reihe ausgewählt wurde. –

+0

Nein, das CommandArgument gibt das von Ihnen angegebene Argument zurück. Sie können also Schaltflächen mit demselben Befehlsnamen, aber unterschiedlichen Argumenten haben. Auf diese Weise können Sie feststellen, welche Schaltfläche den Befehl ausgelöst hat. – Cerebrus

0

Nun, tun Sie mit ihm arbeiten zuerst von dort Müssen Sie SELECt als Befehl verwenden? Sie könnten das auf etwas anderes setzen, das mehr Sinn macht.

Zweitens können Sie die CommandArgument-Eigenschaft auf verschiedene Werte festlegen, damit Sie wissen, auf welche geklickt wird.

+0

Nun, es ist sinnvoll, den Select-Befehl zu verwenden, da ich keine CRUD-Operationen am Datensatz durchführe. Beide Szenarien erfordern nur eine Informationsabfrage. –

+0

Aber ein Befehl könnte alles sein. Es könnte select_one oder select_two zum Beispiel sein ... – CodeRedick

+0

Der ganze Zweck meiner Frage versucht zu bestimmen, ob es eine Möglichkeit gibt, anzugeben, dass select_one angeklickt wurde. –

0

Verwenden Sie die Befehlsargumenteigenschaft.

e.commandargument 

Oder Sie können die Schaltfläche im Befehlsfeld dynamisch erstellen und den BefehlName auf alles festlegen, was Sie möchten.

in gridview_Load

for (int i = 0; i <= GridView1.Rows.Count - 1; i++) { 

    linkbutton btnedit = new linkbutton(); 


    GridView1.Rows(i).Cells(3).Controls.Add(btnedit); 
    //the above is where you want the button to be on the grid 
    btndel.CommandName = "Select2"; 
    btndel.CommandArgument = "whatever you want"; 
} 

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand 
    If e.CommandName = "Select1" Then 

     //do stuff 
End Sub 
+0

Das manuelle Hinzufügen des Links ist in dieser Benutzersituation übertrieben und erfordert eine sekundäre Traversierung der Rasterelemente, die nicht benötigt wird. –

0

Die Antwort, die Sie suchen ist einfach und schwierig. Ich hatte dieses Problem auch in meinem Website-Projekt, also surfte ich seit Tagen im Internet und fand nicht, was ich und du gebraucht haben.

Ein Tag dachte ich nur über das Problem allein und Experimente stundenlang gemacht und stellte schließlich fest, dass die einzige einfache Möglichkeit, um die Säule zu wissen, dass die Schaltfläche geklickt wurde im RowCommand event der GridView im CommandName property der GridViewCommandEventArgs ist. Richtig wahrscheinlich und bequemer ist es, die Spalten GridView im Design-Modus zu bearbeiten und Ihre Befehlsfelder durch Schaltflächenfelder zu ersetzen.

Sie können jede string/text geben, die Sie wollen, um jedes Tastenfeld in seiner CommandName, so in der RowCommand Ereignis können Sie wissen, welche geklickt wurde. Button1 oder Button2, aber Sie wollen nicht, diese Zeichenfolge geben, weil Sie etwas verlangen, dass die Tasten auswählen und Sie geben sollen, so die CommandName das Wort wählen soll , aber es kann SELECT und wählen sie und wählen usw.

der Auswahlbefehl kann Erwähnung in der CommandName in vielen Formen sein, und immer noch wird das System ihn erkennen.So zum Beispiel, wenn Sie zwei Knopf Felder im GridView, deren ersten CommandName einfach wählen und die anderen SELECT, dann, wenn einer von ihnen geklickt wird das RowCommand Ereignis auslöst und

if (e.CommandName == "select") 
    { 
    Label1.Text = "You clicked first button"; 
    } 
    else 
    { 
    Label1.Text = "You clicked second button"; 
    } 

und die SelectedDataKey Ihres GridView enthält die von Ihnen angeforderten Daten. Welche anderen in ihrer Antwort angeboten Menschen in CommandName unterscheiden sich durch Taste ein bis select_one Einstellung und Einstellung Taste zwei bis select_two Sie, wenn entweder select_one oder andere geklickt wurde helfen, zu wissen, aber die SelectedDataKey Ihrer GridView wird null oder DataKey Instanz bleiben, die doesn Sie enthalten keine Informationen, die Sie benötigen.

Mit anderen Worten, die Tasten werden keine notwendigen Informationen auswählen, so ist es sehr wichtig zu folgen meine Antwort. Es ist die exakte, perfekte und großartige Lösung für Ihr Problem!

Verwandte Themen