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

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

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

Re[9]: BindingSourceでフラグを立てる方法


(過去ログ 56 を表示中)

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

■31768 / inTopicNo.1)  BindingSourceでフラグを立てる方法
  
□投稿者/ たこやき (81回)-(2009/01/28(Wed) 15:12:11)

分類:[C#] 

VC2008
大変お世話になっています。
現在表示中のデータ(BindingSource)にフラグを立てたいのですが、
以下の方法だとカレントが移動してしまいます。
カレントを移動させずに行う方法はないのでしょうか。

        private void button1_Click(object sender, EventArgs e)
        {
            for(int i=0; i<myBindingSource.Count; i++)
            {
                myBindingSource.Position = i;
                DataRowView dr = (DataRowView)myBindingSource.Current;
                dr["fg"] = true;
            }           
        }

BindingSource.GetEnumerator()を用いてできないものだろうかと
試みてみたのですが、どうもうまく行きません。
ご指導下さい。


引用返信 編集キー/
■31769 / inTopicNo.2)  Re[1]: BindingSourceでフラグを立てる方法
□投稿者/ επιστημη (1594回)-(2009/01/28(Wed) 15:17:10)
επιστημη さんの Web サイト
> カレントを移動させずに行う方法はないのでしょうか。

どんだけ動かそうが、最後に元に戻しとけば"移動せずに行った"ことになんじゃないかと。

引用返信 編集キー/
■31770 / inTopicNo.3)  Re[2]: BindingSourceでフラグを立てる方法
□投稿者/ たこやき (82回)-(2009/01/28(Wed) 15:20:30)
No31769 (επιστημη さん) に返信
ご返信ありがとうございます。

> どんだけ動かそうが、最後に元に戻しとけば"移動せずに行った"ことになんじゃないかと。
まーそうなんですが、イベントの発生とかがあってスピードダウンするんじゃーないかと浅はかですが思えて……
引用返信 編集キー/
■31772 / inTopicNo.4)  Re[3]: BindingSourceでフラグを立てる方法
□投稿者/ επιστημη (1595回)-(2009/01/28(Wed) 15:27:51)
επιστημη さんの Web サイト
>>どんだけ動かそうが、最後に元に戻しとけば"移動せずに行った"ことになんじゃないかと。
> まーそうなんですが、イベントの発生とかがあってスピードダウンするんじゃーないかと浅はかですが思えて……

ためしにやってみて、速度ガタ落ちしたら再検討でよくね?

呈示されたコードでは、どっちみち全レコードを列挙してますわね。
"全レコード列挙に要する時間"に比べ"元に戻す時間"が気になるほどかかる、
と思えるのはなぜですか?

明快な理由がある もしくは やってみたら遅かった なら何の文句もありません。

引用返信 編集キー/
■31775 / inTopicNo.5)  Re[4]: BindingSourceでフラグを立てる方法
□投稿者/ Hongliang (335回)-(2009/01/28(Wed) 15:37:39)
BindingSource の DataSource が DataTable であると決め付けられるなら、普通に BindingSource.DataSource で DataTable 取得してそれを操作すればいいと思いますが?
引用返信 編集キー/
■31777 / inTopicNo.6)  Re[4]: BindingSourceでフラグを立てる方法
□投稿者/ たこやき (83回)-(2009/01/28(Wed) 15:46:35)
No31772 (επιστημη さん) に返信

> ためしにやってみて、速度ガタ落ちしたら再検討でよくね?
>
> 呈示されたコードでは、どっちみち全レコードを列挙してますわね。
> "全レコード列挙に要する時間"に比べ"元に戻す時間"が気になるほどかかる、
> と思えるのはなぜですか?
>
> 明快な理由がある もしくは やってみたら遅かった なら何の文句もありません。
>
明快な理由まであるわけじゃありませんが、
独学のド素人で頼れる人が全くいない中、できることがもちろん大切なのですが、その方法がベターなのかどうなのか、すごく不安に駆られます。それでご助言を頂きたいと、投稿させていただいています。

引用返信 編集キー/
■31778 / inTopicNo.7)  Re[5]: BindingSourceでフラグを立てる方法
□投稿者/ επιστημη (1596回)-(2009/01/28(Wed) 15:53:23)
επιστημη さんの Web サイト
> それでご助言を頂きたいと、投稿させていただいています。

では「ものは試し。やってみなはれ」とアドバイスします。

引用返信 編集キー/
■31783 / inTopicNo.8)  Re[5]: BindingSourceでフラグを立てる方法
□投稿者/ たこやき (84回)-(2009/01/28(Wed) 16:46:34)
No31775 (Hongliang さん) に返信
ご返信ありがとうございます。

> BindingSource の DataSource が DataTable であると決め付けられるなら、普通に
> BindingSource.DataSource で DataTable 取得してそれを操作すればいいと思いますが?
さっそくに試みてみたのですが、DataTableを取得することができません。
どこに問題があるのでしょうか。

DataTable dt = (DataTable)myBindingSource.DataSource;  // キャストエラー

myDS.myDataTable da =
(myDS.myDataTable)myBindingSource.DataSource; // キャストエラー

