Pergunta

Eu tenho um gridview com várias linhas, cada uma tem um botão Atualizar e preciso passar 2 valores quando alguém clica no botão Atualizar.Além de empacotar os argumentos dentro de CommandArgument separados por vírgulas (arcaico e não elegante), como eu passaria mais de um argumento?

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

Como observação, os valores não podem ser recuperados de nenhum controle na página, portanto, no momento, não estou procurando nenhuma solução de design.

Foi útil?

Solução

Depois de cutucá -lo, parece que Kelsey está correto.

Basta usar uma vírgula ou algo assim e dividi -lo quando quiser consumi -lo.

Outras dicas

Você pode passar nos valores separados do Semicolon como argumento de comando e depois dividir a string e usá -lo.

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

no lado do servidor

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

Espero que ajude!!!!

A resposta de @Patrick é uma boa ideia e merece mais crédito!Você pode ter quantos itens de dados desejar, todos separados e podem ser usados ​​no lado do cliente, se necessário.

Eles também podem ser adicionados de forma declarativa, em vez de em código.Acabei de fazer isso para um GridView como este:

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

No RowCommand, você faz isso:

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

Muito mais limpo do que hackear todos os valores junto com delimitadores e descompactar novamente no final.

Não se esqueça de testar/limpar todos os dados que você receber da página, caso tenham sido adulterados!

Minha abordagem é usar a coleção Atributos para adicionar atributos de dados HTML do código atrás. Isso é mais alinhado com o JQuery e o script lateral do cliente.

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

Em seguida, recupere os valores através da coleção de atributos

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

Uma maneira um pouco mais elegante de fazer o mesmo adicionando ao comentário acima.

<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 no lado do servidor:

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

   // Do stuff..
}

Armazene -o na coleção GridView Datakeys ou armazenar -a em um campo oculto dentro da mesma célula ou junte os valores. Essa é a unica maneira. Você não pode armazenar dois valores em um link.

Se você quiser passar dois valores, você pode usar esta abordagem

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

Basicamente, estou tratando {CommmandName, Commandargument} como o valor da chave. Defina ambos no campo do banco de dados. Você terá que usar o evento OnClick e usar OnCommand Evento neste caso, que eu acho que é um código mais limpo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top