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

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2010年 10月 7日 (木) 23:14:42 JST


uparrow さま

藤井です。

遅くなってすいません。

ユーザコントロールを対応させてみました。

まだ正式リリースではないので、SVNからソースを取得してビルドを
お願いします。

注意事項として次の点があります。
・ユーザコントロールの中にはバインドしていない。
・ユーザコントロールの内容のPONOを用意する必要がある。

頂いた例を用いますと、まず、ユーザコントロールの

>> txtServiceCode 、 txtServiceName

に対応したPONOを別に用意してください。

次に、このPONOをセットするプロパティをユーザコントロールに作成します。
つまり、このPONOの型を持っているServiceCodeというプロパティをユーザ
コントロールに作ります。

次に、作成したS2Formの継承フォームに
>> [Control("controlService1", "ServiceCode", "ServiceCode1")]
>> [Control("controlService2", "ServiceCode", "ServiceCode2")]
を宣言してください。

次に、S2FormにバインドするPONOにServiceCode1とServiceCode2の
プロパティを用意しますが、このプロパティの型は最初に用意した
ユーザコントロールにセットするPONOになります。

以上の手順になります。
少し、イメージと違っているかもしれませんが、私なりのご返事と
させていただきました。
また、サードパーティ製のツールなどを使った環境では試せてません。

まだ、ドキュメントができていないので、よくわからないときは
質問してください。
また、ご自身の環境で不具合があれば、不具合内容を報告いただけると
助かります。

他の皆様にも、不具合があれば、ご報告いただけると非常に助かります。

よろしくお願いいたします。



(2010/09/28 6:51), Hiroaki Fujiiさんは書きました:
> 藤井です。
> 
> ありがとうございます。
> どういうイメージなのか、理解できました。
> 
> 現時点では、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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 



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