Gridfieldアイテムの行インデックスをボタンフィールドの列ボタンのコマンド引数としてアクセスして表示するにはどうすればよいですか?
<gridview>
<Columns>
<asp:ButtonField ButtonType="Button"
CommandName="Edit" Text="Edit" Visible="True"
CommandArgument=" ? ? ? " />
.....
これは非常に簡単な方法です。
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True"
CommandArgument='<%# Container.DataItemIndex %>' />
[〜#〜] msdn [〜#〜] はこう言います:
ButtonFieldクラスは、CommandArgumentプロパティに適切なインデックス値を自動的に入力します。他のコマンドボタンの場合、コマンドボタンのCommandArgumentプロパティを手動で設定する必要があります。たとえば、GridViewコントロールでページングが有効になっていない場合、CommandArgumentを<%#Container.DataItemIndex%>に設定できます。
したがって、手動で設定する必要はありません。 GridViewCommandEventArgsを使用した行コマンドは、アクセス可能にします。例えば.
protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
int rowIndex = Convert.ToInt32( e.CommandArgument );
...
}
これに関するマイクロソフトの提案はこちら http://msdn.Microsoft.com/en-us/library/bb907626.aspx#Y8
Gridviewでコマンドボタンを追加してテンプレートに変換し、この場合「AddToCart」というコマンド名を付けて、CommandArgument "<%#((GridViewRow)Container).RowIndex%>"
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="AddButton" runat="server"
CommandName="AddToCart"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Add to Cart" />
</ItemTemplate>
</asp:TemplateField>
次に、gridviewのRowCommandイベントで作成するために、「AddToCart」コマンドがいつトリガーされるかを識別し、そこから必要なことを行います。
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "AddToCart")
{
// Retrieve the row index stored in the
// CommandArgument property.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button
// from the Rows collection.
GridViewRow row = GridView1.Rows[index];
// Add code here to add the item to the shopping cart.
}
}
**私が犯した間違いの1つは、RowCommandイベントに直接行うのではなく、テンプレートボタンにアクションを追加したかったということです。
これはうまくいくと思います。
<gridview>
<Columns>
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True" CommandArgument="<%# Container.DataItemIndex %>" />
</Columns>
</gridview>
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Button b = (Button)e.CommandSource;
b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}
通常、GridDataでRowDataboundイベントを使用してこのデータをバインドします。
protected void FormatGridView(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
((Button)e.Row.Cells(0).FindControl("btnSpecial")).CommandArgument = e.Row.RowIndex.ToString();
}
}
<asp:TemplateField HeaderText="" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:LinkButton runat="server" ID="lnkAdd" Text="Add" CommandName="Add" CommandArgument='<%# Eval("EmpID"))%>' />
</ItemTemplate>
</asp:TemplateField>
これは、強く型付けされたデータを持つasp.netフレームワークの従来の方法で最新バージョンであり、「EMPID」のような文字列として使用する必要はありません。