Frage

ich eine Gridview mit mehreren Reihen haben, hat jeder eine Schaltfläche Update und ich brauche 2 Werte, wenn Klicks jemand auf Schaltfläche Update passieren. Abgesehen von den Argumenten innerhalb Command Verpackung durch Komma getrennt (archaisch und nicht elegant), wie würde ich passiere mehr als ein Argument?

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

Als Hinweis können die Werte nicht von irgendwelchen Kontrollen auf der Seite abgerufen werden, so dass ich derzeit bin keine Design-Lösungen zu suchen.

War es hilfreich?

Lösung

Nach dem Stochern es sieht aus wie Kelsey korrekt ist.

Nur ein Komma oder etwas verwenden und es teilen, wenn Sie sie konsumieren wollen.

Andere Tipps

Sie können Semikolon passieren Werte als Befehlsargument getrennt und dann die Zeichenfolge aufgeteilt und es verwenden.

<asp:TemplateField ShowHeader="false">
    <ItemTemplate>
       <asp:LinkButton ID="lnkCustomize" Text="Customize"  CommandName="Customize"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
       </asp:LinkButton>   
    </ItemTemplate>   
</asp:TemplateField>

auf Server-Seite

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
      string[] arg = new string[2];
      arg = e.CommandArgument.ToString().Split(';');
      Session["IdTemplate"] = arg[0];
      Session["IdEntity"] = arg[1];
      Response.Redirect("Samplepage.aspx");
}

Hope es hilft !!!!

@ Patrick Antwort ist eine gute Idee, und mehr Kredit verdient !. Sie können beliebig viele Datenelemente, wie Sie wollen, sie alle voneinander getrennt sind, und kann verwendet Client-Seite sein, falls erforderlich.

Sie können auch deklarativ eher hinzugefügt werden als im Code. Ich habe gerade dies für eine Gridview wie folgt aus:

<asp:TemplateField HeaderText="Remind">
  <ItemTemplate>
    <asp:ImageButton ID="btnEmail"  
        data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
        data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
        CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
  </ItemTemplate> 
</asp:TemplateField>

In der RowCommand, tun Sie dies:

void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        var btnSender = (ImageButton)e.CommandSource;
        var riderName = btnSender.Attributes["data-rider-name"];
        var riderEmail = btnSender.Attributes["data-rider-email"];
        // Do something here
    }
}

So viel sauberer als alle mit Trennzeichen, die Werte zusammen Hacking und Auspacken wieder am Ende.

Vergessen Sie nicht zu Test / reinigen alle Daten, die Sie von der Seite zurück, falls es manipuliert worden ist!

Mein Ansatz wird mit den Attributen Sammlung HTML Daten- hinzufügen Attribute aus Code-behind. Das ist mehr inline mit jquery und Client-Side-Scripting.

// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();


// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );

abrufen dann die Werte durch die Attributsammlung

string val = targetBtn.Attributes["data-{your data name here}"].ToString();

Ein wenig eleganter Weg, um das gleiche zu tun, das Hinzufügen auf den obigen Kommentar ..

<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
                           AutoGenerateColumns="false"
                            OnRowDeleting="deleteRow"
                         GridLines="Vertical">
      <asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
      <asp:BoundField DataField="EntityId" HeaderText="EntityId"  />
    <asp:TemplateField ShowHeader="false">
        <ItemTemplate>
           <asp:LinkButton ID="lnkCustomize" Text="Delete"  CommandName="Delete"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
           </asp:LinkButton>   
        </ItemTemplate>   
    </asp:TemplateField>
     </asp:GridView>

Und auf der Server-Seite:

protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
    string IdTemplate= e.Values["IdTemplate"].ToString();
    string EntityId = e.Values["EntityId"].ToString();

   // Do stuff..
}

So oder speichern sie in der Gridview Datakeys-Sammlung, oder speichern sie in einem versteckten Feld innerhalb der gleichen Zelle, oder die Werte miteinander verbinden. Das ist der einzige Weg. Sie können nicht speichern, zwei Werte in einem Link.

Wenn Sie passieren zwei Werte , können Sie diesen Ansatz verwenden

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
 OnClick="RemoveFromRole_Click" />

Im Grunde I {CommmandName, Command} als Schlüsselwert am behandeln. Stellen Sie beide von Datenbankfeld. Sie haben OnClick-Ereignis und die Nutzung OnCommand Ereignis in diesem Fall zu verwenden, was ich denke, mehr sauberer Code ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top