[seasar-dotnet:1809] Re: [S2Container]ユーザコントロール利用時の問題について

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2010年 9月 28日 (火) 06:51:52 JST


藤井です。

ありがとうございます。
どういうイメージなのか、理解できました。

現時点では、Controlが重複してしまうのでダメなままですが、
対応方法を考えてみます。
少し時間をください。

ただ、ユーザコントロールにも手を加える必要が出てくるかも
しれませんが、そのときは相談させていただきます。


(2010/09/27 9:45), [E-MAIL ADDRESS DELETED]さんは書きました:
> uparrow	です。
> 
> 藤井 様
> ご連絡いただき、ありがとうございます。
> 
>> というわけなので、回避するにはコントロール名が重複しないようにすること
>> なのですが、ユーザコントロールを利用するときにはそうはいかないですよね?
> フォーム内に同じユーザコントロールを3つ4つ使用する画面がたくさんあるので
> それぞれ、ユーザコントロールを作成し、ユーザコントロール内のコントロール名を
> 別にするというのはちょっと厳しいです。
> 
>> どう対応するか色々考えていたのですが、個人的にはユーザコントロールを利用
>> してS2Formをつかったことがなく、そもそもどういうPONOクラスを作れば、
>> S2Formにバインドできるのか、すいませんが、よくわかっていないのです。
> 今行っている方法が良いか悪いかわからないのですが、次のようにしています。
> 
> txtServiceCode 、 txtServiceName
> のテキストボックスコントロールを持つユーザコントロール
> controlService1,controlService2
> がフォームに存在する場合、バインドするPONOのクラスは
> 
> public string ServiceCode1 { get; set; }
> public string ServiceCode2 { get; set; }
> 
> としており、Control属性に以下を記載しております。
> [Control("controlService1", "ServiceCode", "ServiceCode1")]
> [Control("controlService2", "ServiceCode", "ServiceCode2")]
> 
> ユーザコントロール内のtxtServiceCode、txtServiceNameとバインドするように
> PONOを作ればいいのでしょうが、複数controlServiceがあると
> おかしな挙動をしてしまうので、
> ユーザコントロールのプロパティとバインドするようにしました。
> 
> このユーザコントロールでは、ServiceCodeの値をtxtServiceCodeに設定し
> 対応する名称をtxtServiceNameに設定する等の処理を行っています。
> 
> したがって、ControlModifier属性を使ってしまうと、ユーザコントロール内部の
> テキストボックスもバインドされてしまうので、恥ずかしながら、全てのバインドする
> コントロールをControl属性で指定しております。
> 
> 現在開発中のプロジェクトでは、1.3.17を使っており、テストフェーズに入ったので
> このバージョンを使おうと思うのですが、一部、コントロール数が多く
> S2Formでのバインドを利用していない箇所があります。
> 次の案件では1.3.18をできれば使いたいと考えており、このような質問に至っております。
> 
> ユーザコントロールを用いる場合にバインドするいい方法がわかると助かります。
> 
> よろしくお願いいたします。
> 
>> コミッタの藤井です。
>>
>> 返事が遅くなって申し訳ありません。
>>
>> ご指摘通り、同一名のコントロールを複数登録しようとすると、エラーに
>> なります。
>> これはDictionaryにコントロールを保持しておいて、再度バインドするときに
>> 再びコントロールを探しに行くのを防ぐためです。
>> そのDictinaryのキーがコントロール名です。
>> というわけなので、回避するにはコントロール名が重複しないようにすること
>> なのですが、ユーザコントロールを利用するときにはそうはいかないですよね?
>>
>> どう対応するか色々考えていたのですが、個人的にはユーザコントロールを利用
>> してS2Formをつかったことがなく、そもそもどういうPONOクラスを作れば、
>> S2Formにバインドできるのか、すいませんが、よくわかっていないのです。
>>
>> よろしければ教えていただけないでしょうか?
>>
>>
>> (2010/09/23 10:11), [E-MAIL ADDRESS DELETED]さんは書きました:
>>> uparrowと申します。
>>>
>>> いままで、S2Container.NET 1.3.17を利用しておりました。
>>> たくさんのコントロールを利用しているフォームがあったため、速度改善のため
>>> 1.3.18で動作の検証を行ってみました。
>>>
>>> そうしたところ、実行時に以下のような例外が発生し
>>> そのままでは正しく動作しませんでした。
>>>
>>> System.ArgumentException: 同一のキーを含む項目が既に追加されています。
>>>      場所 System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
>>>      場所 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
>>>      場所 System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
>>>      場所 Seasar.Windows.S2Form._GetAllControls(Control controls, IDictionary`2 table)
>>>      場所 Seasar.Windows.S2Form._GetAllControls(Control controls, IDictionary`2 table)
>>>      場所 Seasar.Windows.S2Form._SetDataToControls()
>>>      場所 Seasar.Windows.S2Form.set_DataSource(Object value)
>>> ......
>>>
>>> どうやら同一のユーザコントロールを複数使用している場合このエラーが発生するようでした。
>>>
>>> コードと名称をユーザコントロールに貼り付け、このコントロールを
>>> 同一フォームに2つ以上貼り付けている箇所がいくつかあります。
>>> 例えば、txtServiceCode と txtServiceName のテキストボックスを
>>> ユーザコントロールServiceControlとして作成しておき、
>>> フォームにserviceControl1とserviceControl2の同じユーザコントロールを複数貼る場合です。
>>>
>>> このような場合はどのように対応するのが良いのでしょうか。
>>> ユーザコントロールを使わず、フォームにコントロールを直接置けば
>>> 何も問題ないのですが、いろいろとユーザコントロールに作り込んでいるので、
>>> できれば、ユーザコントロールを利用して対応可能な方法があればよいなと思います。
>>>
>>> よろしくお願いいたします。
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 
> 
> 
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 



seasar-dotnet メーリングリストの案内