C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: DataGridViewで複数セル選択時の位置について


(過去ログ 58 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■33359 / inTopicNo.1)  DataGridViewで複数セル選択時の位置について
  
□投稿者/ tamaboyo (57回)-(2009/02/26(Thu) 15:45:36)

分類:[C#] 

tamaboyoです。

DataGridViewでセルを複数選択した場合に、左上のセルの位置を取得する方法ではまっています。
今のところ、
foreach (DataGridViewCell dgv in DataGrid.SelectedCells)
{
if(dgv.ColumnIndex<nCol)
{
nCol=dgv.ColumnIndex;
}

if(dgv.RowIndex<nRow)
{
nRow=dgv.RowIndex;
}
}
で選択位置の最小値を取るようにしているのですが、これだと沢山のセルを選択した際に時間がかかります。
他に方法はないのでしょうか?

環境はVS2005です。
宜しくお願いします。
引用返信 編集キー/
■33360 / inTopicNo.2)  Re[1]: DataGridViewで複数セル選択時の位置について
□投稿者/ επιστημη (1787回)-(2009/02/26(Thu) 16:10:04)
επιστημη さんの Web サイト
> これだと沢山のセルを選択した際に時間がかかります。
> 他に方法はないのでしょうか?

SelectedColumns, SelectedRows の合わせワザはできんもんでしょか。
これなら 検索空間が RxC から R+C に縮小されんでないかと。
# 検証してませんごめんなさい。

引用返信 編集キー/
■33365 / inTopicNo.3)  Re[2]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (58回)-(2009/02/26(Thu) 16:25:31)
επιστημη さん、ありがとうございます。

>>これだと沢山のセルを選択した際に時間がかかります。
>>他に方法はないのでしょうか?
>
> SelectedColumns, SelectedRows の合わせワザはできんもんでしょか。
> これなら 検索空間が RxC から R+C に縮小されんでないかと。
> # 検証してませんごめんなさい。

あぁ、そういえばそうですね!
早速試してみます!といいたいところなのですが、今なぜかSelectedColumns.Count, SelectedRows.Countの値が取得できず・・・
選択行・列が0で戻ってくるため、試せない状態です。

そこを解決したら、検証結果と合わせて報告させていただきます。
ありがとうございました。
引用返信 編集キー/
■33366 / inTopicNo.4)  Re[2]: DataGridViewで複数セル選択時の位置について
□投稿者/ みきぬ (400回)-(2009/02/26(Thu) 16:27:51)
> SelectedColumns, SelectedRows

これって確か、行全体とか列全体を選択したときに利くプロパティだった希ガス。
引用返信 編集キー/
■33367 / inTopicNo.5)  Re[3]: DataGridViewで複数セル選択時の位置について
□投稿者/ επιστημη (1788回)-(2009/02/26(Thu) 16:30:39)
επιστημη さんの Web サイト
> これって確か、行全体とか列全体を選択したときに利くプロパティだった希ガス。

あー。四角く切り取ったときは利かないのかー。
だとしたら寄り道させちゃったですね。すんません。

引用返信 編集キー/
■33372 / inTopicNo.6)  Re[1]: DataGridViewで複数セル選択時の位置について
□投稿者/ .SHO (695回)-(2009/02/26(Thu) 16:52:46)
No33359 (tamaboyo さん) に返信

DisplayIndex の設定によっては、数値が小さいからといって
左上とは限らないですけど、それはいいのかな?
引用返信 編集キー/
■33374 / inTopicNo.7)  Re[4]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (59回)-(2009/02/26(Thu) 16:57:09)
みきぬ さん、επιστημη さん、ありがとうございます。

>>これって確か、行全体とか列全体を選択したときに利くプロパティだった希ガス。
>
> あー。四角く切り取ったときは利かないのかー。
> だとしたら寄り道させちゃったですね。すんません。

煮詰まったので何気なく見てみたところ・・・そうなんですか。
部分選択の時の数は、取れないのですか。
#だからColumns.GetColumnCount(DataGridViewElementStates.Selected)の戻り値も0だったのか・・・
なんか納得です。

じゃ、選択行・列数の取得も
foreach (DataGridViewCell dgv in fForm.DataGrid_ListStep.SelectedCells)
で取得しかないのでしょうか?
引用返信 編集キー/
■33375 / inTopicNo.8)  Re[2]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (60回)-(2009/02/26(Thu) 17:04:41)
.SHO さん、ありがとうございます。

> DisplayIndex の設定によっては、数値が小さいからといって
> 左上とは限らないですけど、それはいいのかな?

行・列の入れ替えは不許可にしています。
ソートも不許可にしていますので、小さい数値が左上の予定です。
引用返信 編集キー/
■33376 / inTopicNo.9)  Re[3]: DataGridViewで複数セル選択時の位置について
□投稿者/ みきぬ (401回)-(2009/02/26(Thu) 17:11:59)
今の処理だと、Excelシートで例えると A2 と B1 のセルが選択された状態では A1 が結果として算出されるけど問題なす?
引用返信 編集キー/
■33377 / inTopicNo.10)  Re[3]: DataGridViewで複数セル選択時の位置について
□投稿者/ .SHO (696回)-(2009/02/26(Thu) 17:12:25)
No33375 (tamaboyo さん) に返信

