- PR -

DataGridで並替えを行い、行を挿入して表示

1
投稿者投稿内容
織部
会議室デビュー日: 2003/05/30
投稿数: 3
投稿日時: 2003-06-30 13:59
こんにちは。はじめての投稿です。宜しくお願いします。
VB.netでプログラムのWebアプリケーションの開発を行なっています。
今行なっていることがDataGridにデータを表示するだけなのですが、
その過程でDataViewのデータを並び替えて、行の挿入を行なってからBindしています。
実際には
--------------------------------------------------------------
・・・
@ DataView1.sort = "name"

A For Each myRow In Dataview1.Table.Rows
'挿入する行の位置を検索
・・・
・・・
・・・
ReDim Preserve cntRow(i)
cntRow(i) = cnt
NEXT

B Dim a as Integer
For Each a In cntRow
'行を挿入
myRow = DataView1.Table.NewRow
myRow("name") = "dummy"
・・・
・・・
DataView.Table.Rows.InsertAt(myRow, a)
Next

C DataGrid1.DataSource = DataView1.Table
DataGrid1.DataBind()
--------------------------------------------------------------
こんな感じで行なっています。

上に記載した手順で実行しますとDataViewのデータをソートしてから
行を挿入しBindしてるわけですから、挿入した行に対してはソートが行なわれないと
思うのですが、実際に行なってみると、ソートが実行されるタイミングがBindする
直前(?)で挿入した行も一緒にソートされてしまいます。

挿入した行がソートされないような方法を探しています。
お手数ですがよろしくお願いします。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2003-06-30 22:43
こんばんわ。

「データをソートしてから〜」とありますが、
そもそも、DataViewは、DataSet(厳密にはDataTable)が保持するデータのフィルターなので、DataView自身がデータを保有しているわけではありません。
つまり、「Sortプロパティにソート条件をセットする」ということは、「DataViewの内容をソートする」ことではありません。

RowFilterやDataSort等のようなプロパティは、
「近い将来、このDataViewを経由するバインドコントロール(DataGridなど)が参照してきたら、DataTableの内容を、指定した条件で絞込み、更に指定したキーでSortして表示します。」という意味になります。
RowFilterやDataSortは、単なる設定であって、「ソートする」や「条件で絞り込む」といった「処理」を表すことではないことに注意して下さい。

また、
DataView.Table.Rows.InsertAt(myRow, a)

のコードで、DataView.TableのTableは、DataTableの参照を表します。
従って、上記コードは、
DataSet.Table[?].Rows.InsertAt(myRow, a)

と同じ意味となり、決して、DataViewが保持しているRowコレクションに行挿入しているわけではなく、実際のデータを保有しているDataSetのDataTableに対して、行挿入していることになります。

デバッガで確認していただければ分かると思いますが、上記コードの場合、DataSetのDataTableのa行目に空行が挿入されていることと思います。


ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2003-06-30 22:45
失礼しました。(^^);

DataSortではなく、Sortプロパティです。

【誤】DataSort
   ↓
【正】Sort

織部
会議室デビュー日: 2003/05/30
投稿数: 3
投稿日時: 2003-07-01 09:08
ZEBRAさん御回答ありがとうございました。
どうやら根本から勘違いをしていたようですね。(^-^;
まだまだ勉強が足りません。。。
でも今まで悩んでいたことがすっきりしました。
今後ともよろしくお願い致します。m(._.)m
1

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