Asp.netのボタンのCommandArgumentを介して複数の引数を渡します
-
24-09-2019 - |
質問
私は複数の行とGridViewコントロールを持って、それぞれの更新]ボタンを持って、私はときUpdate]ボタンを誰かがクリックする2つの値を渡す必要があります。 別にCommandArgument内部の引数を梱包から(古風でエレガントではない)コンマで区切って、どのように私はより多くの1つの引数より渡すのでしょうか?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
私は現在、任意のデザイン・ソリューションを求めているわけではないので、注意点として、値は、ページ上の任意のコントロールから取得することはできません。
解決
は見えます。
ただ、コンマか何かを使用して、あなたがそれを消費したいときにそれを分割します。
他のヒント
あなたはセミコロンを渡すことができますが、文字列を分割し、それを使用し、コマンドの引数として値を分離します。
<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");
}
希望それが!!!!
のに役立ちます@パトリックの答えは良いアイデアであり、より信用に値します!あなたが望むように、これらは全て分離されている多くのデータ項目として持つことができ、必要に応じて使用するクライアント側することができます。
また、むしろコードに比べて、宣言を添加することができます。
:私はちょうどこのように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
}
}
の区切り文字と一緒にすべての値をハッキングし、最後に再び開梱よりもそんなにきれいます。
Doが、それが改ざんされていた場合には、そのページから取り戻す任意のデータをきれいに/テストすることを忘れないで!
私のアプローチは、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();
A上記のコメントに追加するには同じことをやって、もう少しエレガントな方法..
<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..
}
GridViewのをdatakeysコレクションに保存したり、同じセル内に隠されたフィールドに格納し、または一緒に値を結合するのどちらか。それは唯一の方法です。あなたは一つのリンクで2つの値を格納することはできません。
あなたが渡したい場合は、を二つの値を、あなたがこのアプローチを使用することができます。
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
基本的に、私はキー値として{CommmandName、CommandArgument}を処理しています。データベースフィールドからの両方を設定してください。あなたは、私がもっときれいなコードだと思うこの場合、中のOnClickイベントと使用OnCommand
イベントを使用する必要があります。