DOBON.NET DOBON.NETプログラミング掲示板過去ログ

GridViewに貼り付けたLinkButtonを押下時、値を挿入するには?

環境/言語:[環境(WindowsXP Pro)、使用言語(VB.NET2005)、.NET Frameworkのバージョン(2.0)]
分類:[ASP.NET]

お世話になります。

ASP.net2.0(VB.NET2005)で開発しています。
GridViewに貼り付けたLinkButtonを押下したら、選択された行のデータが
指定したテキストボックスに挿入されるような画面を作成したいと思って
います。

現在、検索キーワードでDBに検索して、その結果をGridViewのバインドして
一覧表示までは何とかできたのですが・・・

LinkButton押下時の処理、または設定がわからなくて悩んでいます。
申し訳ありませんが、ご存知の方がいましたらアドバイス宜しくお願い
します。では失礼します。
お世話になります。

■No16612に返信(ガチャピンさんの記事)
GridView の Columns プロパティに、選択列(ButtonType は Link で)を追加します。
そして、GridView.RowCommand イベントでやりたい事を記述します。

以下は例です。
◇aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default3.aspx.vb" Inherits="Default3" %>

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

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>無題のページ</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="GridView1" runat="server">
      <Columns>
        <asp:CommandField ShowSelectButton="True" />
      </Columns>
    </asp:GridView>
    </div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
  </form>
</body>
</html>

◇aspx.vb
Partial Class Default3
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
      Dim dt As Data.DataTable = New Data.DataTable
      dt.Columns.Add("Field1", GetType(String))
      dt.Columns.Add("Field2", GetType(String))
      dt.Columns.Add("Field3", GetType(String))

      For i As Integer = 1 To 10
        dt.Rows.Add(New String() {i.ToString(), _
                     i.ToString() + i.ToString(), _
                     i.ToString() + i.ToString() + i.ToString()})
      Next
      Session("myData") = dt
      Me.GridView1.DataSource = dt
      Me.GridView1.DataBind()
    End If
  End Sub

  Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
    If e.CommandName = "Select" Then
      Dim index As Integer = Convert.ToInt32(e.CommandArgument)
      Dim dt As Data.DataTable = DirectCast(Session("myData"), Data.DataTable)
      Me.TextBox1.Text = Convert.ToString(dt.Rows(index)("Field1"))
      Me.TextBox2.Text = Convert.ToString(dt.Rows(index)("Field2"))
      Me.TextBox3.Text = Convert.ToString(dt.Rows(index)("Field3"))
    End If
  End Sub
End Class
なおこ(・∀・) 様、回答ありがとうございます。

せっかく細かく説明していただいたのに申し訳ありません。
現在のGridViewの設定は下記の通りになっています。

GridViewプロパティの「Columns」のコレクションをクリックして
「使用できるフィールド」から「TemplateField」を追加して
ツールボックスから「LinkButton」を指定しています。

動きは問題なく私が望んでいるものですが、GridViewの一覧には商品コード
にリンクを貼っています。

GridViewのDataSourceにDataTableの値をセッションに指定していますが
このようにしないと選択された値は取得できないのでしょうか?

再度、宜しくお願いします。
では、失礼します。
お世話になります。

■No16621に返信(ガチャピンさんの記事)
> GridViewプロパティの「Columns」のコレクションをクリックして
> 「使用できるフィールド」から「TemplateField」を追加して
> ツールボックスから「LinkButton」を指定しています。
> 動きは問題なく私が望んでいるものですが、GridViewの一覧には商品コード
> にリンクを貼っています。
そうですか。ではこれならどうでしょう。
◇aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default3.aspx.vb" Inherits="Default3" %>

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

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>無題のページ</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="GridView1" runat="server" DataSource='<%# m_datasource %>' AutoGenerateColumns="False">
      <Columns>
        <asp:TemplateField HeaderText="Field1">
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1"
              Text='<%# DataBinder.Eval(Container, "DataItem.Field1") %>'
              CommandArgument='<%# DataBinder.Eval(Container, "DataItem.Field1") %>'
              CommandName="MyCommandName"
              runat="server">LinkButton</asp:LinkButton>
          </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Field2" HeaderText="Field2" />
        <asp:BoundField DataField="Field2" HeaderText="Field3" />
      </Columns>
    </asp:GridView>
    </div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
  </form>
</body>
</html>

◇aspx.vb
Partial Class Default3
  Inherits System.Web.UI.Page

  Protected m_datasource As Data.DataTable

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
      Dim dt As Data.DataTable = New Data.DataTable
      dt.Columns.Add("Field1", GetType(String))
      dt.Columns.Add("Field2", GetType(String))
      dt.Columns.Add("Field3", GetType(String))

      For i As Integer = 1 To 10
        dt.Rows.Add(New String() {i.ToString(), _
                     i.ToString() + i.ToString(), _
                     i.ToString() + i.ToString() + i.ToString()})
      Next
      Session("myData") = dt
      Me.m_datasource = dt
      Me.GridView1.DataSource = dt
      Me.GridView1.DataBind()
    Else
      Me.m_datasource = DirectCast(Session("myData"), Data.DataTable)
    End If
  End Sub

  Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
    If e.CommandName = "MyCommandName" Then
      Dim index As Integer = Convert.ToInt32(e.CommandArgument)
      Me.TextBox1.Text = Convert.ToString(Me.m_datasource.Rows(index)("Field1"))
      Me.TextBox2.Text = Convert.ToString(Me.m_datasource.Rows(index)("Field2"))
      Me.TextBox3.Text = Convert.ToString(Me.m_datasource.Rows(index)("Field3"))
    End If
  End Sub
End Class

> GridViewのDataSourceにDataTableの値をセッションに指定していますが
> このようにしないと選択された値は取得できないのでしょうか?
ASP.NET の値の永続化についてはこちらの「値の永続化」を参照下さい。
(Jitta さんのページ。現在以降作業中みたいなので、キャッシュです)
http://72.14.235.104/search?q=cache:94CR3qsURAUJ:quick-tips.hp.infoseek.co.jp/asp.net/tip.html+ASP.NET%E3%81%AE%E5%B0%8F%E6%8A%80&hl=ja&ct=clnk&cd=1&lr=lang_ja

DOBON.NET | プログラミング道 | プログラミング掲示板