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

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

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

Re[10]: DataTableについて


(過去ログ 81 を表示中)

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

■47727 / inTopicNo.1)  DataTableについて
  
□投稿者/ ビギナー (1回)-(2010/03/12(Fri) 11:38:35)

分類:[.NET 全般] 

フォームにテキストボックスを配置したとします。
そのテキストボックスにデータテーブルの行をバインドします。

ユーザーがそのテキストボックスの内容を変更すると、データテーブルの内容も変更されると思いますが、
これをボタン押下でデータテーブルが変更される、もしくはデータテーブルを変更をさせない方法はありますか?
引用返信 編集キー/
■47728 / inTopicNo.2)  Re[1]: DataTableについて
□投稿者/ Hongliang (565回)-(2010/03/12(Fri) 12:03:05)
バインディングをデザイナで行っているなら、詳細バインドダイアログで「データソース更新モード」を Never に設定して下さい。
コードでバインディングを行っているなら、DataBindings に Add する引数、または Binding を作成する際の引数で DataSourceUpdateMode.Never を指定します。

なお、このようにしたバインディングで、コントロールのプロパティをデータソースに反映させる場合、コントロール.DataBindings[プロパティ名] で取得できる Binding オブジェクトの WriteValue メソッドを使用します。
引用返信 編集キー/
■47777 / inTopicNo.3)  Re[2]: DataTableについて
□投稿者/ ビギナー (2回)-(2010/03/15(Mon) 09:58:01)
No47728 (Hongliang さん) に返信
> バインディングをデザイナで行っているなら、詳細バインドダイアログで「データソース更新モード」を Never に設定して下さい。
> コードでバインディングを行っているなら、DataBindings に Add する引数、または Binding を作成する際の引数で DataSourceUpdateMode.Never を指定します。
>
> なお、このようにしたバインディングで、コントロールのプロパティをデータソースに反映させる場合、コントロール.DataBindings[プロパティ名] で取得できる Binding オブジェクトの WriteValue メソッドを使用します。

大変ご返信が遅くなり申し訳ありません。
ありがとうございます。

バインドと書いてしまいしたがDataSourceでした。
Lst_Items.DataSource = ItemDt

このような場合、何か方法はありますでしょうか?
お手数おかけしまして申し訳ありません。
引用返信 編集キー/
■47780 / inTopicNo.4)  Re[3]: DataTableについて
□投稿者/ Hongliang (568回)-(2010/03/15(Mon) 11:15:21)
で、具体的には何のコントロールでしょう?
ListBox なら選択できるだけでデータソースの変更(更新)はできないと思いますが。
引用返信 編集キー/
■47784 / inTopicNo.5)  Re[4]: DataTableについて
□投稿者/ ビギナー (3回)-(2010/03/15(Mon) 11:56:14)
No47780 (Hongliang さん) に返信
> で、具体的には何のコントロールでしょう?
> ListBox なら選択できるだけでデータソースの変更(更新)はできないと思いますが。

言葉足らずで大変恐縮です。

ListBoxです。

ListBoxにDataTableをDataSourceとし、さらにTextBoxに同じDataTableの行をDataBindingしています。
TextBoxの内容を変更すると、その後ListBoxにフォーカスが当たった際にListBoxの内容が更新されます。

Dim Dt as New DataTable
Dt.Columns.Add("Col_Hoge",GetType(String))
Lst_ListBox.DataSource = Dt
Txt_TextBox.DataBindings.Add("Text",Dt,"Col_Hoge")

これをButtonを配置し、そのボタン押下で更新されるようにしたいと思っております。

引用返信 編集キー/
■47786 / inTopicNo.6)  Re[5]: DataTableについて
□投稿者/ Hongliang (569回)-(2010/03/15(Mon) 12:18:22)
それなら私の初めの投稿で解決できると思いますが。
引用返信 編集キー/
■47788 / inTopicNo.7)  Re[6]: DataTableについて
□投稿者/ ビギナー (4回)-(2010/03/15(Mon) 13:07:44)
No47786 (Hongliang さん) に返信
> それなら私の初めの投稿で解決できると思いますが。

