2010-03-05 41 views
20

Tôi có chế độ xem lưới với nhiều hàng, mỗi hàng có nút Cập nhật và tôi cần phải chuyển 2 giá trị khi ai đó nhấp vào nút Cập nhật. Ngoài việc đóng gói các đối số bên trong CommandArgument cách nhau bằng dấu phẩy (cổ xưa và không thanh lịch), làm thế nào tôi có thể vượt qua nhiều hơn một đối số?Chuyển nhiều đối số thông qua CommandArgument của Button trong Asp.net

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

Lưu ý, không thể truy lục giá trị từ bất kỳ điều khiển nào trên trang, do đó, không cung cấp bất kỳ giải pháp thiết kế nào. Hãy tập trung vào câu hỏi. Cảm ơn trước.

+7

Giải pháp 'cổ xưa' của việc sử dụng dấu phân tách đôi khi là cách dễ nhất. – Kelsey

+0

@sarsnake - tôi sẽ chấp nhận câu trả lời của Archana Motagi – fubo

Trả lời

13

Sau khi poking xung quanh nó trông giống như Kelsey là chính xác.

Chỉ cần sử dụng dấu phẩy hoặc thứ gì đó và chia nhỏ nó khi bạn muốn dùng nó.

+4

đã tìm thấy điều này: http://aspdotnetcodebook.blogspot.com/2008/09/how-to-pass-multiple-values-to.html – sarsnake

1

Hoặc lưu trữ nó trong bộ sưu tập dữ liệu GridView hoặc lưu trữ nó trong một trường ẩn bên trong cùng một ô hoặc kết hợp các giá trị với nhau. Đó là cách duy nhất. Bạn không thể lưu trữ hai giá trị trong một liên kết.

70

Bạn có thể chuyển giá trị được phân cách bằng dấu chấm phẩy làm đối số lệnh rồi chia chuỗi và sử dụng nó.

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

ở phía máy chủ

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

Hy vọng nó giúp !!!!

+0

Điều trên đã làm việc cho tôi. Chỉ có vấn đề là bạn đang thiếu các tham số trong liên kết Chuyển hướng() ASPX. Hãy thử Response.Redirect ("Samplepage.aspx? IdTemplate =" + Session ["IdTemplate"] ToString(). Trim() + "& IdEntity =" + Session ["IdEntity"]. ToString(). Trim()); – Fandango68

+0

Là một pedant bạn không cần. ToString(). CommandArgument luôn là một chuỗi, vì vậy: var arguments = ((LinkButton) người gửi) .CommandArgument.Split (';'); –

2

Một chút cách thanh lịch hơn để làm điều tương tự thêm vào những nhận xét trên ..

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

Và ở phía máy chủ:

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

    // Do stuff.. 
} 
+0

Điều này chỉ hoạt động nếu bạn muốn các trường IdTemplate và EntityId được hiển thị trong lưới của bạn. Các giá trị bạn đặt trong CommandArgument không bao giờ thực sự được sử dụng. – cyberspy

5

Tiếp cận của tôi đang sử dụng bộ sưu tập thuộc tính thêm Thuộc tính dữ liệu HTML từ mã phía sau. Điều này là nội tuyến hơn với kịch bản lệnh jquery và phía máy khách.

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

Sau đó lấy các giá trị thông qua các bộ sưu tập thuộc tính

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

@ câu trả lời Patrick là một ý tưởng tốt, và xứng đáng tín dụng nhiều hơn !. Bạn có thể có bao nhiêu mục dữ liệu tùy ý, tất cả chúng đều được tách ra và có thể được sử dụng phía máy khách nếu cần.

Chúng cũng có thể được thêm vào khai báo thay vì mã. Tôi chỉ làm điều này cho một GridView như thế này:

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

Trong RowCommand, bạn làm như sau:

Vì vậy sạch hơn nhiều so với hack tất cả các giá trị cùng với delimiters và giải nén một lần nữa ở cuối.

Đừng quên kiểm tra/xóa mọi dữ liệu bạn lấy lại từ trang, trong trường hợp nó bị giả mạo!

+1

Tôi thích cách tiếp cận này, nó gần như bạn sẽ nhận được để có các mục mạnh mẽ đánh máy, sử dụng dấu phẩy và chuỗi con để tách loại thông tin này, mặc dù hoàn toàn khả thi, có thể trở thành một mớ hỗn độn. Bạn cần có kiến ​​thức vốn có về từng phần của đối số, sử dụng các vùng chứa "data-" an toàn hơn và làm cho mã dễ đọc hơn nhiều. – GJKH

0

Nếu bạn muốn vượt qua hai giá trị, bạn có thể sử dụng phương pháp này

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

Về cơ bản tôi đang điều trị {CommmandName, CommandArgument} là giá trị quan trọng. Đặt cả hai từ trường cơ sở dữ liệu. Bạn sẽ phải sử dụng sự kiện OnClick và sử dụng sự kiện OnCommand trong trường hợp này, mà tôi nghĩ là mã sạch hơn.

Các vấn đề liên quan