引用返信 編集キー/
■31840 / inTopicNo.9)  Re[6]: BindingSourceでフラグを立てる方法
□投稿者/ みきぬ (354回)-(2009/01/29(Thu) 12:03:52)
No31783 (たこやき さん) に返信

>>BindingSource の DataSource が DataTable であると決め付けられるなら、
ここは理解されてますか?

> どこに問題があるのでしょうか。
>
> DataTable dt = (DataTable)myBindingSource.DataSource;  // キャストエラー
>
ブレークポイントを置いて、DataSource に何が入っているか確認してみては?

引用返信 編集キー/
■31888 / inTopicNo.10)  Re[7]: BindingSourceでフラグを立てる方法
□投稿者/ たこやき (85回)-(2009/01/29(Thu) 18:30:22)
No31840 (みきぬ さん) に返信
ご指導ありがとうございます。
もうあきらめていたのでトピックのチェック遅れました。

> >>BindingSource の DataSource が DataTable であると決め付けられるなら、
> ここは理解されてますか?
> ブレークポイントを置いて、DataSource に何が入っているか確認してみては?
ほとんど理解できていなくて、データセット名しか表示されなかったので、
いきなりmyDS.myTBLとしてしまいました。
しかし、みきぬさんに指摘されてはじめて気がつきました。
おかげでうまくいきました。ありがとうございました。

myDS ds = (myDS)myTBLBindingSource.DataSource;
DataTable dt = (DataTable)ds.myTBL;
for (int i = 0; i < dt.Rows.Count; i++)
dt.Rows[i]["fg"] = True;

けれども、DataTableの取出しはうまくいったのですが、
残念なことに、Filterを掛けた状態で先のソースを実行すると、
全てのデータにフラグが立てられます。(表示外のデータにも)
やはりεπιστημη さんのご指摘が最善なのでしょうか。



引用返信 編集キー/
■31889 / inTopicNo.11)  Re[8]: BindingSourceでフラグを立てる方法
□投稿者/ 魔界の仮面弁士 (978回)-(2009/01/29(Thu) 18:56:36)
2009/01/29(Thu) 19:07:55 編集(投稿者)
No31888 (たこやき さん) に返信
>     myDS ds = (myDS)myTBLBindingSource.DataSource;
>     DataTable dt = (DataTable)ds.myTBL;
>     for (int i = 0; i < dt.Rows.Count; i++)
>         dt.Rows[i]["fg"] = True;

型付 DataSet をお使いなら、
    myDS ds = (myDS)myTBLBindingSource.DataSource;
    foreach (myDS.myTBLRow row in ds.myTBL)
    {
        row.fg = true;
    }
の方が良いかと。


> 残念なことに、Filterを掛けた状態で先のソースを実行すると、
> 全てのデータにフラグが立てられます。(表示外のデータにも)

Filter は BindingSource 側にかけられているので、それを使わねば始まりません。
(あるいは、同じフィルタを適用した DataView を使うと言う手もありますが…)

元質問のように、for + Position で移動すると、カーソル位置が変わってしまうので、
foreach で列挙するようにします。たとえば、こんな感じ。

    foreach (DataRowView rowView in myTBLBindingSource)
    {
        myDS.myTBLRow row = (myDS.myTBLRow)rowView.Row;
        row.fg = true;
    }

なお、もしも元質問のように Position で移動するのであれば、
最後に BindingSource.EndEdit() を呼ぶようにしてください。
そうしないと、最終行のデータ反映が遅れてしまう可能性があります。


> BindingSource.GetEnumerator()を用いてできないものだろうかと
> 試みてみたのですが、どうもうまく行きません。

    IEnumerator eBS = myTBLBindingSource.GetEnumerator();
    while (eBS.MoveNext())
    {
        myDS.myTBLRow row = (myDS.myTBLRow)((DataRowView)eBS.Current).Row;
        row.fg = true;
    }

引用返信 編集キー/
■31896 / inTopicNo.12)  Re[9]: BindingSourceでフラグを立てる方法
□投稿者/ たこやき (86回)-(2009/01/29(Thu) 19:37:08)
No31889 (魔界の仮面弁士 さん) に返信
ご丁寧に本当にありがとうございます。
どれをとってもたいへんと勉強になりました。

> foreach (myDS.myTBLRow row in ds.myTBL)
> {
> row.fg = true;
> }

> foreach (DataRowView rowView in myTBLBindingSource)
> {
> myDS.myTBLRow row = (myDS.myTBLRow)rowView.Row;
> row.fg = true;
> }

> IEnumerator eBS = myTBLBindingSource.GetEnumerator();
> while (eBS.MoveNext())
> {
> myDS.myTBLRow row = (myDS.myTBLRow)((DataRowView)eBS.Current).Row;
> row.fg = true;
> }

記述例を見せていただいて「あーなるほどな!」って思えますが、
たぶんマニュアルにもそのように書かれているのだろうけど、
なかなか理解ができなくて、あっちへジャンプこっちへジャンプの繰返しです。
オブジェクト指向はすごいなって関心しますが、一つ一つに突き当たります。
本当に貴重な情報ありがとうございました。心より御礼申し上げます。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -