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

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

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

Re[4]: BindingSource_AddingNewを教えて下さい


(過去ログ 46 を表示中)

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

■25104 / inTopicNo.1)  BindingSource_AddingNewを教えて下さい
  
□投稿者/ たこやき (22回)-(2008/09/15(Mon) 17:28:36)

分類:[C#] 

たずねるばかりで申し訳ないのですが、
レコードの追加時に初期値を設定しようと思うのですが、うまくいきません。
どこがいけないのでしょうか。ご指導ください。

先に次のようにレコードを抽出しています。

void レコード抽出()
{
var aa =
from p in myDataSet.TBL
where p.FLD.Length < 3
select p;

myBindingSource.DataSource = aa.AsDataView();
}

その後、BindingSourceのAddingNewイベントで初期値を設定しようとしているのですが、
e.NewObject行でエラーが発生します。
「BindingSource の一覧に追加されるオブジェクトは、同一の型でなければなりません。」と。
参考例が見つからなくて、どうすればいいのかわかりません。お願いします。

private void myBindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
DataRow dr = myDataSet.TBL.NewRow();
dr["列1"] = "山田";
dr["列2"] = "太郎";

e.NewObject = (myDataSet.TBLRow)dr;   <-- エラー発生
}
引用返信 編集キー/
■25111 / inTopicNo.2)  Re[1]: BindingSource_AddingNewを教えて下さい
□投稿者/ カドルドエグ (24回)-(2008/09/15(Mon) 18:25:38)
No25104 (たこやき さん) に返信
> たずねるばかりで申し訳ないのですが、
> レコードの追加時に初期値を設定しようと思うのですが、うまくいきません。
> どこがいけないのでしょうか。ご指導ください。
> 
> 先に次のようにレコードを抽出しています。
> 
>         void レコード抽出()
>         {
>             var aa =
>                from p in myDataSet.TBL
>                where p.FLD.Length < 3
>                select p;
> 
>             myBindingSource.DataSource = aa.AsDataView();
>         }
> 
> その後、BindingSourceのAddingNewイベントで初期値を設定しようとしているのですが、
> e.NewObject行でエラーが発生します。
> 「BindingSource の一覧に追加されるオブジェクトは、同一の型でなければなりません。」と。
> 参考例が見つからなくて、どうすればいいのかわかりません。お願いします。
> 
>         private void myBindingSource_AddingNew(object sender, AddingNewEventArgs e)
>         {
>             DataRow dr = myDataSet.TBL.NewRow();
>             dr["列1"] = "山田";
>             dr["列2"] = "太郎";
> 
>             e.NewObject = (myDataSet.TBLRow)dr;   <-- エラー発生
>         }


BindingSource.AddingNew イベント
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.bindingsource.addingnew(VS.80).aspx

エラーおよび上記のヘルプのとおり、
「リストに格納されている型と同じ型であることが必要」なのです。
そして、
「DataView または DataTable にバインドされている場合は、新しい DataRowView をリストに追加できないため、NewObject プロパティを設定することはできません。」
ともあります。
因みに、バインドされているLINQの結果はDataViewの拡張型にあたります。

なのでそのままLINQを使用したい場合は、
「myDataSet.TBLRow型」ではなく、myDataSet.TBLのDataViewを
e.NewObjectに代入するとよいと思います。

---- イメージコード ----
※テスト用に右のグローバル変数を前提→private DataSet1 myDataSet = new DataSet1();
※DataSet1にはTBLというテーブルがある
※TBLには「C1」「C2」「FLD」という列がある

private void bindingSource1_AddingNew(object sender, AddingNewEventArgs e)
{
  DataSet1.TBLRow row = myDataSet.TBL.NewTBLRow();
  row.C1 = "yamada";
  row.C2 = "tarou";
  row.FLD = "TEST";

  myDataSet.TBL.AddTBLRow(row);
  DataView view = new DataView(myDataSet.TBL);
  e.NewObject = view;
}

引用返信 編集キー/
■25118 / inTopicNo.3)  Re[2]: BindingSource_AddingNewを教えて下さい
□投稿者/ ロック (94回)-(2008/09/15(Mon) 19:48:47)
初期値のニュアンスにもよりますが
単純にDefaultValueプロパティへの設定ではダメですか?

http://msdn.microsoft.com/ja-jp/library/system.data.datacolumn.defaultvalue.aspx


引用返信 編集キー/
■25147 / inTopicNo.4)  Re[3]: BindingSource_AddingNewを教えて下さい
□投稿者/ たこやき (23回)-(2008/09/16(Tue) 11:54:15)
カドルドエグさん、ロックさん、ご返信ありがとうございます。

> 単純にDefaultValueプロパティへの設定ではダメですか?
ほとんどはいいのですが、計算値や入力者のIDをセットしたいので、だめかな〜と。

カドルドエグさんご丁寧にありがとうございます。
ド素人で注意力散漫の私では到底たどりつけない内容でした。
おかげで大成功しました。

カドルドエグさん、ロックさん、ありがとうございました。


解決済み
引用返信 編集キー/
■25164 / inTopicNo.5)  Re[4]: BindingSource_AddingNewを教えて下さい
□投稿者/ たこやき (24回)-(2008/09/16(Tue) 14:31:45)
改良しました。
レコード抽出状態でも行えるように。

private void myBindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
DataView dv = (DataView)myBindingSource.DataSource;
DataRowView dr = dv.AddNew();
dr["列1"] = "aaa";
dr["列2"] = "bbb";
e.NewObject = dv;
雑録BindingSource.MoveLast();
}
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -