1

すべてのテキストボックスの読み取り専用を設定する方法を誰でも提案できますか? 再帰関数を使用してみましたが、 ReadOnlySystem.Web.UI.Controlにはそのような定義がないと表示されます

    private void SetReadOnly<T>(Control parent, bool isReadOnly)
{
    foreach (Control ctrl in parent.Controls)
    {
        if (ctrl is T)
            ctrl.ReadOnly = isReadOnly;   // this line here wont work .
        SetReadOnly<T>(ctrl, isReadOnly);
    }
}

代替案をお願いします!!

4

2 に答える 2

1

コードの問題は、すべての型がプロパティを持つわけではなく、任意のT型になる可能性があることです。したがって、コンパイラはチョークします。ReadOnly

これを行うためにジェネリックを使用する必要はありません。

private void SetReadOnly(Control parent, bool readOnly)
{
  // Get all TextBoxes and set the value of the ReadOnly property.
  foreach (var tb in parent.Controls.OfType<TextBox>())
    tb.ReadOnly = readOnly;

  // Recurse through all Controls
  foreach(Control c in parent.Controls)
    SetReadOnly(c, readOnly);
}

ただし、ジェネリックを使用したい場合は、次のようにできます。

private void SetReadOnly<T>(Control parent, bool readOnly) where T : TextBox
{
  // Get all TextBoxes and set the value of the ReadOnly property.
  foreach (var tb in parent.Controls.OfType<T>())
    tb.ReadOnly = readOnly;

  // Recurse through all Controls
  foreach(Control c in parent.Controls)
    SetReadOnly<T>(c, readOnly);
}

これにより、ジェネリック型TextBoxまたはその派生クラスが制約されます。これにより、プロパティが常にそこにあることが保証されReadOnly、コンパイラはこれを認識します。

于 2012-09-30T11:29:04.420 に答える
0

jQuery を使用して、クライアント側でこれを設定できます。

 $(document).ready(function() {
   $('input[type=text]').attr('readonly', true);
 });
于 2012-09-30T10:57:41.973 に答える