トップ回答者
DataGridView.SelectedRows.item(index).Index のitem(index)の使い方

質問
-
いつもお世話になっております。
DataGridViewにおいて
DataGridView.SelectedRows.Count は複数行選択した行の数を表示するということは分かったのですが、
DataGridView.SelectedRows.item(index).index の item(index) 部分の使い方と言うか、出力結果との因果関係がイマイチよくわかりません。
例えば、1行から3行選択をしてもitem(index) のindexに入れる数字により
結果が違ってきます。はたまた2行から4行を選択した場合には、また違う結果が返ってきます。
これはどうしてでしょうか?item(index)とは何を指すのでしょうか?
そもそもこれはどういう時に使用するのでしょうか?ご教示の程、よろしくお願い申し上げます。
回答
-
例えば、1行から3行選択をしてもitem(index) のindexに入れる数字により
結果が違ってきます。
はたまた2行から4行を選択した場合には、また違う結果が返ってきます。
これはどうしてでしょうか?item(index)とは何を指すのでしょうか?
そもそもこれはどういう時に使用するのでしょうか?選択行のコレクションをインデックスを変更して参照しているのですから、返される行が代わるのは当然と言えます。
通常は「SelectedRows(index)」のように「Item」を省略して参照されることが多いと思います。
DataGridView.SelectedRows プロパティ (System.Windows.Forms)
DataGridViewSelectedRowCollection クラス (System.Windows.Forms)
DataGridViewSelectedRowCollection.Item プロパティ (System.Windows.Forms)
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/- 編集済み jhashimoto 2011年2月14日 23:37 リンク切れを修正
- 回答としてマーク 山本春海 2011年2月28日 9:08
-
> またいったい何の目的でどんなときに使用するのでしょうか?
なんで知りたいのでしょうか?
> そもそもこれはどういう時に使用するのでしょうか?選択行のデータを取得したいときによく使いますが?(item は当然省略しますが)
> あまりよく理解できませんでした。選択行とインデックスの関係が判らないのでしょうか?
なら EXCEL を例に考えるといいかも知れません。EXCEL で複数の行を選択したと想定します。
最初 EXCEL の 1~3 行を選択しました。これをインデックスがゼロから始まる配列と考えて
(・・・本当はコレクションですが、一応配列と言っておきます)・選択行の配列(インデックス0) = EXCEL の 1行目
・選択行の配列(インデックス1) = EXCEL の 2行目
・選択行の配列(インデックス2) = EXCEL の 3行目という関係になります。
次に EXCEL の 2~4 行のセルを選択しました。すると
・選択行の配列(インデックス0) = EXCEL の 2行目
・選択行の配列(インデックス1) = EXCEL の 3行目
・選択行の配列(インデックス2) = EXCEL の 4行目となります。
DataGridView.SelectedRows も考え方は同じです。
DataGeridView の 1~3 行を選択します。これをインデックスがゼロから始まるコレクションと考えて・DataGridView.SelectedRows(0) = DataGridView の 1行目
・DataGridView.SelectedRows(1) = DataGridView の 2行目
・DataGridView.SelectedRows(2) = DataGridView の 3行目という関係になり、DataGeridView の 2~4 行のセルが選択されているなら
・DataGridView.SelectedRows(0) = DataGridView の 2行目
・DataGridView.SelectedRows(1) = DataGridView の 3行目
・DataGridView.SelectedRows(2) = DataGridView の 4行目となります。
ご自分で実際にサンプルを作り、実行しながら調べれば判ると思います。
#ほんとは図で書いて示せればいいのですが、めんどくさいのでご容赦を。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年2月28日 9:08
-
これはどうしてでしょうか?item(index)とは何を指すのでしょうか?
そもそもこれはどういう時に使用するのでしょうか?
SelectedRowsはDataGridViewSelectedRowCollection型になりますから、そのItemプロパティということになります。DataGridViewSelectedRowCollection.Item プロパティ
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/4b409aef-4e92-422c-aa82-7f005e1197f9ここでthisというのが使われていますが、ひょっとしてこれに関して疑問を感じていらっしゃるのでしょうか?であれば、以下を参考にしてみて下さい。
インデクサー
http://ufcpp.net/study/csharp/oo_indexer.html
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年2月28日 9:08
-
はっきりと書かれた文献を見つけられませんでしたが、SelectedRowsというコレクションはどうやらLIFO(Last In First Out)になっているようですね。つまり、新しく格納した順に取り出すようになっているということです(最初に入れたものを最後に取り出す)。したがって、
実際DataGridView を選択しやってみても、 (index)に0を入れてやってみると、
1~3行目を選んだときは2を返し
2~3行目を選んだときは3を返します。1~3行目を選ぶ時に、1行目、2行目、3行目とCTRLキーを押しながら順に選択した場合は、 SelectedRowsの中身は、インデックス0が3行目、インデックス1が2行目、インデックス2が3行目になっています。したがって、(index)に0を入れると3行目、すなわちDataGridViewにおけるインデックス2の行が返されることになります。
逆に、1~3行目を選ぶ時に、3行目、2行目、1行目と選べば、DataGridViewにおけるインデックス0の行が返されます。以上のことを考えて、もう一度動作を確かめてみて下さい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年2月28日 9:08
すべての返信
-
例えば、1行から3行選択をしてもitem(index) のindexに入れる数字により
結果が違ってきます。
はたまた2行から4行を選択した場合には、また違う結果が返ってきます。
これはどうしてでしょうか?item(index)とは何を指すのでしょうか?
そもそもこれはどういう時に使用するのでしょうか?選択行のコレクションをインデックスを変更して参照しているのですから、返される行が代わるのは当然と言えます。
通常は「SelectedRows(index)」のように「Item」を省略して参照されることが多いと思います。
DataGridView.SelectedRows プロパティ (System.Windows.Forms)
DataGridViewSelectedRowCollection クラス (System.Windows.Forms)
DataGridViewSelectedRowCollection.Item プロパティ (System.Windows.Forms)
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/- 編集済み jhashimoto 2011年2月14日 23:37 リンク切れを修正
- 回答としてマーク 山本春海 2011年2月28日 9:08
-
> またいったい何の目的でどんなときに使用するのでしょうか?
なんで知りたいのでしょうか?
> そもそもこれはどういう時に使用するのでしょうか?選択行のデータを取得したいときによく使いますが?(item は当然省略しますが)
> あまりよく理解できませんでした。選択行とインデックスの関係が判らないのでしょうか?
なら EXCEL を例に考えるといいかも知れません。EXCEL で複数の行を選択したと想定します。
最初 EXCEL の 1~3 行を選択しました。これをインデックスがゼロから始まる配列と考えて
(・・・本当はコレクションですが、一応配列と言っておきます)・選択行の配列(インデックス0) = EXCEL の 1行目
・選択行の配列(インデックス1) = EXCEL の 2行目
・選択行の配列(インデックス2) = EXCEL の 3行目という関係になります。
次に EXCEL の 2~4 行のセルを選択しました。すると
・選択行の配列(インデックス0) = EXCEL の 2行目
・選択行の配列(インデックス1) = EXCEL の 3行目
・選択行の配列(インデックス2) = EXCEL の 4行目となります。
DataGridView.SelectedRows も考え方は同じです。
DataGeridView の 1~3 行を選択します。これをインデックスがゼロから始まるコレクションと考えて・DataGridView.SelectedRows(0) = DataGridView の 1行目
・DataGridView.SelectedRows(1) = DataGridView の 2行目
・DataGridView.SelectedRows(2) = DataGridView の 3行目という関係になり、DataGeridView の 2~4 行のセルが選択されているなら
・DataGridView.SelectedRows(0) = DataGridView の 2行目
・DataGridView.SelectedRows(1) = DataGridView の 3行目
・DataGridView.SelectedRows(2) = DataGridView の 4行目となります。
ご自分で実際にサンプルを作り、実行しながら調べれば判ると思います。
#ほんとは図で書いて示せればいいのですが、めんどくさいのでご容赦を。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年2月28日 9:08
-
これはどうしてでしょうか?item(index)とは何を指すのでしょうか?
そもそもこれはどういう時に使用するのでしょうか?
SelectedRowsはDataGridViewSelectedRowCollection型になりますから、そのItemプロパティということになります。DataGridViewSelectedRowCollection.Item プロパティ
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/4b409aef-4e92-422c-aa82-7f005e1197f9ここでthisというのが使われていますが、ひょっとしてこれに関して疑問を感じていらっしゃるのでしょうか?であれば、以下を参考にしてみて下さい。
インデクサー
http://ufcpp.net/study/csharp/oo_indexer.html
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年2月28日 9:08
-
ひらぽんさん いつもありがとうございます。
ご回答遅くなり申し訳ございません。> なんで知りたいのでしょうか?
はい、
Visual Basic 2005 による実践データベースプログラミングという参考書のDataGridView の解説のところに
3.7 選択中の行数と行番号を参照する という項目があって、returnValue = dataGridView.SelectRows.Count
は、解説文があったので理解したのですが、returnValue = dataGridView.SelectRows(index).index
については何の解説文もないためわからなかったのです。
実際DataGridView を選択しやってみても、 (index)に0を入れてやってみると、1~3行目を選んだときは2を返し
2~3行目を選んだときは3を返します。(index)に1を入れると
1~3行目を選んだときは1を返し
2~3行目を選んだときは2を返します。この(index)と.index の相関関係がわらりません。
また「こんなのどんな場面で使うんだろう(ーー;)」
と思った次第です。trapemiya さん、すいません。
私の知識度はtrapemiya さんが想像するより だいぶ低いです(^_^;)- 編集済み kei_chan_gt 2011年2月19日 6:13 なぜか改行不良
-
はっきりと書かれた文献を見つけられませんでしたが、SelectedRowsというコレクションはどうやらLIFO(Last In First Out)になっているようですね。つまり、新しく格納した順に取り出すようになっているということです(最初に入れたものを最後に取り出す)。したがって、
実際DataGridView を選択しやってみても、 (index)に0を入れてやってみると、
1~3行目を選んだときは2を返し
2~3行目を選んだときは3を返します。1~3行目を選ぶ時に、1行目、2行目、3行目とCTRLキーを押しながら順に選択した場合は、 SelectedRowsの中身は、インデックス0が3行目、インデックス1が2行目、インデックス2が3行目になっています。したがって、(index)に0を入れると3行目、すなわちDataGridViewにおけるインデックス2の行が返されることになります。
逆に、1~3行目を選ぶ時に、3行目、2行目、1行目と選べば、DataGridViewにおけるインデックス0の行が返されます。以上のことを考えて、もう一度動作を確かめてみて下さい。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 山本春海 2011年2月28日 9:08
-
trapemiya さま
いつもお世話になっております。
ご回答が遅くなり申し訳ございませんでした。
本当だ☆trapemiyaさまの言う通りreturnValue = dataGridView.SelectRows(index).index は
選択したRowの新しいものから表示されました。
ちなみに、
returnValue = dataGridView.SelectCells(index).Valueも選択したセルの新しいものから表示されるようです。
お陰様で動作の仕組みがわかりました。
ありがとうございます<(_)>しかしいったいこんなもの、どの場面で使用するのか
見当が尽きませんが、動作の仕組みがわかりスッキリしました。
ありがとうございました。