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

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

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

Re[8]: DataGridViewの行削除について


(過去ログ 53 を表示中)

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

■29704 / inTopicNo.1)  DataGridViewの行削除について
  
□投稿者/ C#初心者 (48回)-(2008/12/12(Fri) 15:25:34)

分類:[.NET 全般] 

 private void btnDel_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow r in dataGridView1.SelectedRows)
            {
                if (!r.IsNewRow)
                {
                    dataGridView1.Rows.Remove(r);
                }
            }
        }

上記のコードで、DataGridViewの行を削除出来るようにしたのですが、
レコードセクタが表示されている時は削除できるのですが、
レコードセクタを表示しなくすると削除できなくなるのですが、
レコードセクタを表示しないと削除できなくなるものなんでしょうか?

引用返信 編集キー/
■29705 / inTopicNo.2)  Re[1]: DataGridViewの行削除について
□投稿者/ カドルドエグ (60回)-(2008/12/12(Fri) 15:41:12)
No29704 (C#初心者 さん) に返信
> private void btnDel_Click(object sender, EventArgs e)
> {
> foreach (DataGridViewRow r in dataGridView1.SelectedRows)
> {
> if (!r.IsNewRow)
> {
> dataGridView1.Rows.Remove(r);
> }
> }
> }
>
> 上記のコードで、DataGridViewの行を削除出来るようにしたのですが、
> レコードセクタが表示されている時は削除できるのですが、
> レコードセクタを表示しなくすると削除できなくなるのですが、
> レコードセクタを表示しないと削除できなくなるものなんでしょうか?

そもそもforeachで繰り返しの元になるデータ(ここでいうとdataGridView1.SelectedRows)の数を
変える = 削除するのは危険かと…。。
MSDN:foreach、in
http://msdn.microsoft.com/ja-jp/library/ttw7t8t6(VS.80).aspx
引用>foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するのに使用しますが、
予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。
引用返信 編集キー/
■29707 / inTopicNo.3)  Re[2]: DataGridViewの行削除について
□投稿者/ C#初心者 (49回)-(2008/12/12(Fri) 16:03:29)
No29705 (カドルドエグ さん) に返信
> そもそもforeachで繰り返しの元になるデータ(ここでいうとdataGridView1.SelectedRows)の数を
> 変える = 削除するのは危険かと…。。
> MSDN:foreach、in
> http://msdn.microsoft.com/ja-jp/library/ttw7t8t6(VS.80).aspx
> 引用>foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するのに使用しますが、
> 予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。

そうだったんですか・・・。

ちなみに、for文を使った方がいいとサイトには書いてあったんですが
コードの書き方はどうすればよいでしょうか?
引用返信 編集キー/
■29715 / inTopicNo.4)  Re[3]: DataGridViewの行削除について
□投稿者/ カドルドエグ (61回)-(2008/12/12(Fri) 16:35:15)
No29707 (C#初心者 さん) に返信
> ちなみに、for文を使った方がいいとサイトには書いてあったんですが
> コードの書き方はどうすればよいでしょうか? 

MSDN:for
http://msdn.microsoft.com/ja-jp/library/ch45axte.aspx

コードに関するキーワードやクラス等でわからないことがあったら、
まず開発環境のヘルプ、ネットが使えるならMSDNオンラインで検索すると早いですよ。

 for (int i = データ最大値; i > 0; i--)
 {
   対象 = データ[i];
   //削除処理
  対象.削除();
 }

for文内の処理はforeachで行っていたことと変わりません。

但し、foreachと違ってはじめから
DataGridViewRow r
といったように処理対象の定義はされていないので、
DataGridViewRow r = dataGridView1.Rows[インデックス];
と対象を指定する必要があります。

また、削除の場合、リンク先のサンプルと同じように頭から処理をはじめると、
全体の数が変わっていることによって途中から正しく処理対象が指定できなくなり、
結果として処理も失敗します。
なので、開始位置を一番最後にもってきて逆順に処理するとうまくいきます。

#そういえば本題が…
>レコードセクタが表示されている時は削除できるのですが、
>レコードセクタを表示しなくすると削除できなくなるのですが、
>レコードセクタを表示しないと削除できなくなるものなんでしょうか?
恥ずかしながら「レコードセクタ」というのが何なのかがわかりません。
調べてみましたがこちらで指しているもののDataGridView版(行ヘッダー)
のことでしょうか?
http://www.accessclub.jp/bbs/0102/beginers36069.html

引用返信 編集キー/
■29716 / inTopicNo.5)  Re[4]: DataGridViewの行削除について
□投稿者/ C#初心者 (50回)-(2008/12/12(Fri) 16:39:55)
No29715 (カドルドエグ さん) に返信
>
> #そういえば本題が…
> >レコードセクタが表示されている時は削除できるのですが、
> >レコードセクタを表示しなくすると削除できなくなるのですが、
> >レコードセクタを表示しないと削除できなくなるものなんでしょうか?
> 恥ずかしながら「レコードセクタ」というのが何なのかがわかりません。
> 調べてみましたがこちらで指しているもののDataGridView版(行ヘッダー)
> のことでしょうか?
> http://www.accessclub.jp/bbs/0102/beginers36069.html