> 行・列の入れ替えは不許可にしています。
> ソートも不許可にしていますので、小さい数値が左上の予定です。

それだったら、このままでも十分速くないですか?
引用返信 編集キー/
■33378 / inTopicNo.11)  Re[4]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (61回)-(2009/02/26(Thu) 17:20:49)
みきぬ さん、ありがとうございます。

> 今の処理だと、Excelシートで例えると A2 と B1 のセルが選択された状態では A1 が結果として算出されるけど問題なす?

OKです。
とびとびの選択はナシで、必ず四角い状態になるように選択します。
ので、もしそういう選択をされた場合は、選択範囲がA1,A2,B1,B2の4つのセルとします。
引用返信 編集キー/
■33379 / inTopicNo.12)  Re[4]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (62回)-(2009/02/26(Thu) 17:22:51)
.SHO さん、ありがとうございます。

>>行・列の入れ替えは不許可にしています。
>>ソートも不許可にしていますので、小さい数値が左上の予定です。
>
> それだったら、このままでも十分速くないですか?

最大Col=999、最大Row=300
の範囲が選択可能なので、もし、最大で選択された場合には?と考えています。
そこは考慮しなくても早いのでしょうか?
引用返信 編集キー/
■33381 / inTopicNo.13)  Re[5]: DataGridViewで複数セル選択時の位置について
□投稿者/ みきぬ (402回)-(2009/02/26(Thu) 17:38:36)
No33378 (tamaboyo さん) に返信
> みきぬ さん、ありがとうございます。
>
>>今の処理だと、Excelシートで例えると A2 と B1 のセルが選択された状態では A1 が結果として算出されるけど問題なす?
>
> OKです。
> とびとびの選択はナシで、必ず四角い状態になるように選択します。
> ので、もしそういう選択をされた場合は、選択範囲がA1,A2,B1,B2の4つのセルとします。

なるほどー。
そういう前提があるんだったら、1つ選択されているセルを見つけて
・そのセルから、選択されているギリギリのところまで左にたどる
・さらに、選択されているギリギリのところまで上にたどる
ていう風な探し方もできますね。

DataGridView.GetCellCount(DataGridViewElementStates.Selected) を参照して、その値が一定数をこえてたら
上のアルゴリズムに変更する、とかいうのはどうかしらん。

引用返信 編集キー/
■33387 / inTopicNo.14)  Re[6]: DataGridViewで複数セル選択時の位置について
□投稿者/ επιστημη (1790回)-(2009/02/26(Thu) 21:02:36)
επιστημη さんの Web サイト
> ・そのセルから、選択されているギリギリのところまで左にたどる
> ・さらに、選択されているギリギリのところまで上にたどる

二分法で挟み撃ちならO(logN)だっ

引用返信 編集キー/
■33392 / inTopicNo.15)  Re[7]: DataGridViewで複数セル選択時の位置について
□投稿者/ .SHO (697回)-(2009/02/27(Fri) 10:16:56)
こんなんでどうですかね?

int col = DataGrid.SelectedCells[0].ColumnIndex;
int row = DataGrid.SelectedCells[0].RowIndex;

while ( 0 <= col && 0 <= row && DataGrid[col,row].Selected == true ) {
    col--;
    row--;
}
col++;
row++;

if ( col != 0 && DataGrid[col-1,row].Selected == true ) {
    for ( col--; 0 <= col && DataGrid[col,row].Selected == true; col-- ) ;
    col++;
}
if ( row != 0 && DataGrid[col,row-1].Selected == true ) {
    for ( row--; 0 <= row && DataGrid[col,row].Selected == true; row-- ) ;
    row++;
}

ごめんなさい。未確認ですが、たぶんいけるんじゃないかと…

引用返信 編集キー/
■33403 / inTopicNo.16)  Re[8]: DataGridViewで複数セル選択時の位置について
□投稿者/ tamaboyo (63回)-(2009/02/27(Fri) 14:44:56)
.SHO さん、ありがとうございます。

> こんなんでどうですかね?
> ごめんなさい。未確認ですが、たぶんいけるんじゃないかと…

ピシャリOKでした!
そうか、斜めに進んでいけば早いですね。
ものすごく目から鱗状態です。
明らかに全部のセルをforeachするよりも早いですね。
縦をまず探して、横を探して、ってするしかないかなぁ、と思って作ってるとこでした。
1つめのforを抜ける時点でcolかrowどちらかが決定してしまうので、未決定の方だけ探せばいいわけですし。
#今なにげに、"+"と"-"入れ替えたら右下のセル位置も取れるような気がしました。
#試してみます。

他の方々もいろんなアドバイスありがとうございました。
解決済み
引用返信 編集キー/
■33410 / inTopicNo.17)  Re[9]: DataGridViewで複数セル選択時の位置について
□投稿者/ .SHO (701回)-(2009/02/27(Fri) 16:24:59)
No33403 (tamaboyo さん) に返信

> #今なにげに、"+"と"-"入れ替えたら右下のセル位置も取れるような気がしました。
> #試してみます。

当然、取れますね。
どうせなら、最初の while で同時に左上、右下に進ませれば
もっと速くなりますね。
まぁ、同時に最後に到達するわけではないので、少し工夫がいりますが。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -