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

Hiroaki Fujii [E-MAIL ADDRESS DELETED]
2010年 10月 8日 (金) 06:56:34 JST


藤井です。

fpさま、ありがとうございます。

少し、補足説明があります。

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

と、書きましたが、このServiceCodeというプロパティにはこのPONOの値を
ユーザコントロールが持つコントロールに割り当て、また取得する実装が
必要になります。

イメージ的には、Gridタイプコントロールみたいな感じでしょうか。

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



(2010/10/08 0:14), fpさんは書きました:
> fpです。
> 
> 藤井さん、こんばんは。
> 
> 1.3.18 でのバインド速度改善のご対応ありがとうございます。
> 
> この 1.3.18 での対応の元発言をしておきながら
> 御礼や検証報告等ができておらず申し訳ありません。
> 
> 実は当方でも uparrowさんの投稿と同時期にこの問題を
> 認識しておりましたが、良い対応方法が見つからず
> 成り行きを見守っていました。
> 
> すぐとはいかないですが検証させて頂きます。
> 
> 
> 
> (2010/10/07 23:14), Hiroaki Fujii wrote:
>> 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 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 メーリングリストの案内