すみません。
自分の書き間違いでして、
正確には「レコードセレクタ」です。
DataGridViewにDBのデータを反映させた時に、一番左側にあるやつです。
引用返信 編集キー/
■29718 / inTopicNo.6)  Re[5]: DataGridViewの行削除について
□投稿者/ chobi (11回)-(2008/12/12(Fri) 16:48:47)
こんなのもいけないでしょうか?

System.Collections.IEnumerator iEnum = dataGridView1.SelectedRows.GetEnumerator();
while (iEnum.MoveNext())
{
dataGridView1.Rows.Remove((DataGridViewRow)iEnum.Current);
}
引用返信 編集キー/
■29719 / inTopicNo.7)  Re[6]: DataGridViewの行削除について
□投稿者/ επιστημη (1462回)-(2008/12/12(Fri) 17:04:36)
επιστημη さんの Web サイト
RemoveがiEnum.MoveNext()に悪さをしない限りOKでしょう。
# 悪さをするか否かは存じません。

てか、ぶっちゃけ foreach ってコレの略記じゃない?
だとすれば"やっちゃいけない"になりますが。

引用返信 編集キー/
■29720 / inTopicNo.8)  Re[7]: DataGridViewの行削除について
□投稿者/ カドルドエグ (62回)-(2008/12/12(Fri) 17:21:23)
No29719 (επιστημη さん) に返信
■No29718 (chobiさん) に返信
επιστημηさんの仰るとおりのようです。
MSDN:foreach ステートメント
http://msdn.microsoft.com/ja-jp/library/aa664754(VS.71).aspx

以下引用
collection 式の型がコレクション パターンを実装する場合、foreach ステートメントの展開は次のようになります。

E enumerator = (collection).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      ElementType element = (ElementType)enumerator.Current;
      statement;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}

■No29716 (C#初心者 さん) に返信
教えてくださりありがとうございます。
やはりRowHeaderのことだったのですね。

私もDataGridViewを使った処理にいくつか携わったことがありますが、
そのときはどれもRowHeaderを非表示にしていました。
しかし、今のところそれが原因で削除ができなかったことは特にありません。

どのようなことがきっかけでRowHeaderの表示非表示が
今回の問題に関わっていると判断されたのでしょうか?

引用返信 編集キー/
■29723 / inTopicNo.9)  Re[8]: DataGridViewの行削除について
□投稿者/ C#初心者 (51回)-(2008/12/12(Fri) 17:50:25)
> ■No29716 (C#初心者 さん) に返信
> 教えてくださりありがとうございます。
> やはりRowHeaderのことだったのですね。
>
> 私もDataGridViewを使った処理にいくつか携わったことがありますが、
> そのときはどれもRowHeaderを非表示にしていました。
> しかし、今のところそれが原因で削除ができなかったことは特にありません。
>
> どのようなことがきっかけでRowHeaderの表示非表示が
> 今回の問題に関わっていると判断されたのでしょうか?

表示されてる時は、RowHeaderで1行選択したらその行が削除できたんですけど、
非表示にしたら、1行選択できなくなっていて、左クリックを押しながら
1行選択して削除してみても削除できなかったんです。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -