- PR -

DataGridのDataViewソートとテンプレート列

投稿者投稿内容
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-19 11:38
> DataGridを表示するためのSQL文でこの項目を用意して
> あげればいいのかなぁ?
です。

さらに補足すると、
コード:

Checked='<%# DataBinder.Eval(Container.DataItem, "YUKO_FLG") == "1" %>'


この辺の式で生成できる(例: 「何とかコードの先頭が'1'の時」)のなら、そもそも単独の項目として取得する必要さえありません。

[ メッセージ編集済み 編集者: にしざき 編集日時 2005-07-19 11:40 ]
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-07-19 14:08
にしざき様、いつもありがとうございます♪

SQL文を以下のようにしました。
-------------------------------------------------------
sql = "SELECT *, '0' AS CHECK_FLG " & _
   "FROM TABLE_A " & _
   "WHERE TABLE_A.SHAIN_NO = '" & shain_no & "'"
-------------------------------------------------------

ASPは以下のように記述しました。
-------------------------------------------------------
<asp:CheckBox id="CheckBox1" runat="server"
 Checked='<%# DataBinder.Eval(Container.DataItem, "CHECK_FLG") = "0" %>'>
</asp:CheckBox>
-------------------------------------------------------

結果は以下のようになりました。
・DataGrid自体は表示されました
・明細行は1行だけ表示されました
・チェックボックスだけ表示されてデータは何も表示されませんでした


> この辺の式で生成できる(例: 「何とかコードの先頭が'1'の時」)のなら、
> そもそも単独の項目として取得する必要さえありません。
?? す、すいません。
噛み砕いてお願いできますでしょうか。

そういえば、私のやりたいことをお話ししていなかったので
簡単にお伝えさせてください。
1.テーブルの内容をDataGridで表示する。
2.ある処理を行いたいデータにのみチェックをONにする。
3.[実行]ボタンを押すとチェックされている行だけ処理する。

どうぞよろしくお願いいたします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-19 14:43
> 1.テーブルの内容をDataGridで表示する。
> 2.ある処理を行いたいデータにのみチェックをONにする。
> 3.[実行]ボタンを押すとチェックされている行だけ処理する。

チェックの初期値はすべて OFF ですか? それともいずれかの条件を満たすものだけ
ON にしますか?

本スレッドの元投稿では、チェックの初期値を設定する方法について聞かれていたのですが、nori さんのご質問ではチェックの結果の取得方法を聞いているように感じられたので。

チェック結果の取得方法であれば、VB.NET は知らないんですが、
コード:
Dim item As DataGridItem
Dim check As CheckBox

For Each item In ADataGrid.Items
  Select Case item.ItemType
    Case ListItemType.Item, ListItemType.AlternatingItem
      Check = CType(item.FindControl("CheckBox1"), CheckBox)
      If Not Check Is Nothing Then
        ' ここは具体的な処理に変える
        DoSomething(ADataSet.DefaultView[item.ItemIndex].Row)
      End If
  End Select
Next


こんなもんかなぁ? いつも掲示板に書くコードは試していないので、
動かない可能性は充分にありますが。
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-09-02 11:00
にしざき様、いつもありがとうございます。
お返事を差し上げず、申し訳ございませんでした。

1ヶ月半ほど別の仕事をしておりプログラムを組めませんでしたが
またこの仕事に復帰しましたので宜しくお願い致します。

このように記述してDataGridは正常に表示されるようになりました。
---------------------------------------------------------------------
<ItemTemplate>
  <asp:CheckBox id=CheckBox1 runat="server"
     Checked='<%# DataBinder.Eval(Container.DataItem, "CHECK_FLG") %>'>
  </asp:CheckBox>
</ItemTemplate>
---------------------------------------------------------------------

にしざき様に教えて頂いたのをを参考にチェック結果の取得方法も出来ました。

チェックボックスの初期値はOFFにします。

最後の問題はソートです。
チェックボックスをチェックした後にソートを行うとチェックが無効に
なってしまいます。
ソート時のDataBindで何かしなければいけないように思うのですが。。。

