我在网站上有一个GridView,每行都有不同的控件(例如:textbox,label,dropdownlist)。我需要找到所有文本框并将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 :(得分:3)
我认为你应该这样试试:
TextBox tb = e.Row.FindControl("textbox_name") as TextBox;
tb.Enabled = false;
答案 1 :(得分: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")) %>'
答案 2 :(得分:1)
并且还希望进行一些更新。 gridview中有不同类型的行(页眉,页脚,数据行等)
所以为了让控制找到更快一点。
尝试以下(检查if条件)
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;
}
}
答案 3 :(得分:0)
您应该在单元格内而不是在Row内搜索控件。
foreach (TableCell cell in e.Row.Cells)
{
foreach (Control c in cell.Controls)
{
if (c is TextBox)
{
((TextBox)(c)).Enabled = false;
}
}
}