none
GridViewのButtonコントロールにバインドされているテキストの取得について RRS feed

  • 質問

  • いつも大変お世話になっております。

    今日は表題の件でどなたかご存じの方がいらっしゃいましたら教えていただけると大変助かります。

    GridViewコントロールでボタンフィールドを指定し、そこにデータベースの主キーに設定している登録番号を表示するように指定したのですが、プログラム側からそのTEXTを取得することができません。

    | 登録番号  | データ1 | データ2 |
    | 登録001 | AAAA  | BBBBB  |
    | 登録002 | CCCC  | DDDDD  |
    | 登録003 | EEEE  | FFFFF  |


    このような表示を次のプロパティ設定で処理しています。
    登録番号はButtonFieldに設定し、ボタンタイプはリンクボタン、登録番号はDataTextFieldでバインド、Textは空欄にする。データ1,データ2に関してはBoundFieldです。

    そして、登録番号を押したとき、どの登録番号が選択されているのかというTEXTを取得したいのですが、以下のようなコードで取得することができません。

    Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
            Dim index As Integer = CInt(e.CommandArgument)
            Dim row As GridViewRow = GridView1.Rows(index)
            Dim RefnoCell As TableCell = row.Cells(0)
            Dim DataCell As TableCell = row.Cells(1)
            lblSelectNo.Text = RefnoCell.Text.ToString
            lblSelectData.Text = DataCell.Text.ToString
        End Sub

    このとき、row.Cells(0)を参照すると、Textプロパティにはデータが入ってきていないようです。セルの指定そのものは間違えていないようなのですが、ボタンフィールドの場合、自分自身の表示データを取得することはできないのでしょうか?

    実は、前々からこの点に疑問を抱きつつ、コマンドフィールド『選択』を設定することで解決してきていたのですが、年の瀬に若干時間があるので、この際にと思い質問させていただきました。

    理想的な形としては、登録番号そのものをクリックすると、『現在□□□が選択されています』的な表示が出せると最高です。

    お手数をおかけしますが、どなたかご存じの方がいらっしゃいましたらよろしくお願いします。
    2007年12月29日 16:27

回答

  • SurferOnWwwさん、ぷらさん、ごめんなさい。質問の本質を外しておりました。ButtonField自身の値が取りたかったのですね。
    以下のような形で取得できます。実際にはDataControlLinkButtonコントロールで表示されていますが、これを直接利用することができませんので、LinkButtonにキャストします。

     

    lblSelectNo.Text = CType(RefnoCell.Controls(0), LinkButton).Text

     

    なお、ToStringですが、String型でないインスタンスをString型に変換した場合に、どのような文字列を返すのかが実装してあるメソッドです。TextプロパティはString型を返しますので、ここでToStringすることは意味がありません。

    2007年12月30日 14:05
    モデレータ

