リンクボタンとaspgridviewのタイトルデータをバインドし、ID値を保持する非表示のラベルもバインドしています。ユーザーがこのリンクボタンをクリックすると、ID値にアクセスしたいと思います。これが必要なのは、ユーザーがログインした場合、詳細ウィンドウをポップアップするか、詳細についてはログインするよう警告メッセージを表示するだけだからです。
lnkTitle_Click()イベントで、選択した行にアクセスしてラベルコントロールを見つけようとしています。
GridViewRow grdSelRow = GridView1.SelectedRow;
Label lblID = (Label)grdSelRow.FindControl("lblID");
しかし、私はgrdSelRowをヌルとして取得しています。
Gridviewのリンクボタンをクリックしたときに選択した行を取得する方法は?
問題は、GridViewでボタンをクリックすると、行がSelectedRow
ではなく、クリックされた行のみになることです。 SelectedRowにしたい場合は、ボタンのマークアップでCommandName="Select"
を指定する必要があります。
要件を満たすための2つの方法を次に示します。
ItemTemplate内のLinkButtonのonclickイベントをワイヤリングします
Markup
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server"
Text="Click1"
OnClick="LinkButton1_Click"/>
</ItemTemplate>
</asp:TemplateField>
コードビハインド
protected void LinkButton1_Click(object sender, EventArgs e)
{
GridViewRow clickedRow = ((LinkButton) sender).NamingContainer as GridViewRow;
Label lblID = (Label)clickedRow.FindControl("lblID");
}
RowCommandを使用して、LinkButtonクリックをキャッチします。
Markup
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton2" runat="server"
Text="Click2"
CommandName="MyCustomCommand"/>
</ItemTemplate>
</asp:TemplateField>
コードビハインド
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if(e.CommandName.Equals("MyCustomCommand"))
{
GridViewRow clickedRow = ((LinkButton)e.CommandSource).NamingContainer as GridViewRow;
Label lblID = (Label)clickedRow.FindControl("lblID");
}
}