- PR -

DataTableとDataViewの行インデックスについて

投稿者投稿内容
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-27 17:10
かずくんさん、ぽぴ王子さんたくさんのレスありがとうございます。

引用:
ぽぴ王子さんの書き込み (2007-11-27 16:53) より:
ところで言語は C# で良かったんでしたっけ。何も書かれてなかったですけど。


すみません。C# 2005で作成しています。

引用:
ぽぴ王子さんの書き込み (2007-11-27 16:53) より:
流れから言って、PrimaryKey を設定することができないデータで、全く同じ
データが存在するので(だから設定できない?)そこから作った DataView が
どの行を指しているか(行そのものではなくインデックス)を知りたいという
話であった、と。


説明が少なくてすいません。そのとおりです。

DataTable.Rows.IndexOf(DataRowView.Row)でインデックスが取得できるのは確認しました。
((IList)DataView).IndexOf(DataRow から変換した DataRowView)はまだ確認していませんが、結果的に、DataColumn.AutoIncrementを使用するのが良いということでしょうか?


ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-27 17:56
引用:

SNMODUさんの書き込み (2007-11-27 17:10) より:

説明が少なくてすいません。そのとおりです。

DataTable.Rows.IndexOf(DataRowView.Row)でインデックスが取得できるのは確認しました。
((IList)DataView).IndexOf(DataRow から変換した DataRowView)はまだ確認していませんが、結果的に、DataColumn.AutoIncrementを使用するのが良いということでしょうか?


前にも書きましたが、DataRow から DataRowView を得るということ自体をあまり
やったことがないので、どれがいいのかはなんとも言えないですね。
AutoIncrement を設定した列を追加することで、DataTable 上は一意なキーができる
わけで、それを利用して検索することに間違いはないと思うのですけど。

DataView にも一応 Find メソッドがあるのですが、これは

引用:

指定した並べ替えキー値によって DataView 内の行を検索します


と書かれていて、この並べ替えキー値とは Sort プロパティをあらわします。
逆に考えると Sort プロパティに設定した列以外は検索キーとして使えません。
そうなると AutoIncrement を設定したとしてもベタにループで対象 DataRow
の AutoIncrement 列の値を見ていくしかないのかも。
…と考えたのが以下のコード。

コード:

    DataView dv = new DataView(dt);
    for (int i = 0; i < dv.Count; i++)
    {
        if (dv[i].Row["AutoIncrement列"].ToString() ==
            dt.Rows[目的行]["AutoIncrement列"].ToString())
        {
            MessageBox.Show("エウレーカ!");
            break;
        }
    }


待て待て。それだったら AutoIncrement 列とか作らないで行そのもので比較
できるやんか。

コード:

    DataView dv = new DataView(dt);
    for (int i = 0; i < dv.Count; i++)
    {
        if (dv[i].Row == dt.Rows[目的行])
        {
            MessageBox.Show("エウレーカ!");
            break;
        }
    }


てな感じ。
でもやっぱりベタにループするのはいただけない気がするので、どうにかしたい。
…すいません。僕にはこの程度までしか考え付きませんでした。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-27 19:25
引用:
ぽぴ王子さんの書き込み (2007-11-27 17:56) より:
コード:
DataView dv = new DataView(dt);
for (int i = 0; i < dv.Count; i++)
{
    if (dv[i].Row == dt.Rows[目的行])
    {
        MessageBox.Show("エウレーカ!");
        break;
    }
}




このコードで試してみましたが、
型 'System.Data.DataRowView' を型 'System.Data.DataRow' に変換できません。
となり、ビルドできませんでした。
引用:
ぽぴ王子さんの書き込み (2007-11-27 17:56) より:
コード:
DataView dv = new DataView(dt);
for (int i = 0; i < dv.Count; i++)
{
     if (dv[i].Row["AutoIncrement列"].ToString() ==
         dt.Rows[目的行]["AutoIncrement列"].ToString())
     {
         MessageBox.Show("エウレーカ!");
         break;
    }
}




こちらのコードで組み込みました。
私もループするのは好ましくないと思いましたが妥協してしまいました。。。
かずくんさん、ぽぴ王子さんいろいろとご教示くださいましてありがとうございました。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-28 17:58
引用:

SNMODUさんの書き込み (2007-11-27 19:25) より:

引用:
ぽぴ王子さんの書き込み (2007-11-27 17:56) より:

コード:

DataView dv = new DataView(dt);
for (int i = 0; i < dv.Count; i++)
{
    if (dv[i].Row == dt.Rows[目的行])
    {
        MessageBox.Show("エウレーカ!");
        break;
    }
}




このコードで試してみましたが、
型 'System.Data.DataRowView' を型 'System.Data.DataRow' に変換できません。
となり、ビルドできませんでした。


むむむ、一応動作チェックもしたんですが。
ちなみに dt は DataTable 型ですが、その辺は大丈夫でしょうか(書き忘れてた)。

まぁ解決してるみたいなので、別にかまわないのですけどネ。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-28 19:02
ぽぴ王子さんご指摘ありがとうございます。
引用:
ぽぴ王子さんの書き込み (2007-11-27 17:56) より:
コード:
DataView dv = new DataView(dt);

for (int i = 0; i < dv.Count; i++)
{
if (dv[i].Row == dt.Rows[目的行])
{
MessageBox.Show("エウレーカ!");
break;
}
}



にDataTable dt = new DataTable()を付加してビルドしたらエラーがでませんでした。
なぜ「型 'System.Data.DataRowView' を型 'System.Data.DataRow' に変換できません。」のようなエラーが出たのかわからなくなってしまいました。(再現できません。。。)。私の作成したものに合わせて修正したのでエラーとなっていたものと思います。すみませんでした。
こちらの方がシンプルなので、プログラムを修正してみたいと思います。

ぽぴ王子さんありがとうございました。



[ メッセージ編集済み 編集者: SNMODU 編集日時 2007-11-28 19:05 ]

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