Domanda

Ho un GridView con più righe, ognuna ha un pulsante Aggiorna e ho bisogno di passare 2 valori quando click qualcuno sul pulsante Aggiorna. A parte l'imballaggio argomenti all'interno CommandArgument separati da virgole (arcaico e non elegante), come faccio a passare più di un argomento?

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

Come nota, i valori non possono essere recuperate da qualsiasi controllo sulla pagina, in modo da sto attualmente non cercano alcun soluzioni di design.

È stato utile?

Soluzione

Dopo aver frugato sembra Kelsey è corretta.

Basta usare una virgola o qualcosa e dividere quando si vuole consumare.

Altri suggerimenti

È possibile passare virgola separato valori come argomento di comando e quindi dividere la stringa e usarlo.

<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>

lato server

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");
}

La speranza aiuta !!!!

@ risposta di Patrick è una buona idea, e merita più credito !. Si può avere il maggior numero di elementi di dati che si desidera, sono tutti separati, e possono essere lato client utilizzato, se necessario.

Si può anche essere aggiunto in modo dichiarativo, piuttosto che nel codice. Ho appena fatto questo per un GridView in questo modo:

<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>

Nel RowCommand, si esegue questa operazione:

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
    }
}

Quindi, molto più pulito rispetto violazione al sistema tutti i valori insieme con delimitatori e disimballaggio di nuovo alla fine.

Non dimenticare di test / pulire qualsiasi tipo di dati si ottiene indietro dalla pagina, nel caso in cui è stato manomesso!

Il mio approccio sta usando gli attributi raccolta per aggiungere HTML dati- attributi dal codice dietro. Questo è più in linea con jQuery e scripting lato client.

// 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() );

Poi recuperare i valori attraverso la raccolta di attributo

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

Un modo poco più elegante di fare la stessa aggiungendo al commento di cui sopra ..

<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>

E sul lato server:

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

   // Do stuff..
}

In ogni negozio nella collezione datakeys GridView, o conservarlo in un campo nascosto all'interno della stessa cella, o partecipare i valori insieme. Questo è l'unico modo. Non è possibile memorizzare due valori in un unico collegamento.

Se si desidera passare due valori , è possibile utilizzare questo approccio

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

In fondo io sto curando {CommmandName, CommandArgument} come valore della chiave. Impostare sia dal campo di database. Si dovrà utilizzare OnClick evento evento e l'uso OnCommand in questo caso, che credo sia il codice più pulito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top