web-dev-qa-db-ja.com

非表示のID値を取得するためにリンクボタンをクリックすると、aspxgridviewの選択された行を取得

リンクボタンとaspgridviewのタイトルデータをバインドし、ID値を保持する非表示のラベルもバインドしています。ユーザーがこのリンクボタンをクリックすると、ID値にアクセスしたいと思います。これが必要なのは、ユーザーがログインした場合、詳細ウィンドウをポップアップするか、詳細についてはログインするよう警告メッセージを表示するだけだからです。

lnkTitle_Click()イベントで、選択した行にアクセスしてラベルコントロールを見つけようとしています。

GridViewRow grdSelRow = GridView1.SelectedRow;
Label lblID = (Label)grdSelRow.FindControl("lblID");

しかし、私はgrdSelRowをヌルとして取得しています。

Gridviewのリンクボタンをクリックしたときに選択した行を取得する方法は?

18
NMM

問題は、GridViewでボタンをクリックすると、行がSelectedRowではなく、クリックされた行のみになることです。 SelectedRowにしたい場合は、ボタンのマークアップでCommandName="Select"を指定する必要があります。

要件を満たすための2つの方法を次に示します。

ItemTemplate内のLinkBut​​tonの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を使用して、LinkBut​​tonクリックをキャッチします。

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");
    }
}
24
naveen