我有一个包含多行的gridview,每个都有一个Update按钮,当有人点击Update按钮时我需要传递2个值。 除了用逗号分隔CommandArgument内的参数(古老而不优雅)之外,我如何传递多个参数?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
注意,无法从页面上的任何控件中检索值,因此不提供任何设计解决方案。请专注于提出的问题。提前谢谢。
答案 0 :(得分:74)
您可以将分号分隔值作为命令参数传递,然后拆分字符串并使用它。
<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");
}
希望它有帮助!!!!
答案 1 :(得分:15)
在探索之后,看起来Kelsey是正确的。
只需使用逗号或其他内容,并在想要使用时将其拆分。
答案 2 :(得分:13)
它们也可以以声明方式而不是代码方式添加。我只是为这样的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中,您可以这样做:
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
}
}
比将所有值与分隔符一起清理并在最后再次打开包装更加清晰。
不要忘记测试/清除从页面返回的任何数据,以防它被篡改!
答案 3 :(得分: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();
答案 4 :(得分:4)
更优雅的方式做同样的补充上述评论..
<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..
}
答案 5 :(得分:1)
将其存储在gridview datakeys集合中,或将其存储在同一单元格内的隐藏字段中,或将这些值连接在一起。这是唯一的方法。您不能在一个链接中存储两个值。
答案 6 :(得分:0)
如果您想传递两个值,可以使用此方法
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
基本上我将{CommmandName,CommandArgument}视为键值。从数据库字段设置。在这种情况下,您将不得不使用OnClick事件并使用OnCommand
事件,我认为这是更干净的代码。