2010-03-05 153 views
20

我有一個gridview有多行,每個都有一個Update按鈕,當有人點擊Update按鈕時我需要傳遞2個值。 除了在CommandArgument中包含參數(用逗號分隔)(古老而不優雅)之外,我將如何傳遞多個參數?在Asp.net中通過Button的CommandArgument傳遞多個參數

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

作爲說明,無法從頁面上的任何控件檢索值,因此不提供任何設計解決方案。請專注於所問的問題。提前致謝。

+7

使用分隔符的'古老'解決方案有時是最簡單的。 – Kelsey 2010-03-05 19:19:39

+0

@sarsnake - 我會接受Archana Motagi的回答 – fubo 2015-08-24 12:44:58

回答

13

摸了摸它看起來像凱爾西是正確的。

只需使用逗號或其他東西,並在想要使用它時將其分開。

+4

找到這個: http://aspdotnetcodebook.blogspot.com/2008/09/how-to-pass-multiple-values-to.html – sarsnake 2010-03-05 20:29:57

1

將它存儲在gridview的datakeys集合中,或將其存儲在同一單元格內的隱藏字段中,或者將這些值連接在一起。這是唯一的方法。您不能在一個鏈接中存儲兩個值。

70

您可以傳遞以分號分隔的值作爲命令參數,然後拆分字符串並使用它。

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

在服務器端

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

希望它可以幫助!!!!

+0

上面的工作適合我。唯一的問題是你錯過了Redirect()ASPX鏈接中的參數。嘗試Response.Redirect(「Samplepage.aspx?IdTemplate =」+ Session [「IdTemplate」]。ToString()。Trim()+「&IdEntity =」+ Session [「IdEntity」]。ToString()。Trim()); – Fandango68 2013-06-28 05:18:58

+0

作爲一個學生,你不需要.ToString()。 CommandArgument始終是一個字符串,因此:var argument =((LinkBut​​ton)sender).CommandArgument.Split(';'); – 2017-11-09 13:13:56

2

做同樣加入到上述評論的一個小更優雅的方式..

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

和服務器端:

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

    // Do stuff.. 
} 
+0

這隻適用於您希望網格中顯示IdTemplate和EntityId字段的情況。您放置在CommandArgument中的值從未實際使用過。 – cyberspy 2015-07-24 11:08:56

5

我的做法是使用屬性集合添加HTML數據 - 來自代碼後面的屬性。這與jquery和客戶端腳本更接近。

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

然後通過屬性集合

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

@帕特里克的回答是一個好主意,值得更多的信貸檢索值!您可以根據需要擁有儘可能多的數據項,它們都是分開的,如有必要可以在客戶端使用。

它們也可以以聲明方式添加而不是在代碼中添加。我只是這樣做是爲了這樣一個GridView:

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

在RowCommand,你這樣做:

所以比用分隔符的所有值黑客在一起,並在年底再拆包乾淨多了。

不要忘記測試/清除您從頁面返回的任何數據,以防被篡改!

+1

我喜歡這種方法,它儘可能接近強項類型,使用逗號和子字符串分隔這種信息,雖然可行,但可能會變得混亂。你需要有關於每個參數部分的固有知識,使用「data-」容器更安全並使代碼更具可讀性。 – GJKH 2016-02-27 16:33:51

0

如果你想通過兩個值,您可以使用此方法

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

基本上我治療{CommmandName,CommandArgument}關鍵值。從數據庫字段中設置。在這種情況下,您必須使用OnClick事件並使用OnCommand事件,我認爲這是更乾淨的代碼。