複数の行があるグリッドビューがあり、各行には更新ボタンがあり、誰かが更新ボタンをクリックしたときに2つの値を渡す必要があります。コンマで区切られたCommandArgument(古風でエレガントではない)内に引数をパックする以外に、複数の引数を渡すにはどうすればよいですか?
<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");
}
それが役に立てば幸い!!!!
@Patrickの答えは良い考えであり、より多くの信用に値する!。必要な数のデータ項目を使用でき、それらはすべて分離されており、必要に応じてクライアント側で使用できます。
コードではなく宣言的に追加することもできます。次のような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
}
}
すべての値を区切り文字と一緒にハッキングし、最後に再び展開するよりもずっときれいです。
改ざんされた場合に備えて、ページから取得したデータをテスト/クリーンアップすることを忘れないでください!
私のアプローチは、属性コレクションを使用して、コードビハインドから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();
上記のコメントに同じことを追加するもう少しエレガントな方法..
<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コレクションに保存するか、同じセル内の非表示フィールドに保存するか、値を結合します。それが唯一の方法です。 1つのリンクに2つの値を保存することはできません。
2つの値を渡したい場合は、このアプローチを使用できます
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
基本的に、{CommmandName、CommandArgument}をキー値として扱っています。データベースフィールドから両方を設定します。この場合、OnClickイベントを使用し、OnCommand
イベントを使用する必要があります。これは、よりクリーンなコードだと思います。