皆様、またお力をお貸し頂けたら嬉しいです♪
よろしくお願い申し上げます。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-02 12:50
「ソートを行うと」って時点で DataBind() を呼んでいますよね。
この時点でチェック状態は失われる(DataTable から設定しなおす)ので、この前にチェック状態を設定するためのデータ
を更新してやる必要があります。
元 DataTable の CHECK_FLG 列の値をこの時点で更新していいのであれば、前回の私の投稿か、別の方法を用いて更新を行います。
依然として VB.NET での記述方法はわからない上に全く試していないのですが、
コード:
<ItemTemplate>
  <asp:CheckBox id=CheckBox1 runat="server"
    Checked='<%# DataBinder.Eval(Container.DataItem, "CHECK_FLG") %>'
    OnCheckedChanged='CheckFlgChanged'
  />
</ItemTemplate>


として、
コード:
Protected Sub CheckFlgChanged(ByVal sender As Object, ByVal e As EventArgs)
  ' DataGrid.DataSource に DefaultView 以外の DataView を渡していたなら、
  ' 同条件の DataView を作る
  ADataSet.DefaultView(item.ItemIndex)("CHECK_FLG") = DirectCast(sender, CheckBox).Checked
End Sub


こんなので更新できるのかなぁ。

一旦更新してしまえば、あとは当初と同様に DataBind() 内で勝手にチェックをつけてくれるはず。
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-09-02 19:08
にしざき様、ありがとうございます。

ソート時にDataBind()を呼んでいます。

ご指摘通り OnCheckedChanged='CheckFlgChanged' を入れて、
コードを以下のようにしました。

---------------------------------------------------------------
Protected Sub CheckFlgChanged(ByVal sender As Object, ByVal e As EventArgs)
 Dim Item As DataGridItem
 Dim ds As New DataSet
 Dim dv As New DataView

 ds = Cache("DS")
 dv = ds.Tables(0).DefaultView
 dv(Item.ItemIndex)("CHECK_FLG") = DirectCast(sender, CheckBox).Checked
End Sub
---------------------------------------------------------------
※最初に画面を開いたときにDataBind()でキャッシュにDataSetを保存しています。

ソートを実行したところエラーになります。

エラー:オブジェクトはインスタンスに設定されていません。

ds、dv とも New してますし、、、、、。
基本的なことで申し訳ありませんが、どうか宜しくお願い致します。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-02 19:43
Item が設定されていませんね。これは、ItemDataBound の時の話だった。
自分で探さなきゃいけないかもしれません。

コード:
Dim Ctrl As Control = DirectCast(sender, Control)
Do While Not Ctrl Is Nothing AndAlso TypeOf Ctrl Is DataGridItem
  Ctrl = Ctrl.Parent
Loop
Item = DirectCast(Ctrl, DataGridItem)


かな?
手抜きをすると、
コード:
Item = DirectCast(DirectCast(sender, Control).Parent.Parent, DataGridItem)


ですが。
nori
ベテラン
会議室デビュー日: 2004/09/02
投稿数: 56
投稿日時: 2005-09-05 15:01
にしざき様、本当にいつもありがとうございます☆

で、できました!!!!!
感動です!!

----------------------------------------------------------
Protected Sub CheckFlgChanged(ByVal sender As Object, ByVal e As EventArgs)
 Dim Item As DataGridItem
 Dim ds As New DataSet
 Dim dv As New DataView

 Item = DirectCast(DirectCast(sender, Control).Parent.Parent, DataGridItem)
 ds = Cache("DS")
 dv = ds.Tables(0).DefaultView
 dv(Item.ItemIndex)("CHECK_FLG") = DirectCast(sender, CheckBox).Checked
End Sub
----------------------------------------------------------

Item = DirectCast(DirectCast(sender, Control).Parent.Parent, DataGridItem)
senderとして渡されたものをDataGridItem型に変換するということだと思うのですが、
DirectCast(sender, Control) を入れるのは何故でしょうか?

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