- PR -

DataGridのCheckBox列にDBのあるテーブルの主キー値をバインドしたい

1
投稿者投稿内容
apu
会議室デビュー日: 2003/10/14
投稿数: 11
投稿日時: 2003-10-14 20:14
いつも参考にさせていただいています。
早速ですが、DataGridを使いこなせず困っているのでぜひお知恵をお貸しください。

データベースにAテーブルがあり、Aテーブルを参照するDataSetAを作成します。
DataGridはDataSetAをバインドさせて、テーブルの中身を表示させるまでできました。

ここで、DataGridにチェックボックスを持つテンプレート列を追加して、Aテーブルの主キー値(int)をチェックボックスのvalueにもつようにしたいのですが、どのようにすればよいか分かりません。そもそも<asp:checkbox>にはvalueプロパティがないですね。

やりたいことはテーブルの中のすべてのレコードにチェックボックスをつけて表示し、
主キー列は非表示にして隠し、チェックのON/OFFを主キー値で取得したい、ということなんです。

どなたか、似たようなケースで他のやり方でもよいので実現方法をご存知の方、ぜひ詳しく教えてください。

よろしくお願いします。
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-15 00:11
引用:
ここで、DataGridにチェックボックスを持つテンプレート列を追加して、Aテーブルの主キー値(int)をチェックボックスのvalueにもつようにしたいのですが、どのようにすればよいか分かりません。そもそも<asp:checkbox>にはvalueプロパティがないですね。

確かにCheckBoxコントロールにはありませんが、当然HTMLでは使えますので
value='<%# ...%>と書いてやれば、Attributes["value"]で読めますよ。
HTMLコントロールのチェックボックスならvalueプロパティありますから
やりたいことはこちらでも十分だと思いますが。
apu
会議室デビュー日: 2003/10/14
投稿数: 11
投稿日時: 2003-10-15 19:27
返信ありがとうございます。

checkboxへの簡単なバインドの仕方はないようですね。
教えていただいた方法を検討してみます。
どうもありがとうございました。
ophiuchus
会議室デビュー日: 2003/08/27
投稿数: 11
投稿日時: 2003-10-17 09:59
解決済みかもしれませんが、気になったので実装してみました。

ぴでさんの言うとおりHTMLではcheckboxにvalueがあります。でも
CheckBoxコントロールには無いんですよね。知りませんでした。
そこで無理やりCheckBoxコントロールに"value"属性をくっつけて
みたのですが、吐き出されたHTMLには可視できるvalueがどこにも
見当たりませんでした。でもボタンか何かでポストバックさせて
みるとしっかりvalue属性に値が入っています。viewstateに
入っているのでしょうか?確認していませんので分かりませんが。

コードでコメントアウトしてあるAttributes("USER_ID")なる実装で
こちらも勝手に属性を付けてみましたが、こちらはしっかり可視
出来る形でHTMLに吐き出されていました。


コード:
    Private m_myDT As DataTable

    Private Sub Page_Load(略...
        Dim myDR As DataRow
        Dim intI As Integer
        Dim myCB As CheckBox

        If Not IsPostBack Then
            m_myDT = New DataTable()
            m_myDT.Columns.Add("USER_ID")
            m_myDT.Columns.Add("USER_NAME")

            myDR = m_myDT.NewRow
            myDR("USER_ID") = "001"
            myDR("USER_NAME") = "太郎"
            m_myDT.Rows.Add(myDR)

            myDR = m_myDT.NewRow
            myDR("USER_ID") = "002"
            myDR("USER_NAME") = "花子"
            m_myDT.Rows.Add(myDR)

            myDR = m_myDT.NewRow
            myDR("USER_ID") = "003"
            myDR("USER_NAME") = "一郎"
            m_myDT.Rows.Add(myDR)

            DataGrid1.DataSource = m_myDT
            DataGrid1.DataBind()

            Session("myDT") = m_myDT
        Else
            m_myDT = Session("myDT")
            DataGrid1.DataSource = m_myDT
            For intI = 0 To DataGrid1.Items.Count - 1
                myCB = DataGrid1.Items(intI).FindControl("CheckBox1")
                If myCB.Checked Then
                    System.Diagnostics.Debug.WriteLine(myCB.Attributes("value"))
                    'System.Diagnostics.Debug.WriteLine(myCB.Attributes("USER_ID"))
                End If
            Next
        End If
    End Sub

    Private Sub DataGrid1_ItemDataBound(略...
        Dim myCB As CheckBox
        If e.Item.ItemIndex >= 0 Then
            myCB = e.Item.FindControl("CheckBox1")
            myCB.Attributes("value") = CType(e.Item.DataItem, DataRowView)("USER_ID")
            'myCB.Attributes("USER_ID") = CType(e.Item.DataItem, DataRowView)("USER_ID")
        End If
    End Sub


ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-17 12:06
"value"は予約語にでもなっているからHTMLには出力されないんですかね?
ViewStateにはしっかり入っていました。

チェックボックスをチェックしてsubmitする時は"name=value"の形でポストされますが、
HTML上のチェックボックスにvalue属性が無い場合はIEがデフォルト値"on"をセットし、
"grid:_ctl2:chk1=on"のような形でポストされます。

HTMLコントロールを使えば、valueプロパティもあり、
"grid:_ctl2:chk1=[設定したvalue]"のように取得できますから
apuさんのやりたいことならこれでも十分かと思いました。

Webコントロールを使うとViewStateに格納されるものが多く無駄な場合もあるため、
適宜HTMLコントロールを使うことを検討してみるとよいと思います。
apu
会議室デビュー日: 2003/10/14
投稿数: 11
投稿日時: 2003-10-17 14:32
ophiuchusさん、ぴでさん、ありがとうございます。

HTMLのCheckBoxを使ってみたり、いろんな試行錯誤をした結果、
主キー列をVisible=falseにして、GridItemをひとつずつトレースして、
CheckBoxがチェックされているItemの主キー列の値を取得する、
という方法にしました。

これだと、クライアントスクリプトではVisible=false
の列の値がわからなくて困るんですよね…。
クライアントでも値をとりたいときは、お二人のご意見を参考にきちんと作りたいと思います。

引用:

ぴでさんの書き込み (2003-10-17 12:06) より:

Webコントロールを使うとViewStateに格納されるものが多く無駄な場合もあるため、
適宜HTMLコントロールを使うことを検討してみるとよいと思います。



こちらも同感です。ViewStateの情報量はきちんと管理しないといけないですね。

まだまだ初心者なので、今後もよろしくお願いします。
今回はありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)