- PR -

ASP.NET DataGridでソート後の選択について

1
投稿者投稿内容
あつし
会議室デビュー日: 2004/10/22
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2004-10-22 23:29
ASP.NETでXMLをDatasetに読み込み、DataGridに表示、選択されると中身をTextBoxに表示するコードを書いています。
http://www.atmarkit.co.jp/fdotnet/dotnettips/076reversedg/reversedg.html
を参考に(コピペですが)双方向ソートを付けたのですが、ソート後に
選択(SelectedIndexChanged)を行ってもソート前の項目が選択されてしまいます。
ソース(C#)は

DataView getXML()
{
this.dataSet1.ReadXml(Server.MapPath(@"hoge.xml"));
this.DataGrid1.DataSource = this.dataSet1.Tables["hoge"];
DataView dv = this.dataTable1.DefaultView;
dv.Sort = (string)ViewState["sort order"];
return dv;
}

private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.DataGrid1.DataSource = getXML();
this.TextBox1.Text = this.dataTable1.Rows[this.DataGrid1.SelectedItem.DataSetIndex]["subject"].ToString();

this.DataGrid1.SelectedItemStyle.Font.Bold = true;
this.DataGrid1.DataBind();
}

また、DataGrid1_SortCommandの最後に
ViewState["sort order"] = dv.Sort;
を加えてあります。
また、Page_load時は何もしていません。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-23 05:45
 Webアプリケーションの場合、プログラムが走るときには都度都度、新しいオブジェクトが作られます。ということを、いつも念頭に置いてください。

 ソートイベントでソートしても、セレクトイベントで毎回ファイルから読み込んで、ソートしていないのでは、「ソート前」の結果になるのは当然ですよね。


#ソースをステップごとに「何をしているか」確認しましょう
_________________
あつし
会議室デビュー日: 2004/10/22
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2004-10-23 11:01
private void DataGrid1_SelectedIndexChanged

this.DataGrid1.DataSource = getXML();
する時点でソートされた状態がセットされていると自分では思っていたのですが。
選択ボタンをクリックしてもDataGrid自体にはソートされた状態で表示されているので
いけてるかなと。

最初DataView getXML() の中でソートしてないときは
選択を押すたびにDataGridの表示自体がソート前に戻っていたので
ご指摘いただいた点を考慮して今のソースにしました。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-23 11:26
 あ、失礼。読み間違ってましたね。
#見る人にソースから「何をしているか」解かせるのではなく、
#「こういう手順でこうしている」ことを示しませんか?

引用:

あつしさんの書き込み (2004-10-22 23:29) より:

コード:

DataView getXML()
{
this.dataSet1.ReadXml(Server.MapPath(@"hoge.xml"));
this.DataGrid1.DataSource = this.dataSet1.Tables["hoge"];
DataView dv = this.dataTable1.DefaultView;
dv.Sort = (string)ViewState["sort order"];
return dv;
}

private void DataGrid1_SelectedIndexChanged(...)
{
// ここでDataGridのDataSourceに代入していますが、
this.DataGrid1.DataSource = getXML();
// データを見ているのはdataTable1?
this.TextBox1.Text = this.dataTable1.Rows[
this.DataGrid1.SelectedItem.DataSetIndex]
["subject"].ToString();

this.DataGrid1.SelectedItemStyle.Font.Bold = true;
this.DataGrid1.DataBind();
}





 DataTableからDataViewを導き出していますが、このDataViewは、DataTableから独立しています。DataViewのソート順を変更しても、DataTableの順序は変わっていません。DataViewからアクセスしましょう。

[追記]
「独立」というのは間違っているなぁ。適切な言葉が思い浮かばないのでそのままにしておきますが、意図は「DataViewのソート順を変更しても、DataTableの順序は変わっていません」のところです。
[/追記]
_________________
Microsoft MVP for Visual Developer - ASP/ASP.NET on 2004

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-10-23 11:39 ]
あつし
会議室デビュー日: 2004/10/22
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2004-10-24 00:10
Jittaさん何度もありがとうございます。
DataViewもDataSourceに指定できるのでDataTableと同列だと思い込んでました。

dataTableではなく直接DataGridのCellを参照すれば中身は取れそうですね。

ソートされた後でDataGridで選ばれたものが
DataTableの何行目にあたるのかを見るには何か方法があるのでしょうか?

質問ばかりですいません。



にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-10-24 09:22
引用:

ソートされた後でDataGridで選ばれたものが
DataTableの何行目にあたるのかを見るには何か方法があるのでしょうか?


この場合、DataSource に設定した DataView を用いて、
コード:
DataView view = (DataView)this.DataGrid1.DataSource;
DataRowView rowView = view[this.DataGrid1.SelectedItem.DataSetIndex];
DataRow row = rowView.DataRow;


として DataRow を取得するのがいいかと。
あつし
会議室デビュー日: 2004/10/22
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2004-10-24 17:41
にしざきさんありがとうございました。
コード:
 this.DataGrid1.DataSource = getXML();
 DataView view = (DataView)this.DataGrid1.DataSource;
 DataRow row = view[this.DataGrid1.SelectedItem.DataSetIndex].Row;
 this.TextBox1.Text = row["subject"].ToString();


でいけました。

この場合は
コード:
 row["subject"] = this.TextBox1.Text;


にするとちゃんとdataTableへTextBoxでの変更が反映されるんですね。

ありがとうございました。
1

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