すべての返信

  • GridView で選択された行の主キーを取得して、それを『現在□□□が選択されて
    います』というように表示したいということと理解して回答します。理解が間違
    っていたら失礼しました。以下の回答は無視してください。

     

    (1) GridView の DataKeyNames を主キーに設定する。

     

    (2) SelectedIndexChanged イベントを取得して処理するイベントハンドらを作成
      する。(RowCommand イベントではなくて)

     

    (3) そのイベントハンドラの中で GridView.SelectedValue プロパティを使用し
      て主キー値を取得する。

     

    (4) Label 等を利用して取得した主キー値を表示する。

    2007年12月30日 1:06
  • 先の回答で ButtonField.CommandName プロパティを Select にしておくことを忘れてい
    ました。

     

    SQL Server 利用で言語は C# ですが、自分の環境で試してご要望どおりの表示ができ

    たコードを記載しておきます。

     

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Label1.Text = "現在" + GridView1.SelectedValue.ToString() + "が選択されています";
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">

        <aspTongue TiedqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:MyDB %>"
            SelectCommand="SELECT * FROM [Test]"></aspTongue TiedqlDataSource>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="登録番号" DataSourceID="SqlDataSource1"
            onselectedindexchanged="GridView1_SelectedIndexChanged">
            <Columns>
                <asp:ButtonField DataTextField="登録番号" HeaderText="登録番号" CommandName="Select" />
                <asp:BoundField DataField="データ1" HeaderText="データ1" SortExpression="データ1" />
                <asp:BoundField DataField="データ2" HeaderText="データ2" SortExpression="データ2" />
            </Columns>
        </asp:GridView>
        <asp:Label ID="Label1" runat="server"></asp:Label>

        </form>
    </body>
    </html>

    2007年12月30日 2:05
  • 一部の文字がなぜか顔マークになってしまいましたが、その部分は : と S です。

    続けるとなぜか顔マークに変わってしまうようです。

     

    2007年12月30日 2:19
  •  ぷら さんからの引用

    そして、登録番号を押したとき、どの登録番号が選択されているのかというTEXTを取得したいのですが、以下のようなコードで取得することができません。


    提示されたコードで試してみましたが、特に問題なくコードを取得できました。GridViewの定義はどのようになっていますでしょうか?

     

    #ちなみに、
            lblSelectNo.Text = RefnoCell.Text.ToString
            lblSelectData.Text = DataCell.Text.ToString

            lblSelectNo.Text = RefnoCell.Text
            lblSelectData.Text = DataCell.Text
    で問題ありません。

    2007年12月30日 7:40
    モデレータ
  •  SurferOnWww さんからの引用

    一部の文字がなぜか顔マークになってしまいましたが、その部分は : と S です。

    続けるとなぜか顔マークに変わってしまうようです。

     

    コードを掲載される時に、ツールバーのコードブロックを使われると良いですよ。

     

    Tongue Tied

     

    コード ブロック

    :S

     

     

    2007年12月30日 8:15
    モデレータ
  • 顔マークの件、アドバイスを有難うございました。

     

    自分が掲載されているコードを試したところ、確かに質問者の方が言われる
    とおり値は取得できない(RefnoCell.Text は "" になる)という結果にな
    りました。

     

    BoundField に設定すれば、期待通りの値が取得できましたが。たとえば下
    記のように。なぜ trapemiya さんと結果が異なるかわかりません。

     

     

    コード ブロック

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int index = Int32.Parse((string)e.CommandArgument);
            GridViewRow row = GridView1.Rows[index];
            TableCell RefnoCell = row.Cells[0];
            TableCell DataCell = row.Cells[1];
            lblSelectNo.Text = RefnoCell.Text;
            lblSelectData.Text = DataCell.Text;
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:MyDB %>"
                SelectCommand="SELECT * FROM [Test]"></asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="登録番号" DataSourceID="SqlDataSource1"
                onrowcommand="GridView1_RowCommand">
                <Columns>
                    <asp:BoundField DataField="登録番号" HeaderText="登録番号" />
                    <asp:BoundField DataField="データ1" HeaderText="データ1" />
                    <asp:BoundField DataField="データ2" HeaderText="データ2" />
                    <asp:ButtonField DataTextField="登録番号" HeaderText="登録番号" />
                </Columns>
            </asp:GridView>
            <asp:Label ID="lblSelectNo" runat="server"></asp:Label>
            <asp:Label ID="lblSelectData" runat="server"></asp:Label>
       
        </div>
        </form>
    </body>
    </html>

     

     

    2007年12月30日 12:23
  • SurferOnWwwさま、最初のリプライ通り、当を得てご理解いただけたかと思います。絶妙な解決策をご呈示いただき、誠にありがとうございます。また、大変ご丁寧な解説に心より感謝申し上げます。私のような初級者にはいろいろ迷うことなどもあるので、参考用のコードがあると大変勉強になります。今後とも何卒よろしくお願いします。

    trapemiyaさま、いつも大変お世話になっております。『.toString』ありがとうございます。今までどちらがいいのかなぁ??と思いながら右側はいつも『.toString』を使っていました。確かに等式は成立するので常々迷いがありましたが、今回すっきりしました。上級者の方のご意見はテクニック的な部分から細部のコードの書き方まで大変参考になります。ご迷惑かと思いますが、お気づきの点はぜひいろいろ教えていただけたら幸いです。今後とも何卒よろしくお願いします。
    2007年12月30日 13:45
  • さて、ところでtrapemiyaさまのお手元の環境で、私のコードが問題なく期待通りの動作をする点が気になります。

    私が設定しているGridViewは、ほとんどがデフォルト値のままだと思います。自分で気付かず、もしくは認識せずに設定をさわっているもの以外は、このスレッドをたてたところに記載しているままだと思います。

    私の設定で不足している可能性などなにかアドバイスいただけそうな点がありましたら、ぜひお伺いできますでしょうか?
    2007年12月30日 13:45
  • SurferOnWwwさん、ぷらさん、ごめんなさい。質問の本質を外しておりました。ButtonField自身の値が取りたかったのですね。
    以下のような形で取得できます。実際にはDataControlLinkButtonコントロールで表示されていますが、これを直接利用することができませんので、LinkButtonにキャストします。

     

    lblSelectNo.Text = CType(RefnoCell.Controls(0), LinkButton).Text

     

    なお、ToStringですが、String型でないインスタンスをString型に変換した場合に、どのような文字列を返すのかが実装してあるメソッドです。TextプロパティはString型を返しますので、ここでToStringすることは意味がありません。

    2007年12月30日 14:05
    モデレータ
  • trapemiyaさま、誠にありがとうございます。このような方法を使うのですね。大変勉強になりました。

    また、『.ToString』は完全理解だと思います。今までのコードを新しい理解で見るとだいぶ無駄なことが書いてあるような気がしてきました。

    GridViewコントロールは様々なことができる高度なコントロールであると同時に、奥深さを感じます。

    他の方のスレッドも含めて、様々な情報が載っているのでいつも参考にさせていただいております。また壁にぶち当たった際にはぜひお力をお借りできればと望んでおります。trapemiyaさま、SurferOnWwwさま、今後とも何卒よろしくお願いします。
    2007年12月30日 16:07