0

同じフォームを使用して、サプライヤー、在庫品目、顧客などの新しいデータと既存のレコードを入力します。編集モードでは、すべてのテキスト ボックスを読み取り専用に設定し、ユーザーが編集するレコードを選択したら、読み取り専用ステータスを false にリセットします。フォームには複数のタブ (または Telerik の PageViewPages) が含まれる場合があり、それぞれに読み取り専用の true/false を設定する必要がある多数の編集可能なコントロールが含まれます。

このコードを使用して、コンテナーの配列を FormControl という名前のクラスに送信します。

RadGroupBox [] containerList = { this.pageGeneral, this.pageBankDetail, this.pageContact };
FormControl.ControlsReadOnly(containerList, false);  // /truefalse to set Read-only status

FormControl クラスには、読み取り専用ステータスを設定する次のコードがあります。

public static void ControlsReadOnly(RadGroupBox [] containerList, bool readOnlyStatus)
    {
       var container = (containerList[0] as RadGroupBox);

        for (int i = 0; i < containerList.Length; i++)
        {
            foreach (var control in container.Controls)
            {
                RadTextBox textEdit = control as RadTextBox;
                if (textEdit != null)
                {
                    textEdit.ReadOnly = readOnlyStatus;
                    continue;
                }

                RadMaskedEditBox textMasked = control as RadMaskedEditBox;
                if (textMasked != null)
                {
                    textMasked.ReadOnly = readOnlyStatus;
                    continue;
                }

                // rest of the code

コードはうまく機能しますが、明らかな欠点は、コンテナが RadGroupBox の場合にのみ機能することです。呼び出し元のフォームでコントロールの種類を変更することにより、同じコードを使用して、フォーム、グループ ボックス、および PageViews を処理したいと考えています。

答えにはリフレクションが関係していると思いますが、解決できません。FormControl メソッドのパラメーター リストを Control [] containerList に置き換えようとしましたが、var 変数を使用できなくなりました。

4

3 に答える 3

1

私は RadBox (Telerik のもの?) に精通していませんが、継承のチェーンをクロールして、最も一般的なクラスを見つけます。つまり、操作したいすべてのコントロールは同じ基本クラスから継承しますか?

ReadOnly プロパティはどこで定義されていますか? RadBox にのみ存在する場合は、うまくいかない可能性があります。ただし、RadBox が継承するものに存在する場合は、代わりにそれらの型のコレクションを受け入れるようにメソッドを定義するだけです。

たとえば、Readonly プロパティを持つ BaseControl クラスがあり、RadBox がそこから継承されている場合は、「BaseControl [] ContainerList」を渡すだけです。最終的に、いつでもオブジェクトを基本型として渡すことができます。

これはあなたが探しているものですか?

于 2013-06-19T12:02:22.803 に答える
0

Here is how I implemented it, and it works great.

 public static void ControlsReadOnly(Control [] containerList, bool readOnlyStatus)
    {
        for (int i = 0; i < containerList.Length; i++)
        {
            foreach (var control in containerList[i].Controls)
            {
                // ignore labels
                if ((control as RadLabel) != null)  
                {
                    continue;
                }

                // other editable controls
                else if ((control as RadTextBox) != null)
                {
                    (control as RadTextBox).ReadOnly = readOnlyStatus;
                    continue;
                }

                else if ((control as RadMaskedEditBox) != null)
                {
                    (control as RadMaskedEditBox).ReadOnly = readOnlyStatus;
                    continue;
                }

                // rest of code

Thanks for your help!

于 2013-06-19T19:08:55.777 に答える