如何在gridview行中查找所有文本框?

时间:2017-04-25 09:07:07

标签: c# asp.net gridview webforms controls

我在网站上有一个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;
            }
        }
    }
}

4 个答案:

答案 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;
           }
     }
}