2017-04-25 11 views
3

私は、各行に異なるコントロールを持つWebサイト上にGridViewを持っています(例:テキストボックス、ラベル、ドロップダウンリスト)。すべてのテキストボックスを見つけてenabledプロパティをfalseに設定する必要があるため、ユーザーはそれらを編集できません。私は以下のコードを試しましたが、うまくいきません。 'c'はテキストボックスとして認識されないので、プロパティを変更することはありません。グリッドビューの行にあるすべてのテキストボックスを見つける方法は?

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (a) 
    { 
     foreach (Control c in e.Row.Controls) 
     { 
      if (c is TextBox) 
      { 
       ((TextBox)(c)).Enabled = false; 
      } 
     } 
    } 
} 
+0

を試してみてください? – Andrei

+0

すべてのテキストボックスがデフォルトで有効になっている必要があります。後で 'a'が真の場合、無効にする必要があります。 – Adam

+0

'a'とは何ですか? – Wanderer

答えて

2

私はあなたがこのように試してみてくださいと思う:

TextBox tb = e.Row.FindControl("textbox_name") as TextBox; 
tb.Enabled = false; 
+1

ありがとうございます、それは正常に動作します。私はちょうど見つかった、それは私のためにreadonlyプロパティを有効にする代わりに使用する方が良いです。 – Adam

+1

はい、テキストボックスのコンテキストでは、readonlyを使用すると、ユーザーはフォーカスを設定してテキストを選択してコピーできますが、変更はできません。無効になっているTextBoxでは、何も操作できません。 [MSDN](https://social.msdn.microsoft.com/Forums/en-US/e3999a28-9923-457f-b52a-96c91059e455/readonly-vs-enabled?forum=Vsexpressvcs) –

+1

情報ありがとうございます! – Adam

1

テキストボックスは、他のコントロール内に入れ子にする必要があります。だからこそ、直ちに子どもたちに反復することはできません。

テキストボックスのIDのリストを持っている場合は、あなたがにFindControlを使用する必要があります。

((TextBox)e.Row.FindControl("TextBoxID")).Enabled = false; 

そうしないと、再帰的に必要な種類のあなたのコントロールを見つける必要があります。コードサンプルはthis threadを参照してください。

<asp:TextBox ... Enabled='<%# a %>' /> 

これはaを導出する方法の詳細に多くを依存しますaを計算することは比較的容易である場合

もう一つの選択肢は、そうのように、直接マークアップで使用することです。それがページクラスの保護されたフィールドまたはパブリックフィールドの場合は、上記のコードだけで動作します。それは、行に基づいて計算されている場合は、保護されたメソッドにそれを回すと、それにのparamsを渡す必要があります。

Enabled='<%# GetEnabled(Eval("Prop1"), Eval("Prop2")) %>' 
1

をも入れたいですいくつかの更新。 グリッドビュー(ヘッダー、フッター、データローなど)にはさまざまな種類の行がありますが、コントロール検索では少し速くするために、

です。

は(もし条件をご確認ください)以下のマークアップでそれらを無効にすると間違って何

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       //Find the TextBox control. 
       TextBox txtName = (e.Row.FindControl("txtName") as TextBox); 
       txtName.Enabled = false; 

       //or 
       TextBox txtName1 = (TextBox)e.Row.FindControl("txtName"); 
       txtName1.Enabled = false; 
      } 
     } 
関連する問題