2017-04-25 43 views
3

我在網站上有一個GridView,每行都有不同的控件(例如:textbox,label,dropdownlist)。我需要找到所有文本框並將enabled屬性設置爲false,以便用戶無法編輯它們。我嘗試了下面的代碼,但它沒有工作,'c'從未被識別爲文本框,所以它不會改變屬性。如何查找gridview行中的所有文本框?

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

是的,在文本框的上下文中,只讀允許用戶設置焦點並選擇和複製文本,但不對其進行修改。禁用的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

還有一個選項,如果a是比較容易計算,是在標記直接使用,就像這樣:

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

這在很大程度上取決於的a是如何產生的細節。如果它是頁面類的受保護或公共字段,則上面的代碼應該可以工作。如果它是基於行的計算,你可能需要把它變成保護的方法,並傳遞PARAMS進去:

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

而且還希望把一些更新。 gridview有不同類型的行(頁眉,頁腳,datarow等)

所以爲控制查找做得快一點。

嘗試下面(檢查是否條件)

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; 
      } 
     } 
相關問題