ListBoxにDataBindingするときってどうしたらいいんでしょうか?

Lst_ListBox.DataBindings.Add(※1, Dt, ※2)

※1…Itemsにしたら読み取り専用とエラー。Textにしたらブランク列が1列できたのみ。
※2…DataSourceでValueMemberにしている列?


引用返信 編集キー/
■47794 / inTopicNo.8)  Re[7]: DataTableについて
□投稿者/ Hongliang (570回)-(2010/03/15(Mon) 13:50:28)
いや、そうじゃなくて、TextBox の方で。

んー、ひょっとしてこういう動作をお望みなのでしょうか?
・TextBox で書き換えたのはそのまま DataTable に反映させる。
・ListBox は DataTable の変更をその場では無視する。必要なときだけ書き換える。
直感に反する仕様だと思いますが、もしこうしたいのならいくらか複雑になります。

一つ思いついたのは、以下のような仕様です。
まずデータソースとして BindingSource を二つ用意します。
一つは汎用のデータソースとして TextBox 等のデータソースに使用します。
もう一つは変更を遅延させるための、ListBox 専用(じゃなくてもいいけど)のデータソースとして使用します。
(以下、前者を generalSource、後者を delaySource と呼ぶ)
二つの BindingSource の DataSource になるのはもちろん DataTable です。
// BindingSource はコントロールとデータソースの間に入って現在位置の共有などをするためのクラスです。
delaySource はデータソースの変更を無視するよう、RaiseListChangedEvents プロパティを false にしておきます。これで generalSource を通じて元のデータテーブルを書き換えても、delaySource はコントロールにデータの再取得を促さなくなります。
このままでは delaySource と generalSource の現在位置がずれる(ListBox の選択項目を変更しても generalSource が自動的にはその選択項目のものにならない)ので、delaySource の CurrentChanged イベントで generalSource.Position を delaySource.Position になるようにします(逆方向は必要に応じて)。
ListBox を更新させる場合、一旦 RaiseListChangedEvents プロパティを true にして更新を可能にし、その上で ResetBindings メソッドを使って明示的に更新を行います。
引用返信 編集キー/
■47797 / inTopicNo.9)  Re[8]: DataTableについて
□投稿者/ ビギナー (5回)-(2010/03/15(Mon) 14:34:31)
ありがとうございます。

TextBoxのDataSourceUodateMode = Neverでうまくいきました。

もう一点教えていただきたいのですが、

Button押下でWriteValueするようにしましたが、変更後ListBoxのSelectedIndexが変わらないとDataTableの内容がListBoxに反映されません。
これを変更後すぐさま反映させることは可能でしょうか?

たびたび申し訳ありません。
引用返信 編集キー/
■47798 / inTopicNo.10)  Re[9]: DataTableについて
□投稿者/ Hongliang (571回)-(2010/03/15(Mon) 15:05:00)
・手抜きとしては一旦 DataSource を Nothing にしてからもう一度設定し直す。DisplayMember などが狂うかも。
・真面目にやるなら ListBox の BindingContext から元のデータソースに該当する BindingManagerBase を取得して CurrencyManager に DirectCast し、それの Refresh を呼び出す。
・ちょっと方法を変えるなら直接 DataTable をバインディングするのではなく BindingSource を間に挟み、これの ResetBindings を使う。
などが考えられます。
引用返信 編集キー/
■47840 / inTopicNo.11)  Re[10]: DataTableについて
□投稿者/ ビギナー (6回)-(2010/03/16(Tue) 12:03:47)
No47798 (Hongliang さん) に返信
> ・手抜きとしては一旦 DataSource を Nothing にしてからもう一度設定し直す。DisplayMember などが狂うかも。
> ・真面目にやるなら ListBox の BindingContext から元のデータソースに該当する BindingManagerBase を取得して CurrencyManager に DirectCast し、それの Refresh を呼び出す。
> ・ちょっと方法を変えるなら直接 DataTable をバインディングするのではなく BindingSource を間に挟み、これの ResetBindings を使う。
> などが考えられます。

ありがとうございます。
TextBoxのDataSourceUpdateMode.Never で解決しました。

お手数をおかけしました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -